Vue项目部署在Spring Boot出现页面空白问题的解决方案

本文探讨Vue项目在SpringBoot环境中部署的常见问题,包括页面空白、404错误及刷新后的路径问题,提出了解决方案,如调整assetsPublicPath、配置errorPage等。

网上流行的解决方案是将assetsPublicPath: '/'改成'./',下面说一下这个解决方案的弊端:

通常页面空白的问题出现大多数是由于Spring Boot端配置了server.servlet.context-path,上下文改变了css, js等文件的访问路径,文件无法加载导致index.html显示空白。'/'改成'./'是将绝对路径变为相对路径,可以动态适应Spring Boot端上下文的改变,这是为什么这个解决方案起作用的原因。

Vue项目部署在Spring Boot出现的另一个常见问题是当刷新浏览器的时候出现white label, 也就是404错误,解决的方案基本是把error page配置成为Vue的index.html。

这两个解决方案有冲突的地方,当router出现子路径的时候刷新浏览器,error page会指向Vue的index.html页面,此时页面中访问css,js文件的路径是相对路径,也就是上下文路径+router子路径,这将导致css,js再次无法正常加载,这就是相对路径的弊端。

由于router会出现子路径,因此必须保证assetsPublicPath为绝对路径,下面讲一下保持绝对路径的解决方案:

1 假设Spring Boot端配置server.servlet.context-path: api, 对应Vue的/config/index.js中assetsPublicPath: '/'改成 '/api/'

2 router/index.js中配置base: '/api/', 这是保证浏览器刷新时上下文参数和router跳转路径一致。

3 对于Ajax请求需要配置baseURL, 如果使用Axios, 可以采用如下方法在main.js中配置

// http request 拦截器

Axios.interceptors.request.use(

config => {

if (localStorage.getItem('id_token')) {

config.headers.Authorization = localStorage.getItem('id_token')

}

config.baseURL = '/api'

return config

},

err => {

return Promise.reject(err)

})

4 另外需要注意的一点,按照Spring Boot默认配置, 在Vue端/config/index.js中assetsSubDirectory: 'static'要改变为其它字符,比如:'content', 'vue', 'api'等等。

5 试过将assetsSubDirectory配置为空,它和另一个css图片加载的方案有冲突,图片加载解决方案是在/build/util.js中加一行配置

// Extract CSS when that option is specified

// (which is the case during production build)

if (options.extract) {

return ExtractTextPlugin.extract({

use: loaders,

fallback: 'vue-style-loader',

publicPath: '../../'

})

结尾附上Spring Boot端将error page指向Vue的index.html代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;


@Configuration
public class ServletConfig {
    private static final Logger logger = LoggerFactory.getLogger(ServletConfig.class);
    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        logger.info("come to 404 error page");
        return factory -> {
            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
            factory.addErrorPages(error404Page);
        };

    }
}

总结:以上是Vue项目部署于Spring Boot中常见的几个问题的解决方案。如果遇到其它部署问题欢迎留言!

Cheers!

