You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用frontend-maven-plugin的Spring应用中React无法渲染内容排查

解决React + Spring Data REST中bundle.js 404导致React内容无法渲染的问题

看起来你的问题核心是bundle.js加载404——这也是React内容无法渲染的直接原因,浏览器找不到React的打包文件,自然没法执行渲染逻辑。咱们一步步来排查解决:

首先明确前提:Spring Boot会自动从classpath:/static/classpath:/public/classpath:/resources/这些目录加载静态文件,所以你的built/bundle.js必须出现在这些目录下,服务器才能通过/built/bundle.js访问到它。


1. 检查frontend-maven-plugin的配置

这个插件的核心作用是在Maven构建流程中完成前端打包,并把产物放到Spring能识别的静态资源目录里。你需要确保插件配置里包含复制打包产物到Spring静态资源目录的关键步骤。

打开你的pom.xml,插件配置应该类似这样:

<plugin>
    <groupId>com.github.eirslett</groupId>
    <artifactId>frontend-maven-plugin</artifactId>
    <version>1.12.0</version>
    <executions>
        <!-- 安装Node和npm(按需配置版本) -->
        <execution>
            <id>install node and npm</id>
            <goals>
                <goal>install-node-and-npm</goal>
            </goals>
            <configuration>
                <nodeVersion>v18.17.0</nodeVersion>
                <npmVersion>9.6.7</npmVersion>
            </configuration>
        </execution>
        <!-- 执行npm install安装依赖 -->
        <execution>
            <id>npm install</id>
            <goals>
                <goal>npm</goal>
            </goals>
            <configuration>
                <arguments>install</arguments>
            </configuration>
        </execution>
        <!-- 执行前端打包命令(对应你package.json里的build脚本) -->
        <execution>
            <id>build frontend</id>
            <goals>
                <goal>npm</goal>
            </goals>
            <configuration>
                <arguments>run build</arguments>
            </configuration>
        </execution>
        <!-- 关键步骤:把打包后的文件复制到Spring静态资源目录 -->
        <execution>
            <id>copy frontend assets</id>
            <phase>process-resources</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <from>${project.basedir}/src/main/frontend/build/built</from> <!-- 你的React打包产物目录 -->
                <to>${project.basedir}/src/main/resources/static/built</to> <!-- 放到Spring的static目录下 -->
            </configuration>
        </execution>
    </executions>
</plugin>

重点关注最后一个copy执行步骤,要确保<from>是你前端打包后生成bundle.js的实际路径,<to>指向Spring的静态资源目录(比如src/main/resources/static/built)。


2. 确认React打包工具的输出路径

从你的代码里的require语法来看,应该用的是Webpack。打开webpack.config.js,检查output配置是否和Maven插件的<from>路径对应:

const path = require('path');

module.exports = {
  entry: './src/index.js', // 你的React入口文件路径
  // ...其他配置
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'build/built') // 这个路径要和Maven插件里的<from>完全匹配
  }
};

同时检查package.json里的build脚本是否正确:

{
  "scripts": {
    "build": "webpack --mode production"
  }
}

3. 验证打包产物是否到位

执行mvn clean install完成完整构建,然后去target/classes/static/built目录下查看是否存在bundle.js——因为src/main/resources下的文件会被复制到target/classes(Spring运行时的classpath目录)。如果这里没有bundle.js,说明要么前端打包没生成文件,要么Maven的复制步骤没执行,回头检查上面的配置。


4. 调整index.html的路径(可选)

虽然你的built/bundle.js相对路径在根路径下是正确的,但改成绝对路径可以避免潜在的相对路径问题:

<script src="/built/bundle.js"></script>

按照这些步骤排查后,bundle.js应该能正常加载,React的模板内容也就能渲染出来了。

内容的提问来源于stack exchange,提问作者J. Cake

火山引擎 最新活动