springboot和vue结合的方案网络上的主要有以下两种:
1。【不推荐】在html中直接使用脚本标签引入vue和一些常用的组件,这种方式和以前传统的开发是一样的,只是可以很爽的使用vue的双向数据绑定,这种方式只适合于普通的全栈开发。
2。【推荐】使用vue官方的脚手架创建单独的前端工程项目,做到和后端完全独立开发和部署,后端单独部署一个纯restful的服务,而前端直接采用nginx来部署,这种称为完全的前后端分离架构开发模式,但是在分离中有很多api权限的问题需要解决,包括部署后的vue路由器路由需要在nginx中配置重写规则。这种前后端完全分离的架构也是目前互联网公司所采用的,后端服务器不再需要处理静态资源,也能减少后端服务器一些压力。
在传统行业中很多是以项目思想来主导的,而不是产品,一个项目会卖给很多的客户,并且部署到客户本地的机房里。在一些传统行业里面,部署实施人员的技术无法和互联网公司的运维团队相比,由于各种不定的环境也无法做到自动构建,容器化部署等。因此在这种情况下尽量减少部署时的服务软件需求,打出的包数量也尽量少。针对这种情况这里采用的在开发中做到前后端独立开发,整个开发方式和上面提到的第二种方式是相同的,但是在后端springboot打包发布时将前端的构建输出一起打入,最后只需部署springboot的项目即可,无需再安装nginx服务器。
实际上本文中这种前后端分离的开发,前端开发好后将建立构建好的dist下静态中的文件拷贝到springboot的资源的静态下,index . html则直接拷贝到springboot的资源的静态下。下面是示例图:
vue前端项目
@ configuration 公开课SpringWebMvcConfig延伸WebMvcConfigurerAdapter { @Override 公共空间addResourceHandlers (ResourceHandlerRegistry注册表){ registry.addResourceHandler(“/静态/* *”).addResourceLocations(“类路径:/静态/?; super.addResourceHandlers(注册表); } }
解决第二个问题的方式是对vue的路由的路径做改写,交给路由器来处理,而不是springboot自己处理,重写时可以考虑路由的路径统一增加后最,然后在springboot中编写过滤拦截特定后缀来做请求转发交给vue的路由处理。如:
const路由器=new VueRouter ({ 模式:“历史”, 基地:__dirname, 路线:[ { 路径:/ui/first.vhtml, 组件:第一 }, { 路径:/ui/second.vhtml, 组件:secondcomponent } ] })
后端拦截到带有vhtml的都交给路由器来处理,这种方式在后端写过滤器拦截后打包是完全可行的,但是前端开发的直接访问带后缀的路径会有问题。
另外一种方式是给前端的路由路径统一加个前缀比如/ui,这时后端写过滤器匹配该前缀,也不会影响前端单独开发是的路由解析问题。过滤器参考如下:
/* * *用于重写vue路由器 * * @author yu> @SpringBootApplication 公开课SpringBootMainApplication { 公共静态void main (String [] args) { SpringApplication.run (SpringBootMainApplication.class, args); } @ bean 公共EmbeddedServletContainerCustomizer containerCustomizer () { 返回(容器→{ ErrorPage error401Page=new ErrorPage (HttpStatus。未经授权,“html/错误/401.”); ErrorPage error404Page=new ErrorPage (HttpStatus。NOT_FOUND,“html/错误/404.”); ErrorPage error500Page=new ErrorPage (HttpStatus。INTERNAL_SERVER_ERROR,“html/错误/500.”); 容器。addErrorPages (error401Page error404Page error500Page); }); } @ bean 公共FilterRegistrationBean testFilterRegistration () { FilterRegistrationBean登记=new FilterRegistrationBean (); 登记。setFilter(新RewriteFilter());//注册重写过滤器 registration.addUrlPatterns(“/*”); registration.addInitParameter (RewriteFilter.REWRITE_TO "/index . html "); registration.addInitParameter (RewriteFilter。REWRITE_PATTERNS, ui "//* "); registration.setName (“rewriteFilter”); registration.setOrder (1); 返回注册; } }弹簧引导+ vue的前后端分离与合并方案实例详解