npm开发期间的peerDependencies

时间:2014-09-05 10:56:00

标签: node.js npm

设定:

套餐models

  • 跨多个应用使用的常见猫鼬模型
  • peerDependencies:“mongoose”

套餐app

  • 依赖:“mongoose”,“models”
  • 通过app> npm link models
  • 与模型相关联

问题:

开发models时,我需要在node_modules下安装mongoose,否则无法找到猫鼬。

但是,在models下使用app时,如果node_modules中的models下存在mongoose,则使用该副本而不是与{{共享同一个mongoose实例1}}。

我正在开展这项工作的方式是在开发app时安装mongoose,然后在models下使用时删除它。我查看了app但这似乎只解决了npm链接没有从父级中找到包的问题,​​而不是必须删除/安装node_module的问题(或者我这样做不正确?)< / p>

相关: Sharing a Mongoose instance between multiple NPM packages

3 个答案:

答案 0 :(得分:8)

我已经开始使用require.main.require代替require来处理需要共享实例的模块。

例如,require.main.require('mongoose')将保证仅使用顶级猫鼬。

答案 1 :(得分:0)

如果您遇到错误

require.main.require is not supported by webpack

...在模块的根目录中调用npm link <required module>

例如我在 peerDependency 反应中遇到了同样的问题。因此,我为本地模块做了npm link reack,它起作用了。

答案 2 :(得分:0)

这是您可以使用的模块,用于处理链接的父模块和祖父母模块

/**
 * 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);
}