可以,前端 Vue 项目和后端 Spring Boot 项目完全可以部署在同一台服务器上,这是生产环境中非常常见且成熟的架构方案。
核心思路
将 Vue 项目构建为静态资源(HTML/CSS/JS),由 Spring Boot 作为后端服务统一提供这些静态文件,实现前后端一体化部署。
✅ 推荐方案:Spring Boot 托管 Vue 静态资源
1. Vue 项目构建
# 在 Vue 项目中执行
npm run build
# 生成 dist/ 目录,包含 index.html、js/css 等静态文件
2. Spring Boot 配置
将 dist 目录复制到 Spring Boot 项目的 src/main/resources/static/ 或 public/ 目录下:
your-project/
├── src/
│ └── main/
│ ├── resources/
│ │ ├── static/ # 放 Vue 构建后的 dist 内容
│ │ └── application.yml
│ └── java/...
└── pom.xml
3. 关键配置(application.yml)
spring:
web:
resources:
static-locations: classpath:/static/ # 默认已包含 public/ 和 static/
✅ Spring Boot 启动后会自动从
classpath:/static/提供静态资源
✅ API 请求(如/api/*)由 Controller 处理,其他路径返回 Vue 的index.html
4. 路由支持(防止刷新 404)
由于 Vue Router 使用 History 模式时依赖后端重定向,需在 Spring Boot 中添加拦截器或自定义规则:
方式一:添加全局异常处理 + 默认返回 index.html
@Controller
public class StaticResourceController {
@RequestMapping(value = "/{path:[^\.]*}", method = RequestMethod.GET)
public String forward() {
return "forward:/"; // 转发到 /index.html
}
}
方式二:在 application.properties 中启用默认欢迎页
spring.web.resources.add-mappings=true
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html
🔒 注意事项
| 问题 | 解决方案 |
|---|---|
| 跨域(CORS) | 若前后端同源部署(同一域名+端口),无需 CORS;否则需配置 @CrossOrigin 或全局 CORS 策略 |
| 环境变量差异 | Vue 中使用 .env.production 配置 API 地址(如 VITE_API_BASE_URL=/api),避免硬编码 |
| Nginx 反向X_X(可选) | 如需更灵活的路由控制,可用 Nginx 做反向X_X:location /api { proxy_pass http://localhost:8080; }location / { try_files $uri $uri/ /index.html; } |
| 安全考虑 | 确保 dist 不包含敏感信息;API 接口做好权限校验(Spring Security) |
🚀 部署示例命令
# 1. 构建 Vue
cd vue-app && npm install && npm run build
# 2. 复制静态资源到 Spring Boot
cp -r vue-app/dist/* spring-boot-app/src/main/resources/static/
# 3. 打包并运行 Spring Boot
cd spring-boot-app && mvn clean package
java -jar target/your-app.jar
访问 http://服务器IP:8080 即可同时加载前端页面和调用后端 API。
⚠️ 何时不建议同服部署?
- 高并发场景下希望独立扩展前后端节点
- 前端需要 CDN 提速(此时可分离部署,通过 Nginx X_X)
- 多团队协作,前端团队独立 CI/CD
但绝大多数中小型项目,同服部署是简单、高效、低成本的首选方案。
CLOUD云枢