部署一个 **Java + Vue3** 项目到 **Docker** 中,通常分为以下几个步骤: --- ## ✅ 一、项目结构说明 - **Java 后端(Spring Boot)**:提供 RESTful API,运行在 Tomcat 或内嵌的 Spring Boot Web 服务器中; - **Vue3 前端**:使用 Vue CLI 构建为静态 HTML/JS/CSS 文件,部署在 Nginx 或 Apache 等 Web 服务器中; - **Docker 容器部署**:分别构建 Java 后端和 Vue 前端的 Docker 镜像,或使用 `docker-compose` 统一编排。 --- ## ✅ 二、技术栈说明 | 技术 | 版本(示例) | |------|--------------| | Spring Boot | 3.0.x | | Vue3 | 3.2.x | | Node.js | 18.x | | Maven | 3.8.x | | Docker | 24.x | | Nginx | 1.20.x | --- ## ✅ 三、部署流程总览 1. 构建 Vue3 项目,生成静态资源; 2. 构建 Spring Boot 项目,生成可执行 jar; 3. 编写 Dockerfile 构建前后端镜像; 4. 使用 `docker-compose.yml` 编排服务; 5. 启动容器并验证部署。 --- ## ✅ 四、详细部署步骤 --- ### 1️⃣ 构建 Vue3 项目 进入 Vue3 项目目录: ```bash cd my-vue3-app ``` 构建生产环境静态资源: ```bash npm run build ``` 这将生成 `dist/` 目录,包含 `index.html` 和静态资源。 --- ### 2️⃣ 构建 Spring Boot 项目 进入 Spring Boot 项目目录: ```bash cd my-springboot-app ``` 使用 Maven 构建可执行 jar 包: ```bash mvn clean package ``` 生成的 jar 包位于 `target/my-springboot-app.jar` --- ### 3️⃣ 编写 Dockerfile #### ✅ Vue3 前端 Dockerfile(使用 Nginx) ```Dockerfile # 使用官方 Nginx 镜像作为基础镜像 FROM nginx:1.20 # 删除默认的 Nginx 页面 RUN rm -rf /usr/share/nginx/html/* # 拷贝 Vue 构建后的静态资源 COPY dist/ /usr/share/nginx/html/ # 暴露 80 端口 EXPOSE 80 ``` #### ✅ Spring Boot 后端 Dockerfile ```Dockerfile # 使用官方 JDK 镜像 FROM openjdk:17-jdk-slim # 拷贝 Spring Boot 构建好的 jar 包 COPY target/my-springboot-app.jar app.jar # 设置入口命令 ENTRYPOINT ["java", "-jar", "app.jar"] ``` --- ### 4️⃣ 编写 `docker-compose.yml` 文件 ```yaml version: '3.8' services: backend: build: context: ./my-springboot-app dockerfile: Dockerfile ports: - "8080:8080" restart: always frontend: build: context: ./my-vue3-app dockerfile: Dockerfile ports: - "80:80" restart: always ``` --- ### 5️⃣ 启动容器 在项目根目录执行: ```bash docker-compose up -d --build ``` 这将: - 构建两个镜像; - 启动容器; - 映射端口; - 后端运行在 `http://localhost:8080`; - 前端运行在 `http://localhost/`。 --- ## ✅ 五、优化建议 ### ✅ 1. 使用反向代理统一端口(推荐) 你可以将前端和后端部署在同一个 Nginx 中,使用反向代理统一端口访问: ```nginx server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ =404; } location /api/ { proxy_pass http://backend:8080/; } } ``` 修改 `docker-compose.yml`: ```yaml version: '3.8' services: backend: build: context: ./my-springboot-app dockerfile: Dockerfile container_name: backend expose: - "8080" restart: always frontend: build: context: ./my-vue3-app dockerfile: Dockerfile container_name: frontend ports: - "80:80" restart: always ``` --- ## ✅ 六、完整项目结构示例 ``` project-root/ ├── my-springboot-app/ │ ├── Dockerfile │ ├── pom.xml │ └── target/ │ └── my-springboot-app.jar ├── my-vue3-app/ │ ├── Dockerfile │ ├── package.json │ └── dist/ └── docker-compose.yml ``` --- ## ✅ 七、常见问题排查 | 问题 | 解决方法 | |------|----------| | Vue 页面空白 | 检查 Nginx 是否正确加载了 `dist/` 目录 | | 接口 404 | 检查前端是否配置了代理 `/api` 到后端 | | 容器启动失败 | 查看日志:`docker-compose logs` | | 端口冲突 | 修改 `ports` 映射,如 `8081:80` | | Docker 构建失败 | 检查路径是否正确、jar 是否存在、Dockerfile 是否有误 | --- ## ✅ 八、总结 | 步骤 | 内容 | |------|------| | 1 | 构建 Vue3 静态资源 | | 2 | 构建 Spring Boot 可执行 jar | | 3 | 编写 Dockerfile 构建镜像 | | 4 | 使用 docker-compose 编排服务 | | 5 | 启动容器并测试访问 | ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值