我知道node.js在你第一次需要时会缓存一个模块。
var foo = require('foo');
app.get('/some-path', function(req, res){
// foo is taken from cache for every HTTP request to /some-path
var bar = foo('hello');
});
如果我将require()
放在路线中(如下所示),它是否也适用?这有利有弊吗?
app.get('/some-path', function(req, res){
var foo = require('foo');
var bar = foo('hello');
});
答案 0 :(得分:1)
这将会略微增加资源,因为它必须每次评估require()
,即使它们都从内存中返回相同的对象。第一种方式应该更快,更有效。
答案 1 :(得分:0)
将require
调用置于您的处理程序中可能并不会造成任何伤害。正如其他人所指出的那样,require
d模块被缓存在内存中,因此后续调用很快。
一个潜在的问题是,当应用程序启动时,模块没有被加载,但只有当第一个请求进入时,才可能导致第一个请求阻塞事件线程。
您的处理程序内部require
调用可能不是什么大问题。它通常只是一种风格问题。
正如Scimonster指出的那样,即使模块已经加载并缓存在内存中,对require
的重复调用也会慢一些(基于我的quick test慢约100倍),但除非你的呼叫正在紧急循环中发生,它可能永远不会影响你。
var iters = 100000;
// Many require calls
var start = process.hrtime();
for (var i = 0; i < iters; i++) {
require('fs');
}
console.log('Many require calls: ' + process.hrtime(start)[1]/1000000 + ' milliseconds');
// Many noop function calls
function noop() {};
var start = process.hrtime();
for (var i = 0; i < iters; i++) {
noop();
}
console.log('Many noop function calls: ' + process.hrtime(start)[1]/1000000 + ' milliseconds');
// Do nothing many times
var start = process.hrtime();
for (var i = 0; i < iters; i++) {
}
console.log('Do nothing many times: ' + process.hrtime(start)[1]/1000000 + ' milliseconds');
在OS X上运行节点v0.10.26的笔记本电脑上,我得到了:
Many require calls: 49.85532 milliseconds
Many noop function calls: 0.926823 milliseconds
Do nothing many times: 0.576822 milliseconds