首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解Node.js模块:多个请求返回相同的对象?

理解Node.js模块:多个请求返回相同的对象?
EN

Stack Overflow用户
提问于 2012-01-17 06:41:08
回答 6查看 47.6K关注 0票数 108

我有一个关于the node.js documentation on module caching的问题

模块在第一次加载后被缓存。这意味着(尤其是)每次调用require('foo')都会得到与返回的完全相同的对象,如果它会解析到相同的文件的话。

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

使用may意味着什么?

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

代码语言:javascript
复制
// 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');
EN

回答 6

Stack Overflow用户

发布于 2014-11-03 03:29:08

如果app.jsb.js都驻留在相同的项目中(并且在相同的目录中),那么它们都将收到 of A的相同实例。从node.js documentation

...每次调用require('foo')都会得到完全相同的对象返回,如果它会解析到相同的文件。

a.jsb.jsapp.js位于不同的npm模块中时,情况会有所不同。例如:

代码语言:javascript
复制
[APP] --> [A], [B]
[B]   --> [A]

在这种情况下,app.js中的require('a')将解析为与b.js中的require('a')不同的a.js副本,从而返回A不同实例。有一个blog post更详细地描述了这种行为。

票数 79
EN

Stack Overflow用户

发布于 2018-10-16 17:21:08

自从这个问题被发布以来,the document已经更新了,以清楚为什么最初使用“可能”。现在,它通过让事情变得明确来回答问题本身(我强调的是显示发生了什么变化):

模块在第一次加载后被缓存。这意味着(在其他事情中),每次对require('foo')的调用都将得到完全相同的对象返回,如果它将解析到相同的文件。

提供的require.cache未修改,对 (‘foo’)的多个调用将不会导致模块代码多次执行。这是一个重要的特性。有了它,可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环。

票数 3
EN

Stack Overflow用户

发布于 2013-10-28 01:18:07

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8887318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档