isN*_*247 11 javascript memory-management node.js express
我过去已经对JavaScript内存管理做了一些阅读,并且意识到循环DOM引用的问题等.
但是我仍然有点不舒服,因为这转换为服务器端JavaScript环境,例如node.js,更具体地说是写在express上的API .
var npm_moduleA = require('npmA')({ someInitArg : 'blah' }),
app = express.createServer();
app.get('/api/foo', function (req, res) {
var result = npm_moduleA.doSomething();
res.send(result);
});
app.get('/api/bar', function (req, res) {
var npm_moduleB = require('npmB')({ someInitArg : 'blah' }),
result = npm_moduleB.doSomethingElse();
res.send(result);
});
Run Code Online (Sandbox Code Playgroud)
什么是生命周期npm_moduleA?它能够在瞬间创建的服务器启动,但是当(如果有的话确实GC踢反对) -我猜测,它从来没有被感动,因为它在全球范围内?
在'/ api/bar /'中,npm_moduleB每次请求后都应该删除吗?或者这应该留给GC单独使用.
全局实例化是否npm_moduleA比重复实例化(以及可能的删除)明显更有效npm_moduleB?
随着Node.js的不会创建和销毁每个调用运行背景下,这样既npm_moduleA和npm_moduleB将生活(高速缓存),直到你杀的服务器.
事实上,无论您在哪里需要模块,它只是获得指向模块入口点的指针.它不会在运行时实例化任何事情.
这是一个例子:
index.js
var t = require('./module.js');
t.value = 10;
function test() {
var t2 = require('./module.js');
console.log(t2.value);
}
test();
Run Code Online (Sandbox Code Playgroud)
module.js
module.exports = {};
Run Code Online (Sandbox Code Playgroud)
控制台输出:
10
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只需将您的require()放在全局范围内一次.不需要在回调中,因为require()有一些文件名解析工作要做,并且它与全局范围中的require没有区别(在任何方面).
但是如果你打算上课new SomeClass(),那么你做的事情很重要.