求助:react-scripts中的package-patch为何无法持久保留?
解决react-scripts补丁在yarn start后丢失的问题
我帮你分析下这个问题——你用package-patch给react-scripts的webpack配置打了补丁,第一次启动项目时生效,但再跑yarn start补丁就没了,对吧?这其实是react-scripts的常见行为,下面给你拆解原因和靠谱的解决办法:
为啥补丁会丢?
react-scripts在执行start命令启动开发服务器时,内部可能会重置自身的文件(比如校验node_modules里的文件完整性,或者某些流程会重新生成配置文件),直接覆盖了你修改的内容。另外,package-patch生成的补丁有时候没法被react-scripts的启动流程正确识别,导致每次启动都还原成原始文件。
靠谱的解决办法
方法1:用react-app-rewired替代直接改node_modules
这是最推荐的方案,不用碰node_modules,通过自定义配置就能覆盖webpack规则:
- 先装依赖:
yarn add react-app-rewired --dev
- 在项目根目录新建
config-overrides.js,把你的webpack规则加进去:
module.exports = function override(config, env) { // 把你要加的规则插到最前面,确保生效 config.module.rules.unshift({ test: /\.m?js/, resolve: { fullySpecified: false } }); return config; };
- 修改
package.json里的脚本命令,把react-scripts换成react-app-rewired:
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject" }
这样每次启动项目都会自动加载你的自定义配置,再也不用担心补丁被覆盖了。
方法2:让package-patch的补丁持久生效
如果你非要用package-patch,可以试试这两步:
- 确保补丁文件存在项目的
patches/目录里,然后在package.json里加个postinstall脚本,让每次安装依赖后自动应用补丁:
"scripts": { "postinstall": "patch-package", "start": "react-scripts start", // 其他脚本... }
- 每次执行
yarn start前,先跑一遍yarn run package-patch react-scripts手动应用补丁(不过这个方法有点繁琐,不如第一种省心)。
方法3:升级react-scripts到修复Issue #11769的版本
既然你是在规避这个特定的Issue,不妨看看react-scripts的最新版本有没有修复它。如果已经修复了,直接升级就行:
yarn upgrade react-scripts
这样连补丁都不用打了。
总结
最稳妥的还是用react-app-rewired来管理自定义webpack配置,彻底避开修改node_modules带来的各种问题。如果坚持用package-patch,记得配置postinstall脚本让补丁自动生效。
内容的提问来源于stack exchange,提问作者lmonninger
相关产品推荐
相关产品推荐

