了解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.jsb.js都驻留在同一个项目中 (并在同一个目录中),那么它们都将接收到相同A 实例 。 从node.js文档 :

…每次调用require('foo')将返回完全相同的对象 ,如果它将parsing为相同的文件


a.jsb.jsapp.js不同的npm模块中时情况是不同的。 例如:

 [APP] --> [A], [B] [B] --> [A] 

在这种情况下, app.jsrequire('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不是问题。