了解Node.js模块:多个需要返回相同的对象?
我有一个关于模块caching的node.js文档的问题:
模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将得到完全相同的对象返回,如果它将parsing为相同的文件。
多次调用require('foo') 可能不会导致模块代码被多次执行。 这是一个重要的function。 有了它,“部分完成”的对象可以被返回,从而允许传递依赖被加载,即使它们会导致循环。
may
是什么意思?
我想知道如果require将始终返回相同的对象。 因此,如果我需要app.js
的模块A并更改app.js
(需要返回的那个)中的exports对象,然后在app.js
中需要模块B本身需要模块A ,那么我是否总能得到该对象的修改版本,还是新的?
// app.js var a = require('./a'); ab = 2; console.log(ab); //2 var b = require('./b'); console.log(bb); //2 // a.js exports.a = 1; // b.js module.exports = require('./a');
如果app.js
和b.js
都驻留在同一个项目中 (并在同一个目录中),那么它们都将接收到相同的A
实例 。 从node.js文档 :
…每次调用
require('foo')
将返回完全相同的对象 ,如果它将parsing为相同的文件 。
当a.js
, b.js
和app.js
在不同的npm模块中时情况是不同的。 例如:
[APP] --> [A], [B] [B] --> [A]
在这种情况下, app.js
的require('a')
将parsing为比a.js
require('a')
不同的a.js
副本,因此返回A
的不同实例 。 有一篇博客文章更详细地描述了这种行为。
node.js有一些caching,实现了在执行一些巨大的服务器项目时阻止节点读取文件1000倍的时间。
这个caching在require.cache
对象中列出。 我必须注意到,这个对象是可读/写的,可以在不杀死进程的情况下从caching中删除文件。
http://nodejs.org/docs/latest/api/globals.html#require.cache
呃,忘了回答这个问题。 修改导出的对象不会影响下一次模块加载。 这会造成很大的麻烦…要求总是返回一个新的对象实例,不需要引用。 编辑文件并删除caching确实会改变导出的对象
做了一些testing之后,node.js会cachingmodule.exports。 修改require.cache[{module}].exports
一个新的,修改过的返回对象。
对于我所看到的,如果模块名称parsing为先前加载的文件,则caching模块将被返回,否则新文件将被单独加载。
也就是说, caching是基于得到解决的实际文件名 。 这是因为,一般来说,安装在文件层次结构不同级别的相同程序包可能有不同的版本,必须相应地加载。
我不确定的是,有些caching失效的情况并不在程序员的控制或意识之下,这可能会使无意中重新载入多个相同的包文件成为可能。
尝试drex : https : //github.com/yuryb/drex
drex正在观察模块的更新,并在更新之后干净地重新要求模块。 新代码被require()d视为新代码是一个完全不同的模块,所以require.cache不是问题。