我需要检查要加载的模块是内置模块还是外部模块。例如,假设您在node_modules目录中有一个名为fs
的模块。如果你require("fs")
将加载内置模块而不是node_modules中的模块,那么我确定这个问题有一个解决方案。
示例:
var loadModule = function (moduleName){
if (isCoreModule (moduleName)){
...
}else{
...
}
};
loadModule ("fs");
答案 0 :(得分:3)
process.binding('natives');
返回一个提供对所有内置模块的访问权限的对象,因此获取此对象的键将获得模块名称。所以你可以简单地做一些事情:
var nativeModules = Object.keys(process.binding('natives'));
function loadModule(name) {
if (~nativeModules.indexOf(name)) {
// `name` is a native module name
} else {
// ...
}
};
loadModule('fs');
答案 1 :(得分:0)
我的第一次尝试是:require.resolve(moduleName).indexOf('/') <= 0
。如果这是真的,那就是核心模块。可能无法移植到Windows实现,但您应该能够使用这个想法朝着正确的方向前进。
除此之外:当心require.resolve
执行同步文件系统IO。在网络服务器中使用它时要小心。
除此之外:小心使用术语“native”,这通常意味着本机代码编译的附加组件或C / C ++实现。 “核心”和社区模块都可以是纯JS或本机模块。 我认为“核心”是内置模块最准确的术语。
除此之外:最好不要影响全局变量名称,因此moduleName
而不仅仅是module
,这可能会使同名的全局变得混淆。