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() 模块中。
【讨论】:
天才!对于工具和库(如记录器)而言,这似乎是一种容易被忽视的上下文感知集成方法。 Deleterequire.cache
在需要链接模块方面帮了我很多忙!谢谢!以上是关于node.js 中的 module.parent 有啥用?如何引用 require()ing 模块?的主要内容,如果未能解决你的问题,请参考以下文章