React+Node项目postbuild脚本配置求助(基于concurrently)
解决React+Node.js应用的postbuild脚本问题
你的问题核心是路径引用错误加上Heroku环境下依赖安装的配置问题,我来一步步帮你修正:
先明确你的文件夹结构
你的项目层级是:
- 项目根目录 |_ client |_ server |_ package.json(你的脚本所在文件) |_ server.js
client和server是同级目录,并非server的子目录——这正是两个脚本出错的关键原因!
修正do-postbuild脚本
你原脚本里的路径指向完全错误:--prefix client会让npm去server/client目录找package.json,但你的React项目明明在server外面,自然会报找不到文件的错误。
正确的脚本应该是:
"do-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix ../client && npm run build --prefix ../client"
关键解释:
--prefix ../client:明确告诉npm切换到上级目录下的client文件夹执行命令,这才是React项目的正确路径。NPM_CONFIG_PRODUCTION=false:强制npm安装所有依赖(包括devDependencies),因为React的build命令需要用到dev依赖里的构建工具。
修正heroku-postbuild脚本
你原脚本的路径cd ../client是对的,但Heroku默认以production模式运行npm,此时npm install只会安装dependencies,不会装devDependencies,而React的build命令依赖dev包里的工具,所以会执行失败抛出Exit status 1。
正确的脚本应该是:
"heroku-postbuild": "cd ../client && NPM_CONFIG_PRODUCTION=false npm install && npm run build"
关键解释:
- 先通过
cd ../client进入正确的React项目目录。 - 设置
NPM_CONFIG_PRODUCTION=false,确保安装所有依赖(包括dev依赖),满足build的工具需求。 - 去掉了多余的
npm install --only=dev --no-shrinkwrap:前面的npm install已经安装了所有依赖,重复安装反而可能引发冲突。
额外必加配置
为了让Heroku上的Node.js服务器能正确托管React的构建产物,你需要在server.js里添加静态文件服务代码:
const path = require('path'); // 托管React构建后的静态文件 app.use(express.static(path.join(__dirname, '../client/build'))); // 处理单页应用的路由 fallback(刷新页面时不会404) app.get('*', (req, res) => { res.sendFile(path.join(__dirname, '../client/build/index.html')); });
这样用户访问你的Heroku应用时,才能正常加载React页面。
内容的提问来源于stack exchange,提问作者Michael Nelles
相关产品推荐
相关产品推荐

