【问题标题】:What is the use of module.parent in node.js? How can I refer to the require()ing module?node.js 中的 module.parent 有什么用?如何引用 require()ing 模块?
【发布时间】:2012-11-19 01:42:07
【问题描述】:

我查看了node.js module 文档,并注意到每个模块都有一个属性-module.parent。我尝试使用它,但被模块缓存烧毁了 - module.parent 似乎只出现在 首先需要()的模块,与当前上下文无关。

那么它的用途是什么?有没有其他方法可以让我获得对 current require()ing 模块的引用?现在我将模块包装在一个函数中,因此它被称为:

require("mylibrary")(module)

但这似乎不是最理想的。

【问题讨论】:

    标签: node.js node-modules


    【解决方案1】:

    “父”是导致脚本被解释(和缓存)的模块,如果有的话:

    // $ node foo.js
    console.log(module.parent); // `null`
    
    // require('./foo')
    console.log(module.parent); // `{ ... }`
    

    您所期待的是 Node 不会为您保留的“调用者”。为此,您需要将当前使用的导出函数作为值的闭包。

    【讨论】:

    • 添加到这个答案......我想(没有尝试过)这可能是模块可以确定它是否通过命令行“独立”运行的一种方式,而不是作为更大应用程序的一部分。我们有一些类似 rake 的模块,它们可以在这两种上下文中工作,但根据上下文的不同表现略有不同(例如,它们记录消息或发出事件的方式可能不同)。但是,我们使用不同的方法来确定上下文:if(require.main === module) { /* I'm a standalone module */ }
    【解决方案2】:

    有一个解决方法。 Node 在完成加载之前将一个模块添加到模块缓存中。这意味着模块可以在加载时从模块缓存中删除自己!然后每次模块被require'd 加载一个新的模块实例。

    Magic.js

    console.log('Required by ' + module.parent.filename);
    delete require.cache[__filename];
    

    Module1.js

    //prints "Required by Module1.js"
    require('./Magic');
    

    Module2.js

    //prints "Required by Module2.js"
    require('./Magic');
    

    当然,这样做的副作用是您的模块不再是单例的,因此您必须在编码Magic.js 时牢记这一点。如果您需要存储全局数据,您可以始终将其保存在一个不会从缓存中删除自身的 require() 模块中。

    【讨论】:

    • 天才!对于工具和库(如记录器)而言,这似乎是一种容易被忽视的上下文感知集成方法。
    • Delete require.cache 在需要链接模块方面帮了我很多忙!谢谢!
    猜你喜欢
    • 2012-10-30
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2020-10-10
    • 2013-03-17
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多