我正在查看node.js 模块文档,并注意到每个模块都有一个属性 - module.parent
。我尝试使用它,但被模块缓存烧毁了——无论当前上下文如何,module.parent
似乎只对第一个 require()的模块来说是这样。
那么它的用途是什么?有没有其他方法可以让我获得对当前require()ing 模块的引用?现在我将模块包装在一个函数中,因此它被称为:
require("mylibrary")(module)
但这似乎不是最理想的。
我正在查看node.js 模块文档,并注意到每个模块都有一个属性 - module.parent
。我尝试使用它,但被模块缓存烧毁了——无论当前上下文如何,module.parent
似乎只对第一个 require()的模块来说是这样。
那么它的用途是什么?有没有其他方法可以让我获得对当前require()ing 模块的引用?现在我将模块包装在一个函数中,因此它被称为:
require("mylibrary")(module)
但这似乎不是最理想的。
“父”是导致脚本被解释(和缓存)的模块,如果有的话:
// $ node foo.js
console.log(module.parent); // `null`
// require('./foo')
console.log(module.parent); // `{ ... }`
您期待的是 Node 不会为您保留的“调用者”。为此,您需要将当前使用的导出函数作为该值的闭包。
有一个解决方法。Node 在完成加载之前将一个模块添加到模块缓存中。这意味着模块可以在加载时从模块缓存中删除自己!然后每次require
模块都加载模块的新实例。
魔术.js
console.log('Required by ' + module.parent.filename);
delete require.cache[__filename];
模块1.js
//prints "Required by Module1.js"
require('./Magic');
模块2.js
//prints "Required by Module2.js"
require('./Magic');
当然,这样做的副作用是您的模块不再是单例,因此您必须在编写代码Magic.js
时牢记这一点。如果您需要存储全局数据,您可以始终将其保存在 require() 的模块中,该模块不会从缓存中删除自身。