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

在我的前端代码中,我使用require()来拉入库,依次依赖于Underscore.js的不同版本.因此,当我使用browserify将所有东西捆绑在一起时,输出包含多个Underscore副本.有没有办法告诉browserify,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安装& npm测试以查看它的行动)

我尝试向我的package.json添加一个浏览器部分,如下所示,但似乎没有任何效果

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

我明白为什么npm安装重复的依赖关系(这对于服务器端代码来说是有意义的),但是在使用browserify时应该怎么办?

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

我使用的解决方案是重复数据包结构与npm:

npm dedupe

这将只会在依赖关系树中留下不可避免的重复,并且会记录关于这些重复的警告,以便您可以仔细检查.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...