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

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

所以假设你这样做

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

【问题讨论】:

  • 有可能,但不是那样。等一下,我正在构建一个示例。

标签: javascript node.js module npm 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 调用并在加载之前转换您的代码。

    【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多