将 vue3 项目打包后部署在 springboot 项目运行

server/2025/1/10 21:52:13/

目录

前端vite打包

vite 打包路径配置

打包命令(可选)

执行打包

后端springboot配置

静态资源路径配置(可选)

thymeleaf依赖

转移打包文件

请求返回html文件

启动项目

可能遇到的问题

页面一刷新就404

页面空白

页面没有数据

前端vite打包

vite 打包路径配置

在 vite.config.js(.ts) 设置开发或生产环境服务的公共基础路径(base配置项),这里不使用相对路径

// vite.config.ts
export default defineConfig({plugins: [vue()],base:'/', // 设置项目的基础路径resolve:{alias: [{find: '@',replacement: path.resolve(__dirname, 'src')}]},server: {host: '0.0.0.0',proxy: {'/api': {target: 'http://localhost:8080', // 设置代理目标changeOrigin: true,rewrite: (path) => path.replace(/^/api/, '')}}}})

打包命令(可选)

如果是 TS 项目,可以在打包命令后加上 --noEmit,防止打包后生成大量 map 文件。

// package.json
"scripts": {"dev": "vite --open","build": "vue-tsc --noEmit && vite build","preview": "vite preview"}

执行打包

执行 vscode 左下角配置好的 build 脚本

打包后在根目录下可以看到生成的 dist 文件

后端springboot配置

静态资源路径配置(可选)

在 application.yml(.properties) 中配置 Web 静态资源路径,指定为 static

spring:web:resources:static-locations: classpath:/static/

thymeleaf依赖

在 pom.xml 中加入 thymeleaf 模板的依赖并刷新 maven

// pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

转移打包文件

将前端打包好的dist文件夹中的内容复制到后端的 resource/static 中,新建 resource/templates 文件夹,将 index.html 放入 templates 中

请求返回html文件

新建一个控制器类,直接访问本地8080端口时返回 index.html。由于项目中有 thymeleaf 模板依赖,“index” 就是 template 中的 index.html

// BasicController.java
@Controller
public class BasicController {// http://127.0.0.1:8080/@RequestMapping("/")public String html(){return "index";}}

如果前端项目的 vue-router 使用的是历史模式(如下图)

历史模式

服务端需要增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个index.html页面,这个页面就是你 app 依赖的页面。

// BasicController.java
@Controller
public class BasicController {// http://127.0.0.1:8080/@RequestMapping("/")public String html(){return "index";}// 捕获所有未匹配路径并重定向到 index.html@GetMapping("/**/{path:[^\.]*}") // 不匹配带"."的路径(如 .js/.css 等静态资源)public String redirect() {return "forward:/";}
}

启动项目

启动 springboot 项目,浏览器地址栏输入http://127.0.0.1:8080回车可以看到前端页面

可能遇到的问题

页面一刷新就404

检查前端的 vue-router 使用历史模式还是哈希模式,历史模式(HTML5 模式)需要后端额外配置,配置参考上文。
不同的历史模式 | Vue Router[这里是图片006]https://router.vuejs.org/zh/guide/essentials/history-mode.html

页面空白

可能是 js 和 css 文件没有引入成功,查看 f12 网络

检查 index.html ,查看 script 和 link 标签的地址,应该是绝对路径(不含./)

页面没有数据

查看 f12 网络,检查请求路径有没有错误,是否存在跨域问题。检查后端有没有配置请求拦截器或者spring security进行排除。


http://www.ppmy.cn/server/157297.html

相关文章

Android中Activity

一、AndroidManifest中的<activity>标签 <activity>标签在AndroidManifest.xml文件中用于定义和配置应用中的每一个Activity。Activity是Android应用的基本构建块之一&#xff0c;主要负责展示用户界面&#xff0c;并处理用户与之的交互。每个在应用中显示给用户的…

解决报错net.sf.jsqlparser.statement.select.SelectBody

在我们项目集成mybatis-plus时,总会遇到奇奇怪怪的报错,比如说下面的这个报错 而这个报错,是告诉我们的分页依赖冲突,要加个jsqlparser依赖来解决这个冲突,也相当于平衡,但是可能因为我们版本的不匹配,还是会报错,例如下面这样 但是我们是不知道到底是什么依赖冲突的,这个时候就…

14:00面试,15:00就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到2月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

人生第一次面试之依托答辩

今天收到人生的第一场面试&#xff0c;是东华软件集团。答的那是依托答辩&#xff0c;就面了20分钟&#xff0c;还没考算法。其实依托答辩的效果是意料之中的&#xff0c;这次面试也只是想练练手。 目录 静态变量什么时候加载的&#xff1f; 重写和重载有什么区别&#xff1…

配置graspness虚拟环境

配置graspness虚拟环境并复现 通过conda建立虚拟环境安装MinkowskiEngine(ME)配置cuda安装nvcc等工具ME版本下载0.5.4版本的!!!安装pointnet2、knn把GraspNet-1Billion数据集下载并按着官方format排版(数据集总共大概100G)并训练模型通过conda建立虚拟环境 graspness工…

何为“正则表达式”!

详细解释&#xff1a; ^&#xff1a;在JSON的正则表达式中&#xff0c;^表示匹配输入字符串的开始位置。这意味着正则表达式将从字符串的开头开始进行匹配&#xff0c;确保整个字符串符合后续的模式要求。例如&#xff0c;对于字符串"3.14"&#xff0c;正则表达式会…

【Notepad++】Notepad++如何删除包含某个字符串所在的行

Notepad如何删除包含某个字符串所在的行 一&#xff0c;简介二&#xff0c;操作方法三&#xff0c;总结 一&#xff0c;简介 在使用beyoundcompare软件进行对比的时候&#xff0c;常常会出现一些无关紧要的地方&#xff0c;且所在行的内容是变化的&#xff0c;不方便进行比较&…

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式&#xff0c;又称贝叶斯定理、贝叶斯法则&#xff0c;最初是用来描述两个事件的条件概率间的关系的公式&#xff0c;后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是&#xff0c;支持某项属性的事件发生得愈多&#xff0c;则该属性成…