了解Node.js模块:multiple需要返回相同的对象吗?

我有一个关于模块缓存的node.js文档的问题:

模块在第一次加载后进行缓存。 这意味着   (除此之外)每次调用require('foo')都会得到   返回完全相同的对象,如果它将解析为相同   文件。

多次调用require('foo')可能不会导致模块代码   多次执行。 这是一个重要的特征。 用它,   可以返回“部分完成”的对象,从而允许传递   即使它们会导致循环,也要加载依赖项。

may是什么意思?

我想知道require是否总是返回相同的对象。 因此,如果我需要app.js中的模块A并在app.js(需要返回的那个)中更改导出对象,之后需要app.js中的模块B本身需要模块A,我是否总是得到该对象的修改版本, 还是新的?

// app.js

var a = require('./a');
a.b = 2;
console.log(a.b); //2

var b = require('./b');
console.log(b.b); //2

// a.js

exports.a = 1;

// b.js

module.exports = require('./a');
Xomby asked 2019-08-10T13:15:35Z
6个解决方案
63 votes

如果require('a')app.js都位于同一项目中(并且位于同一目录中),则它们都将接收相同的实例a.js.来自node.js文档:

...每次调用require('a')将获得完全相同的返回对象,如果它将解析为同一个文件。


require('a'),app.jsa.js处于不同的npm模块中时,情况是不同的。 例如:

[APP] --> [A], [B]
[B]   --> [A]

在这种情况下,24747272257032693737中的require('a')将解析为a.js中的a.js,而不是b.js中的247472722570326937。因此返回A的不同实例。有一篇博文更详细地描述了这种行为。

Petr Stodulka answered 2019-08-10T13:16:15Z
5 votes

node.js实现了某种缓存,它阻止节点在执行一些巨大的服务器项目时读取文件1000次。

此缓存列在require.cache[{module}].exports对象中。 我必须注意,此对象是可读/可写的,这使得能够从缓存中删除文件而不会终止进程。

[http://nodejs.org/docs/latest/api/globals.html#require.cache]

哦,忘了回答这个问题。 修改导出的对象不会影响下一个模块加载。 这会造成很多麻烦......要求总是返回一个对象的新实例,没有引用。 编辑文件并删除缓存会改变导出的对象

在做了一些测试之后,node.js会缓存module.exports。 修改require.cache[{module}].exports最终在一个新的,修改后的返回对象中。

moe answered 2019-08-10T13:17:14Z
2 votes

对于我所看到的,如果模块名称解析为先前加载的文件,则将返回缓存模块,否则将单独加载新文件。

也就是说,缓存基于要解析的实际文件名。 这是因为,通常,可以存在安装在文件层次结构的不同级别并且必须相应地加载的相同包的不同版本。

我不确定的是,在程序员的控制或意识不存在的情况下,存在缓存失效的情况,这可能会导致多次意外重新加载相同的包文件。

Simone C. answered 2019-08-10T13:17:57Z
0 votes

尝试drex:[https://github.com/yuryb/drex]

drex正在观看一个模块进行更新,并且干净地重新要求   更新后的模块。 新代码正在被要求()d,就像新的一样   代码是一个完全不同的模块,所以require.cache不是问题。

user2030657 answered 2019-08-10T13:18:33Z
0 votes

如果您希望require(x)每次都返回一个新对象的原因只是因为您直接修改了该对象 - 这是我遇到的情况 - 只需克隆它,并修改并仅使用克隆,如下所示:

var a = require('./a');
a = JSON.parse(JSON.stringify(a));
Eugene Beresovsky answered 2019-08-10T13:19:01Z
0 votes

自问题发布以来,该文件已经更新,以明确为什么"可能" 最初使用。 它现在通过使事情明确来回答问题本身(我的重点是显示改变了什么):

模块在第一次加载后进行缓存。 这意味着   (除此之外)每次调用require('foo')都会得到   返回完全相同的对象,如果它将解析为相同   文件。

提供require.cache未修改,多次调用   require(' foo')不会导致模块代码被多次执行  倍。 这是一个重要的特征。 有了它,"部分完成"对象   可以返回,从而允许加载传递依赖项   即使他们会导致周期。

Reg Edit answered 2019-08-10T13:19:39Z
translate from https://stackoverflow.com:/questions/8887318/understanding-node-js-modules-multiple-requires-return-the-same-object