解决node_modules通过webpack跨多个兄弟项目启动文件夹的path
我有几个兄弟文件夹/回购:
| - A | |- node_modules | |- app | | - B | |- node_modules | |- app | | - C | |- node_modules | |- app
由于交叉依赖关系,所以A
可能需要B
的脚本。
// A/app/script.js var bDependency = require('B/app/script.js') // B/app/script.js var jquery = require('jquery')
在这个例子中,当webpack进行绑定时,它会在A
之前parsing为node_modules
B
node_modules
。 这也会导致webpack bundle.js中的模块重复,因为它可能parsing为其他同级node_modules文件夹。 (这是甚至在new webpack.optimize.DedupePlugin()
)后的情况
所以我将不得不npm install
在B
包,即使它是A
需要它,并已经安装了库。
我正在使用解决scheme,根和modulesDirectories的webpack选项已经为一些友好的pathparsing。
我想要做的是首先解决任何node_modulespath到启动文件夹。 有没有办法实现这个与webpack的pathparsing工具,或者我应该重构应用程序都共享一个node_modules?
我发现最优雅的解决scheme是在node_modules
定义指向启动文件夹的node_modules
dir的resolve
对象的fallback
属性
resolve: { // Check the initiating folder's node_modules fallback: [ path.join(__dirname, "node_modules") ] }
您可以在这里阅读更多关于它的信息: https : //webpack.github.io/docs/configuration.html#resolve-fallback
这可以用Webpack的NormalModuleReplacementPlugin来解决:
new webpack.NormalModuleReplacementPlugin(new RegExp('path/to/B'), function(result) { result.request = result.request.replace("projectB", "projectA"); }),
任何与上面的正则expression式匹配的导入文件都会被该函数修改path,从而导致projectB/node_modules
模块被从projectA/node_modules
抓取,从而防止重复。