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

标签 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!");

当我创建一个包时,包括多个版本的下划线:
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 时处理这个问题的正确方法是什么?

最佳答案

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

我正在使用的解决方案是使用 npm 对包结构进行重复数据删除:

npm dedupe

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

关于browserify - 如何防止 browserify 包含多个版本的子依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931982/

相关文章:

javascript - browserify 中两个文件相互需要

gulp - 使用 Webstorm 时 Watchify 不更新

typescript - 使用 typescript 和 browserify/gulp 严重破坏了 Sourcemaps

angularjs - 如何使用 browserify 运行 Protractor ?

node.js - 如何使用 Node.js 导入/需要 Browserify 编译文件

node.js - React/Babelify 新手;如何修复 "Accessing PropTypes"警告

javascript - 在 Node.JS 浏览器代码中找不到缓冲区

javascript - 用 javascript 构建原子设计开发生态系统

browserify - 列出 Browserify 捆绑的模块

angularjs - Jasmine 注入(inject)不起作用