当前位置: 首页 > news >正文

下集:一条打包到底的静态部署之路

在这里插入图片描述

说完坑,再来讲正经操作。

这次我决定写得明明白白,清清楚楚,把那条“Spring Boot 扛着 Next.js 上线”的路子掰碎了揉细了告诉你。

无废话、无迷信、无AI幻觉。

第一步:Next.js 静态导出

项目根目录下的 next.config.js 要写得很清楚,不要留一丝幻想:

/** @type {import('next').NextConfig} */
const nextConfig = {output: 'export',           // 重点!导出为纯静态trailingSlash: true,       // 每个路径带斜杠,方便生成 index.htmlimages: {unoptimized: true        // 否则图片优化会报错},
};module.exports = nextConfig;

然后直接命令:

npm run build
npx next export

这时候,会生成一个 out/ 文件夹,里面是你真正能用来部署的东西。

结构大概长这样:

out/
├── admin/
│   └── login/
│       └── index.html
├── register/
│   └── index.html
├── index.html
├── _next/static/chunks/...js
└── ...

注意,每个页面其实就是一个路径+index.html 文件结构,所以根本不用搞什么“SPA跳转”那一套逻辑!

第二步:复制到Spring Boot资源目录

假设你后端目录结构是标准的:

backend/
└── src/└── main/└── resources/└── static/

那么执行这条命令:

cp -r out/* ../backend/src/main/resources/static/

清空 static 目录再复制比较稳妥。

第三步:配置 Security —— 非 /api/** 一律放行

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.cors(cors -> cors.configurationSource(corsConfigurationSource())).csrf(AbstractHttpConfigurer::disable).sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)).authorizeHttpRequests(auth -> auth.requestMatchers("/api/admin/**").hasRole("ADMIN").requestMatchers("/api/**").authenticated().anyRequest().permitAll()).authenticationProvider(authenticationProvider()).addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);return http.build();
}

千万不要用 .anyRequest().authenticated(),那是开发环境用来封杀一切的,不适合你现在这个"一切靠静态"的部署场景。

第四步:配置 WebConfig —— 精准转发到 index.html

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/").resourceChain(true).addResolver(new PathResourceResolver() {@Overrideprotected Resource getResource(String resourcePath, Resource location) throws IOException {Resource requested = location.createRelative(resourcePath);if (requested.exists() && requested.isReadable()) {return requested;}// 对于非静态资源请求,尝试回退到 index.htmlif (resourcePath.contains(".")) {return null; // 明确要请求静态资源的,找不到就报404}if (resourcePath.startsWith("api/")) {return null; // 让Controller处理}return new ClassPathResource("/static/index.html");}});}
}

这个配置非常关键。它做到了:

  • 能访问的静态资源直接返回
  • 明确的 API 请求让 controller 去处理
  • 只有“没有扩展名”的页面路径,比如 /admin/login,才回退到 index.html

AI 给你那种“全都 forward 到 index.html” 的 Controller 方案,在这个结构下是没必要、也极其危险的。会白屏、跳错页,还极难调试。

第五步:打包运行!

用 Maven 构建:

mvn clean package -DskipTests

运行:

java -jar target/backend-0.0.1-SNAPSHOT.jar

然后你可以打开:http://localhost:8082/

  • / 首页会显示出来
  • /admin/login 会跳转到你静态导出的 admin/login/index.html
  • /register/?token=abc123 会正确加载 register 页并保留查询参数
  • /api/** 接口仍然走后端 Controller,毫无冲突

最终效果:

你得到了一个:

  • 单一jar包即可部署
  • 不需要Node环境
  • 支持多页访问和刷新
  • 前后端分工明确但部署合体
  • 操作简明、老板无感知的系统

结语:这条路走通了,我回头一看

  • AI教的套路,不一定错,但常常不适合你这种“野路子结合小团队现状”的打法
  • 静态部署这条线,只要搞清楚目录结构和路径映射,真的比你想的简单
  • Spring Boot 其实是个好平台,只要你别逼它理解前端的世界

这次,我们用文件系统打败了抽象逻辑。

前端静态导出 + 后端反向代理 + 安全放行策略,这三板斧下去,小项目不管你多么前后端分离,最终都能“一锅端”。

别再迷信什么服务拆分了,小项目,能合就合。

回头再看那些鼓吹“必须前后端分离”的架构课件……我只想笑着对他们说一句:

“你把前端扔进static再说这话。”

http://www.xdnf.cn/news/495469.html

相关文章:

  • JMeter 教程:编写 POST 请求脚本访问百度
  • SQL Server 与 Oracle 常用函数对照表
  • 二进制与十进制互转的方法
  • 使用Maven部署WebLogic应用
  • 信贷风控笔记6——风控常用指标(面试准备14)
  • MATLAB学习笔记(六):MATLAB数学建模
  • Uniapp、Flutter 和 React Native 全面对比
  • 分糖果--思维+while判断
  • 基于QT和FFmpeg实现自己的视频播放器FFMediaPlayer(一)——项目总览
  • 芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”
  • StarRocks MCP Server 开源发布:为 AI 应用提供强大分析中枢
  • gcc 源码目录文件夹功能简介
  • 从辅助到协作:GitHub Copilot的进化之路
  • 副业小程序YUERGS,从开发到变现
  • String的一些固定程序函数
  • 嵌入式学习笔记 - STM32 使用一个外部触发同时启动两个定时器
  • 谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程
  • 2.1.3
  • 【Linux网络】NAT和代理服务
  • AtCoder AT_abc406_c [ABC406C] ~
  • MySQL相关
  • 数据结构【AVL树】
  • vue2 切换主题色以及单页面好使方法
  • 自己手写tomcat项目
  • Redis INCR 命令详解
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)
  • C++学习:六个月从基础到就业——C++11/14:列表初始化
  • Java 类和对象
  • 从紫光集团看基本财务分析
  • 构建集成差异化灵巧手和先进机器人控制技术的自动化系统