如何防止browserify包含多个版本的子依赖项?

时间:2015-01-13 21:38:37

标签: browserify

在我的前端代码中,我使用require()来引入库,而库依赖于不同版本的Underscore.js。因此,当我使用browserify将所有内容捆绑在一起时,输出包含Underscore的多个副本。有没有办法告诉浏览器require('underscore')应该始终导入特定文件?

作为问题的演示,假设我有以下依赖项:

// package.json
"dependencies": {
  // Depends on underscore 1.7.0
  "backbone": "^1.1.2",

  // Depends on underscore 1.6.0
  "backbone.marionette": "^2.3.0"
}

main.js我使用两个库:

// main.js
var Backbone = require('backbone');
var Marionette = require('backbone.marionette');
console.log("Hello, world!");

当我创建一个包时,包含了多个版本的Underscore:

PS> browserify main.js -o out.js
PS> findstr _.VERSION out.js
  _.VERSION = '1.7.0';
  _.VERSION = '1.6.0';

I created a GitHub repository with a more complete example。克隆并运行npm install && npm test以查看其效果)

我尝试向browser添加package.json部分,如下所示,但似乎没有任何效果:

// package.json
"browser": {
  "underscore": "./node_modules/underscore/underscore.js"
}

我理解为什么npm安装了重复的依赖项(对服务器端代码这样做是有意义的)但是在使用browserify时处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:10)

Browserify中存在重复检测,应避免多次加载相同版本。但是,如果您的node_modules树包含同一模块的多个副本,则此检测可能(应该?)失败。

我正在使用的解决方案是使用npm重复包结构:

npm dedupe

这只会在依赖树中留下不可避免的欺骗行为,并会记录有关这些欺骗的警告,以便您可以仔细检查。

相关问题