npm peerDependencies во время разработки
Настроить:
пакет models
- Общие модели мангустов, используемые в разных приложениях
- peerDependencies: "мангуст"
пакет app
- зависимости: "мангуст", "модели"
- Связано с моделями через
app> npm link models
Выпуск:
При разработке models
Мне нужен мангуст, установленный под node_modules
иначе он не сможет найти мангуста.
Однако при использовании models
под app
, если мангуст существует под node_modules
в models
, он использует эту копию вместо того, чтобы делить один и тот же экземпляр mongoose с app
,
То, как я делаю эту работу сейчас, это установка мангуста при разработке models
, затем удаляя его при использовании под app
, Я смотрел в parent-require
но это, кажется, только решает проблему с ссылкой npm, не находящей пакет от родителя, а не проблему с необходимостью удаления / установки node_module (или я делаю это неправильно?)
Связанный: Совместное использование экземпляра Mongoose между несколькими пакетами NPM
2 ответа
Я принял к использованию require.main.require
вместо require
для модулей, которым нужен общий экземпляр.
Например, require.main.require('mongoose')
будет гарантировать использование только мангуста верхнего уровня.
Вот модуль, который вы можете использовать, который имеет дело с родителями и бабушками и дедушками, которые связаны между собой
/**
* the original module scope
*/
const _BASE_MODULE = module;
/**
* the top level module (fixes nasty peer dependency issues with npm link)
*/
const _MODULE = topLevelModule();
/**
* find topmost module scope
*/
function topLevelModule() {
let _mod = _BASE_MODULE;
while (_mod.parent) {
_mod = _mod.parent;
}
return _mod;
}
/**
* cheap way to check if the module is available,
*
* @param {string} mod module name
* @return {boolean}
* @todo if we need better then we should switch to browserifys resolve package, but thats heavy
*/
export function isAvailable(mod) {
try {
_MODULE.require.resolve(mod);
return true;
} catch (e) {
return false;
}
}
/**
* requires a module from the top level scope
* @param {string } mod module name
* @return {*}
*/
export function topLevelRequire(mod) {
return _MODULE.require(mod);
}
Если вы получили ошибку
require.main.require is not supported by webpack
... вызов npm link <required module>
в корневом каталоге вашего модуля
Например, у меня была та же проблема с реакцией peerDependency. Так я и сделал npm link reack
для моего локального модуля, и это сработало.