我有一个关于模块缓存的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.js
和b.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.js
比require('a')
中b.js
,因此返回不同的实例中A
.有一篇博文更详细地描述了这种行为.
node.js具有某种实现的缓存,可以阻止节点在执行一些巨大的服务器项目时读取文件1000倍。
该缓存在require.cache
对象中列出。我必须注意,该对象是可读写的,从而能够从缓存中删除文件而不会终止进程。
http://nodejs.org/docs/latest/api/globals.html#require.cache
哦,忘了回答这个问题。修改导出的对象不会影响下一个模块的加载。这会造成很多麻烦。。。需要始终返回对象的新实例,没有引用。编辑文件并删除缓存不会更改导出的对象
经过一些测试之后,node.js确实缓存了module.exports。修改require.cache[{module}].exports
结束于一个新的,修改后的返回对象。
归档时间: |
|
查看次数: |
41464 次 |
最近记录: |