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

目录

前端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进行排除。

<think>我们正在处理将Vue3项目打包部署SpringBoot项目中的需求。根据引用内容,有几种部署方式:生成war包通过Tomcat运行,或者生成jar包直接运行。此外,引用[4]提到了使用Nginx部署后端分离的项目,但用户明确要求将Vue3项目打包部署SpringBoot中,因此我们主要关注将Vue3构建的静态资源整合到SpringBoot项目中。步骤概述:1.构建Vue3项目,生成静态资源文件(dist目录)2.将dist目录下的文件复制到SpringBoot项目的资源目录(通常是src/main/resources/static)3.配置SpringBoot项目,确保能够正确提供静态资源4.打包SpringBoot项目(jar或war)5.部署运行详细步骤:步骤1:构建Vue3项目Vue3项目根目录下执行构建命令(假设使用Vite):```bashnpmrunbuild```构建完成后,会在项目根目录生成`dist`目录,里面包含静态文件(index.html,js,css,图片等)。步骤2:将静态资源复制到SpringBoot项目Vue3项目dist目录下的所有文件复制到SpringBoot项目的`src/main/resources/static`目录下(如果没有static目录,则创建)。步骤3:配置SpringBoot项目确保SpringBoot项目能够正确提供静态资源。SpringBoot默认会从`classpath:/static`、`classpath:/public`等目录提供静态资源。如果使用war包部署并需要继承`SpringBootServletInitializer`,则按照引用[1][^1]和引用[2][^2]的方式,创建一个类继承`SpringBootServletInitializer`并覆盖`configure`方法。例如,在SpringBoot项目中创建`ServletInitializer`类:```javapackagecom.example.demo;//替换为你的包名importorg.springframework.boot.builder.SpringApplicationBuilder;importorg.springframework.boot.web.servlet.support.SpringBootServletInitializer;publicclassServletInitializerextendsSpringBootServletInitializer{@OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilderapplication){returnapplication.sources(DemoApplication.class);//替换为你的SpringBoot主启动类}}```步骤4:打包SpringBoot项目4.1如果打包为jar包,在pom.xml中添加spring-boot-maven-plugin插件(如引用[3][^3]):```xml<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>```然后在项目根目录下执行Maven命令:```bashmvncleanpackage```生成的jar包位于target目录下。4.2如果打包为war包,需要修改pom.xml中的打包方式:```xml<packaging>war</packaging>```并确保有servlet相关的依赖(如果使用内嵌Tomcat,需要将Tomcat作用域设置为provided):```xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>```然后同样执行`mvncleanpackage`,生成war包。步骤5:部署运行-jar包:使用`java-jaryour-application.jar`运行。-war包:将war包放入Tomcat的webapps目录下,启动Tomcat即可。注意事项:1.确保Vue3项目中的路由模式与SpringBoot的静态资源服务兼容。如果使用history模式,需要在SpringBoot中配置一个全局的URL重写,将所有的前端路由请求都转发到index.html。这可以通过添加一个SpringBoot的控制器来实现:```java@ControllerpublicclassFrontendController{@RequestMapping(value="/{path:[^\\.]*}")publicStringredirect(){return"forward:/index.html";}}```或者使用配置方式(实现WebMvcConfigurer)添加ViewController。2.如果Vue3项目中有调用后端API的请求,在开发环境下通常配置了代理(proxy),但在生产环境中,需要确保请求的URL指向正确的后端地址。可以在Vue3项目的构建前设置环境变量,或者构建后修改静态文件中的配置(如果支持)。另一种方式是在SpringBoot中提供API接口,这样前后端同源,就不会有跨域问题。3.如果使用前后端分离部署(即Vue3项目单独部署在Nginx等服务器上,SpringBoot只提供API),则不需要将静态资源放入SpringBoot项目中。但根据用户需求,我们是将静态资源整合到SpringBoot中。4.引用[4][^4]提到了使用Nginx部署,但用户要求的是部署SpringBoot中,因此我们不考虑Nginx。总结:将Vue3构建的静态资源放入SpringBoot的static目录,然后打包SpringBoot项目,即可将Vue3项目整合到SpringBoot运行。下面我们通过一个简单的示例来演示:示例步骤:1.在Vue3项目(假设项目名为my-vue-app)中运行`npmrunbuild`,生成dist目录。2.将dist目录下的所有文件复制到SpringBoot项目(假设项目名为my-spring-boot)的`src/main/resources/static`目录。3.在SpringBoot项目中,如果使用history路由,添加一个控制器来处理前端路由(如上所述)。4.打包SpringBoot项目(jar或war)。5.运行jar包或部署war包到Tomcat。这样就完成了Vue3项目SpringBoot中的部署。相关问题:1.如何解决Vue3项目部署SpringBoot后的路由404问题?2.如何配置Vue3项目的生产环境API请求地址?3.如何优化SpringBoot打包后的静态资源加载速度?4.如何实现SpringBoot项目Vue3项目的热部署或快速迭代?</think># Vue3项目打包部署SpringBoot的详细步骤 下面是将Vue3项目打包并集成到SpringBoot应用的完整流程,包含两种部署方式:jar包部署和war包部署。 ## 一、Vue3项目打包步骤 ### 1. 配置生产环境API地址 在Vue3项目的`.env.production`文件中配置后端API地址: ```ini VITE_API_BASE_URL=/api ``` ### 2. 构建Vue3项目 ```bash npm run build ``` 构建完成后会在项目根目录生成`dist`目录,包含静态资源文件 ## 二、SpringBoot项目配置 ### 1. 创建SpringBoot项目结构 ``` src/ ├── main/ │ ├── java/ │ ├── resources/ │ │ ├── static/ # 存放Vue3构建结果 │ │ └── templates/ └── pom.xml ``` ### 2. 复制Vue3构建结果 将Vue3项目的`dist`目录内容复制到SpringBoot的`src/main/resources/static`目录 ### 3. 添加前端路由处理控制器 ```java @Controller public class FrontendController { @GetMapping(value = { "/", "/login", "/dashboard", "/profile/{path:.*}" // 添加所有前端路由路径 }) public String forward() { return "forward:/index.html"; } } ``` ## 三、打包部署方式 ### 方式1:打包为可执行JAR(推荐) #### 1. 配置pom.xml ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource> </resources> </build> ``` #### 2. 构建JAR包 ```bash mvn clean package ``` #### 3. 运行应用 ```bash java -jar target/your-application.jar ``` ### 方式2:打包为WAR部署到Tomcat #### 1. 修改pom.xml ```xml <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> ``` #### 2. 添加Servlet初始化类 ```java public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(YourApplication.class); } } ``` #### 3. 构建WAR包 ```bash mvn clean package ``` #### 4. 部署到Tomcat 将生成的WAR文件复制到Tomcat的`webapps`目录并启动Tomcat ## 四、关键配置说明 ### 1. 静态资源配置 SpringBoot默认从以下位置提供静态资源: - `classpath:/static` - `classpath:/public` - `classpath:/resources` - `classpath:/META-INF/resources` ### 2. 解决跨域问题(可选) ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*"); } } ``` ### 3. 配置API代理(可选) ```java @RestController @RequestMapping("/api") public class ApiController { @GetMapping("/**") public ResponseEntity<?> proxyApi(HttpServletRequest request) { // 实现API转发逻辑 return restTemplate.exchange( "http://backend-service" + request.getRequestURI(), HttpMethod.valueOf(request.getMethod()), new HttpEntity<>(request.getBody(), headers), byte[].class ); } } ``` ## 五、验证部署结果 1. 访问SpringBoot应用根URL(如:http://localhost:8080) 2. 应显示Vue3应用的首页 3. 验证前端路由是否正常工作 4. 测试API接口调用是否正常 ## 六、部署架构图 ```mermaid graph TD A[Vue3项目] -->|构建| B(dist静态文件) B --> C[复制到SpringBoot static目录] D[SpringBoot应用] -->|打包| E[JAR/WAR] E -->|部署| F[服务器] G[客户端浏览器] -->|访问| F F -->|提供静态资源| G F -->|处理API请求| H[后端服务] ``` ## 常见问题解决 1. **路由404问题**:确保添加了前端路由控制器 2. **静态资源加载失败**:检查文件是否在正确目录(static目录) 3. **API调用失败**:检查API代理配置是否正确 4. **跨域问题**:在开发环境配置代理,生产环境使用CORS配置
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值