Как запретить браузеру включать несколько версий зависимостей?

В моем интерфейсном коде я использую require(), чтобы вытащить библиотеки, которые, в свою очередь, зависят от разных версий Underscore.js. В результате, когда я использую браузеру для объединения всего вместе, вывод содержит несколько копий 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';

(Я создал репозиторий GitHub с более полным примером. Скройте его и запустите npm install && npm test, чтобы увидеть его в действии)

Я попробовал добавить раздел browser в свой package.json, как показано ниже, но это не показало никакого эффекта:

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

Я понимаю, почему npm устанавливает дубликаты зависимостей (и имеет смысл сделать это таким образом для серверного кода), но какой правильный способ справиться с этим при использовании браузера?

Ответы

Ответ 1

В Browserify обнаружено дублирование, которое должно избегать загрузки одной и той же версии более одного раза. Однако, если ваше дерево node_modules содержит несколько копий одного и того же модуля, это обнаружение может (должно быть?) Сбой.

Решение, которое я использую, - это дедуксирование структуры пакета с помощью npm:

npm dedupe

Это приведет к тому, что в вашем дереве зависимостей останутся неизбежные обманы, и он будет регистрировать предупреждение об этих обманах, чтобы вы могли дважды проверить.