解决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 installB包,即使它是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抓取,从而防止重复。