在node.js中获取模块的名称

时间:2015-11-27 11:38:37

标签: javascript node.js module npm fs

有谁知道如何在node.js / javascript

中获取模块的名称

所以我们说你做了

var RandomModule = require ("fs")
.
.
.
console.log (RandomModule.name)
// -> "fs"

3 个答案:

答案 0 :(得分:3)

如果您尝试跟踪依赖项,可以尝试使用require hooks。

创建名为myRequireHook.js

的文件
var Module = require('module');
var originalRequire = Module.prototype.require;
Module.prototype.require = function(path) {
    console.log('*** Importing lib ' + path + ' from module ' + this.filename);
    return originalRequire(path);
};

此代码将挂钩每个require调用并将其记录到您的控制台中。

不完全是你先问的,但也许它可以帮到你更好。

您需要在主.js文件中调用一次(以node main.js开头的文件)。

所以在你的main.js中,你就是这样做的:

require('./myRequireHook');
var fs = require('fs');
var myOtherModule = require('./myOtherModule');

它也将跟踪其他模块中的require

这就像babel这样的转发器工作方式。他们挂钩每个require调用并在加载前转换代码。

答案 1 :(得分:1)

我不知道你为什么会这样做,但有办法。

module变量在每个node.js文件中自动加载,包含一个名为children的数组。此数组包含当前文件中require加载的每个子模块。

这样,您需要严格比较已加载的引用与此数组中的缓存对象版本,以便发现该数组的哪个元素对应于您的模块。

看看这个样本:

var pieces = require('../src/routes/headers');

var childModuleId = discoverChildModuleId(pieces, module);
console.log(childModule);

function discoverChildModuleId(object, moduleObj) {
    "use strict";
    var childModule = moduleObj.children.find(function(child) {
        return object === child.exports;
    });
    return childModule && childModule.id;
}

此代码将在children对象中找到对应关系,并带上它的ID。

我将module作为我的函数的参数,以便您可以将其导出到文件中。否则它会显示discoverChildModule函数所在的模块(如果它在同一个文件中不会产生任何差异,但如果导出它将会出现)。

注意:

  • 模块ID具有完整路径名。所以不要期待找到../src/routes/headers。你会发现类似的东西:/Users/david/git/...
  • 我的算法无法检测var Schema = require('mongoose').Schema等导出的属性。有可能创造一个能够做到这一点的功能,但它会遇到很多问题。

答案 2 :(得分:0)

从模块内部(在REPL中不起作用)你可以......

console.log( global.process.mainModule.filename );

你会得到'/home/ubuntu/workspace/src/admin.js'