设定:
套餐models
套餐app
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
答案 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);
}