我的需求很简单,就是想把一个简单的前后端分离的web项目合并打成jar包,然后独立运行起来。 前后端分离固然有性能优势,但我们的实际情况是没有多余的服务器给前端,最终都部署在同一台机器上,还要走不同的部署流程,很是麻烦实施人员,故而有上述需求。
但寻觅了各方网站的解决方案,发现各位大神的表达能力实在令人汗颜,很多关键的设置都描述不清楚,其实整个过程很简单:
第一:前端react项目,需要设置package.json的"homepage",设置为一个代表项目名的字符串,比如projectA: "homepage": "projectA",
第二:后端的springboot项目,需要配置server.servlet.context-path,值为"/projectA",注意是斜线开头。因为我从来不想把项目部署在服务器根目录,至少要有前缀。此时可以观察到,这个配置和react项目的homepage是一致的,除了多了斜线,这个很关键;
第三:前端react项目,路由的根路径就应该设为projectA,我用的react-router-dom,即:<BrowserRouter basename='projectA' > 同时,由于我使用了vite,还要配置一下vite.config.ts,
export default defineConfig({
base:"/projectA", //只需要注意这里,和后端的context-path设置一致
plugins: [
react(),
tsConfigPaths(),
],
...
})
因为同样的道理,我也不想通过http://ip地址:端口/ 就直接进入项目主页,熟悉react开发的朋友应该不陌生,另外,前后端合并以后意味着不需要代理了,有相关的拼url的地方要注意下。
第四:打包前端react项目,得到dist文件夹,把里面的内容全部拷贝到springboot项目的resource目录的static文件夹中;
第五:在springboot项目里增加一个配置类,用来重定向前端页面请求的:
@Configurationpublic
class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/index.html");
}
}
最后:maven命令打成jar包,不用我说了;
这几步看似零碎,其实没有对代码和配置做大量复杂的操作,而且有经验的程序员稍微想想就能理解其间的联系和逻辑,可网上的大神们(几乎都出自csdn之流),要么配什么静态路径映射,要么说前端的路由不能用 BrowserRouter只能用HashRouter,甚至要安装什么Thymeleaf包等等等等,根本看不到重点,自己实践了才知道,简单到不值一提。