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 для моего локального модуля, и это сработало.

Другие вопросы по тегам