require
模块是否会阻止每个请求?根据{{3}},模块在第一个require
之后被缓存,但我想看看在响应请求时是否采用反模式来执行动态require
。
答案 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循环,这是不好的做法。
所以回答原来的问题是肯定的。