springboot 项目托管 vue 项目

一. 操作流程

整体流程如下

  1. vue 项目打包
  2. springboot 托管静态文件
  3. 处理路由跳转问题

1. vue 项目打包

我的版本是 vue3 项目,使用了 vite,可以直接使用 vite build 命令将 vue 代码打包为独立的文件。(如果不是用 vite 也可以自己查一下如何打包)

打包后会在 dist 目录生成如下目录结构的文件(注意:那个 css 和 js 文件名每次都不一样)

在这里插入图片描述
这些文件以 index.html 为入口,会以相对路径调用 assets 路径下的 css 文件、js 文件以及静态资源。


2. springboot 托管静态文件

这些打包好的文件,进行静态资源托管后即可正常使用。你可以使用 nginx 来托管这些静态文件。

然而这次我们想使用 springboot 直接托管这些静态文件。

引入 spring-boot-starter-web 依赖,这时不需要额外的配置,只要放在 src/main/resources/static 文件夹下的文件,都可以被正确访问到。

例如,在 src/main/resources/static 中放一个 index.html 文件,地址 127.0.0.1:8080/index.html 就可以直接访问到 index.html 文件。

所以把 vue 打包好的文件放在 src/main/resources/static 目录下即可
在这里插入图片描述


3. 处理路由跳转问题

但在实际使用时,会发现有这样一个问题,就是前端代码会设置前端的路由跳转,例如从根路径跳转到一个业务路径(/ => /other_route)。

如果不离开这个页面还好,但是如果在其他路径刷新页面,或者浏览器直接输入其他路径访问,就会发现 404 无法访问的问题,那么这个问题如何解决呢?

在 springboot 代码中添加如下 Controller 即可解决这个问题(注意要列出所有需要支持的前端路由)

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class RouterController {

    @GetMapping({"/", "/home", "/about", "/user/**"})  // <=== 列出所有需要支持的前端路由
    public String forward() {
        return "forward:/index.html";
    }

}

二、原理详解

当浏览器访问路径 /some_path 的时候,依次发生如下事件:

  1. 浏览器访问 SpringBoot Controller,路径是 /some_path
  2. SpringBoot 在后端服务内,将请求转发给了 index.html(这里的核心是浏览器的地址不变,也没有跳转)
  3. SpringBoot 服务器返回给前端 200 状态码,以及 index.html 的内容
  4. 浏览器执行 index.html 中的 javascript 脚本(Vue 代码)
  5. 脚本检测当前页面路径是 /some_path,执行了正确的路由操作

其他:return "index.html"return "forward:/index.html" 的行为差异

  • return "index.html"
    • 这会触发重定向(redirect)
    • 浏览器会收到 302/303 状态码
    • 浏览器会重新请求 index.html
    • URL 会变成 /index.html
    • Vue Router 读取到的是 /index.html
  • return "forward:/index.html"
    • 这是服务器内部转发
    • 浏览器只收到一个响应
    • url 保持不变,仍然是原始 url
    • Vue Router 能正确读取到原始 url
### 创建 Spring BootVue.js 的全栈项目 #### 1. 准备工作环境 为了顺利搭建基于Spring BootVue.js的全栈应用程序,需先安装必要的工具链。这包括但不限于JDK、Maven或Gradle用于构建Java项目;Node.js及其包管理器npm/yarn负责前端依赖项处理。 对于后端部分,利用Spring Initializr快速初始化一个新的Spring Boot工程[^2]。选择Web, Thymeleaf (尽管最终会被替换),以及其他所需模块如Security、Data JPA等作为起步依赖。下载解压后的文件夹即构成了项目的根目录。 针对前端,则要新建一个独立于后端之外的Vue CLI项目。执行`vue create frontend-app`命令启动交互式向导设置选项,按照提示完成创建过程。此操作会在当前路径下生成名为frontend-app的新子文件夹,里面包含了完整的Vue单页面应用模板结构[^3]。 #### 2. 配置前后端通信接口 在Spring Boot一侧定义RESTful API服务层,提供数据访问接口供客户端调用。可以采用@RestController注解标记控制器类,并通过@RequestMapping指定URL映射规则。例如: ```java import org.springframework.web.bind.annotation.*; @RestController public class HelloController { @GetMapping("/api/hello") public String sayHello() { return "Hello from backend!"; } } ``` 与此同时,在Vue组件内部借助Axios发起HTTP请求获取远程服务器返回的信息。通常会封装一层http service来统一管理和维护API地址前缀及其他公共参数配置。下面是一个简单的例子展示如何发送GET请求并显示结果: ```javascript // src/services/apiService.js import axios from 'axios'; const apiClient = axios.create({ baseURL: `http://localhost:8080`, // 后端运行所在主机名加端口号 }); export default { getGreeting() { return apiClient.get('/api/hello'); }, }; ``` 接着可以在任意Vue实例方法里调用上述service函数实现跨域资源共享(CORS)场景下的异步加载效果: ```javascript <template> <div id="app"> <p>{{ message }}</p> </div> </template> <script> import ApiService from './services/apiService'; export default { data() { return {message: ''}; }, mounted() { ApiService.getGreeting().then(response => this.message = response.data); } }; </script> ``` #### 3. 构建与部署策略 考虑到实际生产环境中可能存在的差异性因素影响,建议分别编译打包各自的应用程序再上传至目标机器上单独部署。具体来说就是把经过webpack优化过的dist静态资源放置到Nginx/Apache web server之下对外发布;而对于Java WAR/JAR形式的服务则交给Tomcat/WildFly这类容器托管监听特定端口等待外部连接进来。 另外值得注意的是当两个进程不在同一台物理机上面时还需要额外考虑防火墙穿透问题确保双方能够正常握手建立TCP链接交换报文段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值