Как запретить браузеру включать несколько версий зависимостей?
В моем интерфейсном коде я использую 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
Это приведет к тому, что в вашем дереве зависимостей останутся неизбежные обманы, и он будет регистрировать предупреждение об этих обманах, чтобы вы могли дважды проверить.