Javascript NodeJ是否重用已加载的模块并共享它';s的价值观?

Javascript NodeJ是否重用已加载的模块并共享它';s的价值观?,javascript,node.js,Javascript,Node.js,我开始在NodeJS中构建我的项目,我想知道 NodeJS是否对需要相同模块的模块重用已加载的模块 模块是否在需要它们的模块之间保持相同的“状态” 如果其中一个或两个都发生了,有什么问题?我面临着一个类似于循环和setTimeout以及异步代码的问题 目前我已经测试了4个文件 common.js var i = 0; function add(v){i += v;} function view(){console.log(i);} module.exports = { add

我开始在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
    }
    
    exports.common = require('./common.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');
    }
    
  • a.js
    b.js

    var i = 0;
    
    function add(v){i += v;}
    function view(){console.log(i);}
    
    module.exports = {
        add : add,
        view : view
    }
    
    exports.common = require('./common.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');
    }
    
  • server.js

    var i = 0;
    
    function add(v){i += v;}
    function view(){console.log(i);}
    
    module.exports = {
        add : add,
        view : view
    }
    
    exports.common = require('./common.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.js缓存模块显然是出于性能原因

声明来自:

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

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


foo
bar
从哪里来?@Amberlamps编辑。我在代码中使用了
foo
bar