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

Posted

技术标签:

【中文标题】在 node.js 中获取模块的名称【英文标题】:Getting name of a module in node.js 【发布时间】:2016-03-01 14:33:53 【问题描述】:

有谁知道如何在 node.js / javascript 中获取模块的名称

所以假设你这样做

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

【问题讨论】:

有可能,但不是那样。等一下,我正在构建一个示例。 【参考方案1】:

我不知道你为什么需要它,但有办法。

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

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

看看这个样本:

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

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

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 这样的导出属性。可以制作一个能够做到这一点的函数,但它会遇到很多问题。

【讨论】:

是的!谢谢你的信息!我正在编写一个小模块来管理您的模块,这就是我需要它的原因。 您的解决方案的问题是它不适用于 fs 之类的本机模块:( 很遗憾没有,因为它们没有require 可以加载的源代码(它们是原生编译到 Node.js 引擎中的)。【参考方案2】:

在模块内(不适用于 REPL),您可以...

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

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

【讨论】:

【参考方案3】:

如果你想追踪你的依赖,你可以尝试使用 require 钩子。

创建一个名为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 调用并在加载之前转换您的代码。

【讨论】:

有趣!我会试试看!非常感谢你的帮助。这是我正在尝试编写的模块:github.com/JoyKrishnaMondal/GetRidOfError 基本上我想向用户记录哪个模块导致他们出错。

以上是关于在 node.js 中获取模块的名称的主要内容,如果未能解决你的问题,请参考以下文章

未定义模块名称 - node js

如何使用 node.js 在cheerio 中获取元素名称

node.js中的ES6变量导入名称?

node.js

在 Node.js 中,模块如何从应用程序的 package.json 中获取数据?

如何在 node.js 中包含默认模型作为参考名称?