在Express路由中放置require()

时间:2014-05-06 17:23:49

标签: node.js express

我知道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');
});

2 个答案:

答案 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