Spring Boot与React集成

前言
前不久学习了Web开发,用React写了前端,Spring Boot搭建了后端,然而没有成功地把两个工程结合起来,造成前端与后端之间需要跨域通信,带来了一些额外的工作。

这一次成功地将前端工程与后端结合在一个Project中,记录一下,也希望能帮到那些和我一样的入门小白。

环境
Windows 10 - x64, Java 1.8.0, node v8.9.4, npm 6.1.0

前奏
*JDK, Node 和 NPM请自行安装

新建一个Spring Boot工程
        在Intellij里选择Spring Initializer新建,

依赖添加devTool和Web

随后就初始化了后端的Spring boot项目

在Spring boot项目的文件夹内,新建一个React工程,推荐用create-react-app,没有的话通过npm安装到全局
// npm install -g create-react-app
create-react-app frontene
主曲
添加Maven插件frontend-maven-plugin
<plugins>
  <plugin>
    <!-- https://mvnrepository.com/artifact/com.github.eirslett/frontend-maven-plugin -->
      <groupId>com.github.eirslett</groupId>
      <artifactId>frontend-maven-plugin</artifactId>
      <version>1.6</version>
     ...
  </plugin>
</plugins>
frontend-maven-plugin可以在打包时build react项目,并将build得到的前端页面文件放入指定位置。

配置frontend-maven-plugin

<executions>
  <execution>
     <id>install node and npm</id>
     <goals>
       <goal>install-node-and-npm</goal>
     </goals>
     <configuration>
       <nodeVersion>v8.11.1</nodeVersion>
       <npmVersion>5.6.0</npmVersion>
       <nodeDownloadRoot>http://npm.taobao.org/mirrors/node/</nodeDownloadRoot>
     <!--<npmDownloadRoot>http://npm.taobao.org/mirrors/npm/</npmDownloadRoot>-->
       </configuration>
   </execution>
   <execution>
     <id>npm install</id>
     <goals>
        <goal>npm</goal>
     </goals>
     <configuration>
        <arguments>install</arguments>
      </configuration>
   </execution>
 
   <execution>
     <id>npm run-script build</id>
     <goals>
       <goal>npm</goal>
     </goals>
     <configuration>
       <arguments>run-script build</arguments>
     </configuration>
    </execution>
 </executions>
 <configuration>
   <installDirectory>target</installDirectory>
   <workingDirectory>frontend</workingDirectory>
 </configuration>
       Maven这一插件会依次执行install-node-and-npm, npm install, npm run-script build三条命令。

配置中的installDirectory指定了node和npm的安装位置,在jar包中安装node和npm确保在没有安装node和npm的机器上jar包依然可以运行,如果安装了则会屏蔽全局的node和npm。

     WorkingDirectory值为前端项目package.json文件所在路径,插件会自动在workingDirectory下运行npm install和npm run-script build命令。

Webpack 配置
通过create-react-app生成的项目里并没有webpack的配置,在frontend里npm run eject,会弹出许多个文件夹,config下可以看见与webpack相关的多个配置文件。

这里需要修改paths.js 中的 module.exports = { ... },修改后如下

module.exports = {
  dotenv: resolveApp('.env'),
  appBuild: resolveApp('../src/main/resources/static/'),     // 设置build所产生的文件的放置位置
  appPublic: resolveApp('../src/main/resources/static/'),    // 设置public文件夹内文件在build后的存放位置
  appHtml: resolveApp('public/index.html'),
  appIndexJs: resolveApp('src/index.js'),
  appPackageJson: resolveApp('package.json'),
  appSrc: resolveApp('src'),
  yarnLockFile: resolveApp('yarn.lock'),
  testsSetup: resolveApp('src/setupTests.js'),
  appNodeModules: resolveApp('node_modules'),
  publicUrl: getPublicUrl(resolveApp('package.json')),
  servedPath: getServedPath(resolveApp('package.json')),
};
尾声
       前后端工程结合通过以上一些操作就可以实现一个工程开发,同时前后端仍然是解耦的,仅测试前端效果只需要在前端文件下用node运行。

       实践证明,在前端应用react-router并不需要对后端作其他配置。

       这篇博文只是将Spring Boot和React结合到一个项目里的一次简单的尝试,本人Web开发并不精通,恳请高手斧正。

参考文献
 React.js and Spring Data REST - https://spring.io/guides/tutorials/react-and-spring-data-rest/ 
 Frontend-maven-plugin github - https://github.com/eirslett/frontend-maven-plugin
在Maven中前端构建实践 - https://blog.csdn.net/livialiu1234/article/details/77760032
Spring集成React用来开发前端----maven项目中用webpack打包react相关组件 - https://zhuanlan.zhihu.com/p/28999885
--------------------- 
作者:Higher_Stark 
来源:CSDN 
原文:https://blog.csdn.net/Higher_Stark/article/details/80931388 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/u012149181/article/details/84796804