我开始在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.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
似乎它似乎共享模块,即使它是两个独立模块所需的,甚至可以跨模块和跨请求保持状态
答案 0 :(得分:5)
由于显而易见的性能原因,Node.js会缓存模块。
来自the Node.js website的声明:
模块在第一次加载后进行缓存。这意味着(除其他外)每次调用
require('foo')
将获得完全相同的返回对象,如果它将解析为同一文件。多次调用
require('foo')
可能不会导致模块代码多次执行。这是一个重要的特征。有了它,就可以返回“部分完成”的对象,从而允许加载传递依赖,即使它们会导致循环。 如果你想让模块多次执行代码,那么导出一个函数,并调用该函数。
答案 1 :(得分:2)
是的,所有模块在第一次加载后都会被缓存。您可以在official node.js docs中了解有关模块缓存的更多信息。