当依赖项发生变化时重新编译 create-react-app 的聪明方法
Smart way to recompile create-react-app when a dependency changes
我在我开发的包(我的包)中使用 create-react-app。
我的包与 webpack 捆绑在一起。
在繁重的测试循环中,我经常更改我的包并使用 npm i —save ../my-package
在 react-app 中本地重新安装它,不幸的是,这个操作很慢并且不会通过 react 触发重新编译操作-当我处于 npm start
模式时的应用程序。
如果我可以在我的包中设置 webpack —watch
并以某种方式将包提供给 react-app + 重新编译触发器,那就太好了。
有办法实现吗?
谢谢
我会将我的回答分为两部分:如何通过 npm 设置本地链接包以及如何设置 create-react-app 的 Webpack 以触发重新编译。
设置本地包
要设置本地包,您必须在项目的 node_modules
文件夹中创建一个符号链接指向您的包。一个简单的方法是使用 npm link
命令。为此,请进入您的包文件夹并 运行 npm link
,然后进入您的项目文件夹并 运行 npm link package-name
。
如果你做对了,你应该能够检查你的 node_modules 文件夹中是否创建了指向你的包文件夹的符号链接。如果它不起作用,请确保您的 package.json
文件指向您的包的正确位置。例如:
"dependencies": {
"package-name": "file:../relative/path/to/your/package"
}
使 create-react-app 在本地包更改时触发重建
如果你查看 create-react-app 的源代码,你会注意到文件 webpackDevServer.config.js
有以下选项:
watchOptions: {
ignored: ignoredFiles(paths.appSrc),
}
其中 ignoredFiles 是一个导入匹配 node_modules
的正则表达式。这意味着 create-react-app 明确忽略 node_modules
更改时的重建(不过有一个例外,即在添加新包时,这是通过在 webpack.config.dev.js
中使用 WatchMissingNodeModulesPlugin
完成的) .
原因是某些计算机在检查整个 node_modules
文件夹的更改时速度变慢。我的建议是覆盖 ignoredFiles
函数,使用正则表达式仅排除您的本地包。例如:
const ignoredFiles = function (appSrc) {
return new RegExp(
`^(?!${escape(
path.normalize(appSrc + '/').replace(/[\]+/g, '/')
)}).+/node_modules/(?!package-name)`,
'g'
);
};
不幸的是,您必须从 create-react-app 中退出或覆盖您的 webpackDevServer.config.js
(例如使用 rewire)才能应用上述更改。
我注意到,当通过 file:
属性添加依赖项时,CRA 将忽略更改。
但是,使用 link:
代替,CRA 也开始侦听更改。
"dependencies": {
"package-name": "link:../relative/path/to/your/package"
}
我在我开发的包(我的包)中使用 create-react-app。 我的包与 webpack 捆绑在一起。
在繁重的测试循环中,我经常更改我的包并使用 npm i —save ../my-package
在 react-app 中本地重新安装它,不幸的是,这个操作很慢并且不会通过 react 触发重新编译操作-当我处于 npm start
模式时的应用程序。
如果我可以在我的包中设置 webpack —watch
并以某种方式将包提供给 react-app + 重新编译触发器,那就太好了。
有办法实现吗? 谢谢
我会将我的回答分为两部分:如何通过 npm 设置本地链接包以及如何设置 create-react-app 的 Webpack 以触发重新编译。
设置本地包
要设置本地包,您必须在项目的 node_modules
文件夹中创建一个符号链接指向您的包。一个简单的方法是使用 npm link
命令。为此,请进入您的包文件夹并 运行 npm link
,然后进入您的项目文件夹并 运行 npm link package-name
。
如果你做对了,你应该能够检查你的 node_modules 文件夹中是否创建了指向你的包文件夹的符号链接。如果它不起作用,请确保您的 package.json
文件指向您的包的正确位置。例如:
"dependencies": {
"package-name": "file:../relative/path/to/your/package"
}
使 create-react-app 在本地包更改时触发重建
如果你查看 create-react-app 的源代码,你会注意到文件 webpackDevServer.config.js
有以下选项:
watchOptions: {
ignored: ignoredFiles(paths.appSrc),
}
其中 ignoredFiles 是一个导入匹配 node_modules
的正则表达式。这意味着 create-react-app 明确忽略 node_modules
更改时的重建(不过有一个例外,即在添加新包时,这是通过在 webpack.config.dev.js
中使用 WatchMissingNodeModulesPlugin
完成的) .
原因是某些计算机在检查整个 node_modules
文件夹的更改时速度变慢。我的建议是覆盖 ignoredFiles
函数,使用正则表达式仅排除您的本地包。例如:
const ignoredFiles = function (appSrc) {
return new RegExp(
`^(?!${escape(
path.normalize(appSrc + '/').replace(/[\]+/g, '/')
)}).+/node_modules/(?!package-name)`,
'g'
);
};
不幸的是,您必须从 create-react-app 中退出或覆盖您的 webpackDevServer.config.js
(例如使用 rewire)才能应用上述更改。
我注意到,当通过 file:
属性添加依赖项时,CRA 将忽略更改。
但是,使用 link:
代替,CRA 也开始侦听更改。
"dependencies": {
"package-name": "link:../relative/path/to/your/package"
}