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

时间:2012-08-21 11:19:11

标签: javascript node.js

我开始在NodeJS中构建我的项目并且想知道

  • NodeJS是否为需要相同模块的模块重用已加载的模块?
  • 模块是否在需要它们的模块之间保持相同的“状态”?
  • 如果其中一个或两个都发生了什么?面对一个类似于循环和setTimeout 以及 async 代码的问题?

目前我已经测试了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

似乎它似乎共享模块,即使它是两个独立模块所需的,甚至可以跨模块和跨请求保持状态

2 个答案:

答案 0 :(得分:5)

由于显而易见的性能原因,Node.js会缓存模块。

来自the Node.js website的声明:

  

模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require('foo')将获得完全相同的返回对象,如果它将解析为同一文件。

     

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

答案 1 :(得分:2)

是的,所有模块在第一次加载后都会被缓存。您可以在official node.js docs中了解有关模块缓存的更多信息。