我有一个关于the node.js documentation on module caching的问题
模块在第一次加载后被缓存。这意味着(尤其是)每次调用require('foo')都会得到与返回的完全相同的对象,如果它会解析到相同的文件的话。
对require('foo') 的多次调用可能不会导致多次执行模块代码。这是一个重要的特性。有了它,可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环。
使用may
意味着什么?
我想知道require 是否总是返回相同的对象。因此,如果我在app.js
中需要一个模块A,并在app.js
中更改导出对象(需要返回的那个),然后在app.js
中需要一个本身需要模块A的模块B,那么总是获取该对象的修改版本,还是新的版本?
// 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');
发布于 2014-11-03 03:29:08
如果app.js
和b.js
都驻留在相同的项目中(并且在相同的目录中),那么它们都将收到 of A
的相同实例。从node.js documentation
...每次调用
require('foo')
都会得到完全相同的对象返回,如果它会解析到相同的文件。
当a.js
、b.js
和app.js
位于不同的npm模块中时,情况会有所不同。例如:
[APP] --> [A], [B]
[B] --> [A]
在这种情况下,app.js
中的require('a')
将解析为与b.js
中的require('a')
不同的a.js
副本,从而返回A
的不同实例。有一个blog post更详细地描述了这种行为。
发布于 2018-10-16 17:21:08
自从这个问题被发布以来,the document已经更新了,以清楚为什么最初使用“可能”。现在,它通过让事情变得明确来回答问题本身(我强调的是显示发生了什么变化):
模块在第一次加载后被缓存。这意味着(在其他事情中),每次对require('foo')的调用都将得到完全相同的对象返回,如果它将解析到相同的文件。
提供的require.cache未修改,对 (‘foo’)的多个调用将不会导致模块代码多次执行。这是一个重要的特性。有了它,可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环。
发布于 2013-10-28 01:18:07
就我所见,如果模块名称解析为先前加载的文件,则将返回缓存的模块,否则将单独加载新文件。
也就是说,缓存基于解析的实际文件名。这是因为,一般而言,安装在文件层次结构的不同级别上的同一个包可以有不同的版本,并且必须相应地加载。
我不确定的是,是否存在程序员无法控制或意识到缓存失效的情况,这可能会导致多次意外地重新加载相同的包文件。
https://stackoverflow.com/questions/8887318
复制相似问题