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

Xom*_*mby 99 node.js

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

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

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

是什么意思may

我想知道require是否总是返回相同的对象.所以,如果我需要一个模块一个app.js,改变出口中的对象app.js(需要回报的),之后需要一个模块app.js本身需要模块一个,我将永远得到该对象的修改版本或新一?

// 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');
Run Code Online (Sandbox Code Playgroud)

Pet*_*lka 69

如果同时app.jsb.js驻留在同一项目(并在同一目录下),那么他们两人将获得相同的实例A.从node.js文档:

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


这种情况是不同的,当a.js,b.js并且app.js不同的NPM模块.例如:

[APP] --> [A], [B]
[B]   --> [A]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,require('a')app.js将解析为一个不同的副本,a.jsrequire('a')b.js,因此返回不同的实例A.有一篇博文更详细地描述了这种行为.

  • 我来找别的东西,学到了新东西!TY (4认同)

moe*_*moe 5

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

该缓存在require.cache对象中列出。我必须注意,该对象是可读写的,从而能够从缓存中删除文件而不会终止进程。

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

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

经过一些测试之后,node.js确实缓存了module.exports。修改require.cache[{module}].exports结束于一个新的,修改后的返回对象。