node.js中module.parent有什么用?我如何参考require()ing模块?

Ala*_*air 35 node.js node-modules

我在查看node.js模块文档,并注意到每个模块都有一个属性 - module.parent.我试图使用它,但是被模块缓存烧毁了 - module.parent只有在首先需要()它的模块看来,无论当前的上下文如何.

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

require("mylibrary")(module)
Run Code Online (Sandbox Code Playgroud)

但这似乎不是最佳的.

Jon*_*ski 42

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

// $ node foo.js
console.log(module.parent); // `null`
Run Code Online (Sandbox Code Playgroud)
// require('./foo')
console.log(module.parent); // `{ ... }`
Run Code Online (Sandbox Code Playgroud)

您期望的是"调用者",Node不会为您保留.为此,您需要将当前使用的导出函数作为值的闭包.

  • 添加到这个答案...我想(没有尝试过)这可能是模块可以通过命令行确定它是"独立"运行的一种方式,而不是作为更大的应用程序的一部分包含.我们有一些类似rake的模块可以在这两种上下文中工作,但根据上下文的行为略有不同(比如,它们如何记录msgs或发出事件可能会有所不同).但是,我们使用不同的方法来确定上下文:`if(require.main === module){/*我是一个独立的模块*/}`. (3认同)

Roy*_*son 22

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

Magic.js

console.log('Required by ' + module.parent.filename);
delete require.cache[__filename];
Run Code Online (Sandbox Code Playgroud)

Module1.js

//prints "Required by Module1.js"
require('./Magic');
Run Code Online (Sandbox Code Playgroud)

Module2.js

//prints "Required by Module2.js"
require('./Magic');
Run Code Online (Sandbox Code Playgroud)

当然,这样做的副作用是你的模块不再是单件,所以你必须考虑到Magic.js这一点.如果需要存储全局数据,可以始终将其保存在require()'ed模块中,该模块不会从缓存中删除自身.