NodeJS是否重用已经加载的模块并分享它的值?
我开始在NodeJS中构build我的项目,并想知道
- NodeJS是否为需要相同模块的模块重新使用已经加载的模块?
- 模块是否在需要它们的模块中保持相同的“状态”?
- 如果其中一个或两个都发生了,那么这是什么 我在脸上凝视类似于循环和
setTimeout
和asynchronous代码的问题?
目前我已经testing了4个文件
-
common.js
var i = 0; function add(v){i += v;} function view(){console.log(i);} module.exports = { add : add, view : view }
-
a.js
和b.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的更多信息。