node.js 中的 module.parent 有啥用?如何引用 require()ing 模块?

Posted

技术标签:

【中文标题】node.js 中的 module.parent 有啥用?如何引用 require()ing 模块?【英文标题】: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)

但这似乎不是最理想的。

【问题讨论】:

【参考方案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 在需要链接模块方面帮了我很多忙!谢谢!

以上是关于node.js 中的 module.parent 有啥用?如何引用 require()ing 模块?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 中的模块和包之间的区别?

Node.js权威指南 (12) - Node.js中的其他模块

node.js 项目中的 index.js 用于啥?

配置node.js中的express框架

如何更新/修复单个子模块的父版本

node.js 中的空循环行为