NodeJS是否重用已经加载的模块并分享它的值?

我开始在NodeJS中构build我的项目,并想知道

  • NodeJS是否为需要相同模块的模块重新使用已经加载的模块?
  • 模块是否在需要它们的模块中保持相同的“状态”?
  • 如果其中一个或两个都发生了,那么这是什么 我在脸上凝视类似于循环和setTimeoutasynchronous代码的问题?

目前我已经testing了4个文件

  • common.js

     var i = 0; function add(v){i += v;} function view(){console.log(i);} module.exports = { add : add, view : view } 
  • a.jsb.js

     exports.common = require('./common.js'); 
  • server.js

     var a = require('./a.js'), b = require('./b.js'); function start(){ http.createServer(function (req, res) { a.common.add(2); a.common.view(); b.common.add(4); b.common.view(); a.common.view(); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(config.port, config.address || '127.0.0.1'); console.log('Server running'); } 

结果给了我一个暗示的结果:

 2 - view() via a.js on favicon request 6 - view() via b.js on favicon request 6 - view() via a.js on favicon request 8 - view() via a.js 12 - view() via b.js 12 - view() via a.js 

看起来它似乎共享模块,即使它是由两个单独的模块所需要的,甚至跨模块和跨请求保持状态

由于明显的性能原因,Node.jscaching模块。

来自Node.js网站的声明:

模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。

多次调用require('foo')可能不会导致模块代码被多次执行。 这是一个重要的function。 有了它,“部分完成”的对象可以被返回,从而允许传递依赖被加载,即使它们会导致循环。 如果你想要一个模块多次执行代码,那么导出一个函数,然后调用这个函数。

是的,所有模块在第一次加载后都被caching。 您可以在官方的node.js文档中阅读关于模块caching的更多信息。