检查所需模块是否为内置模块

时间:2014-11-09 11:29:46

标签: node.js

我需要检查要加载的模块是内置模块还是外部模块。例如,假设您在node_modules目录中有一个名为fs的模块。如果你require("fs")将加载内置模块而不是node_modules中的模块,那么我确定这个问题有一个解决方案。

示例:

var loadModule = function (moduleName){
  if (isCoreModule (moduleName)){
    ...
  }else{
    ...
  }
};

loadModule ("fs");

2 个答案:

答案 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,这可能会使同名的全局变得混淆。