7

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

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

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

即使两个单独的模块需要它,它似乎也确实共享模块,甚至跨模块和跨请求保持状态

4

2 回答 2

5

Node.js 出于明显的性能原因缓存模块。

来自Node.js 网站的声明:

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

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

于 2012-08-21T11:33:21.023 回答
2

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

于 2012-08-21T11:33:10.037 回答