Заставить зависимость использовать конкретную версию подчиненной зависимости
Я строю код своего веб-сайта с помощью модулей webpack и npm и столкнулся со следующей проблемой:
Мой код использует jQuery 3.1.1 и добавляет к нему несколько плагинов. Я также использую зависимость, которая имеет суб-зависимость от jQuery <= 2.2.4. Проблема в том, что объекты субзависимости, очевидно, не знают о моих плагинах jQuery, так как модуль использует другую версию jquery.
Как заставить все зависимости (верхнего уровня и вложенных) использовать одну версию jQuery? Чтобы require("jquery")
всегда разрешается в jQuery 3.1.1.
Я попытался использовать npm shrinkwrap, чтобы переопределить версию зависимости, но это, похоже, не работает. Это мой модифицированный файл термоусадочной пленки:
{
"name": "example",
"version": "0.1.0",
"dependencies": {
"can": {
"version": "2.3.27",
"from": "can@>=2.3.23 <3.0.0",
"resolved": "https://registry.npmjs.org/can/-/can-2.3.27.tgz",
"dependencies": {
"jquery": {
"version": "3.1.1",
"from": "^3.1.1"
}
}
}
}
}
Но зависимость модуля по-прежнему jQuery 2.2.4 и npm install
печать npm ERR! invalid: jquery@3.1.1 /path/.../can/node_modules/jquery
Решения для решения проблемы с webpack вместо npm также принимаются.
2 ответа
Я сам нашел решение, используя псевдоним веб-пакета.
resolve: {
root: __dirname,
alias: {
"jquery": "node_modules/jquery/src/jquery",
}
}
Теперь каждый модуль, который использует require('jquery')
загружает модуль jquery, расположенный под путем псевдонима, независимо от указанной версии в package.json модуля.
Я оставляю вопрос открытым, поскольку для этого решения требуется веб-пакет, и мне было бы интересно, если бы существовало решение только для npm.
Следуя ответу @McFarlane, это безопасный способ установить псевдоним вместо использования необработанных путей:
{
resolve: {
alias: {
"jquery": require.resolve("jquery"),
}
}
}