我应该在回复请求时避免调用require吗?

时间:2014-02-13 03:35:42

标签: node.js

require模块是否会阻止每个请求?根据{{​​3}},模块在第一个require之后被缓存,但我想看看在响应请求时是否采用反模式来执行动态require

3 个答案:

答案 0 :(得分:3)

不,它不会阻止每个请求(只要你每次都需要相同的模块),而且它不是反模式。

如果您在每个请求上加载相同的模块,则对require的任何调用都将立即返回(因为该模块已经被加载,编译和缓存)。但是,如果可能需要许多不同的模块,以免您获得缓存的好处,那么执行异步需求可能会更好。

但是这样的事情呢?

function handler(req, res) { require('fs').readFile(…); }

没什么大不了的。这只是风格问题。

答案 1 :(得分:1)

我经常被告知,任何类型的阻塞都是node.js中的禁忌,异步性是其主要要求之一。您可以尝试以下方法。

non-blocking require in node.js

引用答案

这就是如何实施的要求:

> console.log(require.extensions['.js'].toString())
function (module, filename) {
     var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
     module._compile(stripBOM(content), filename);
}

您可以在自己的应用中执行相同的操作。我猜这样的事情会起作用:

var fs = require('fs')

require.async = function(filename, callback) {
  fs.readFile(filename, 'utf8', function(err, content) {
    if (err) return callback(err)
    module._compile(content, filename)

    // this require call won't block anything because of caching
    callback(null, require(filename))
  })
}

require.async('./test.js', function(err, module) {
  console.log(module)
})

答案 2 :(得分:0)

这不是慢或快。要求是同步操作。这意味着它将在执行时阻止整个服务器。如果您有100000个连接,则所有将等待100000个连接。

永远不要使用require inside循环,这是不好的做法。

所以回答原来的问题是肯定的。