2014-02-13 93 views
3

require ing模塊將阻止每一個單一的請求?根據docs,模塊在第一個require之後被緩存,但是我想查看是否在響應請求時執行動態require的反模式。我應該在迴應請求時避免調用require嗎?

+0

它是緩慢和多餘的。但是,這很好......如果你想要一個非常滯後,緩慢的Web服務:) – Markasoftware

+3

@Markasoftware:錯了。 'require()'緩存模塊,所以重複'require()'很快。 – SLaks

回答

3

不,它不會在每次請求(因爲您需要每次都在同一個模塊,只要)塊,這不是一個反模式。

如果您在每個請求中加載相同的模塊,則任何對require的調用都將立即返回(因爲該模塊已被加載,編譯和緩存)。但是,如果可能需要許多不同的模塊,以致於無法獲得緩存的好處,那麼執行異步請求可能會更好。

但是像這樣的東西?

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

沒什麼大不了的。這只是一個風格問題。

1

我經常被告知任何類型的阻塞都是node.js中的no-no,並且異步性是它的主要命令之一。你可以嘗試以下。

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) 
}) 
0

這不是慢或快。要求是同步操作。這意味着它將在執行時阻塞整個服務器。如果你有100000個連接,所有將等待100000個需求。

永遠不要使用內循環,這是不好的做法。

所以回答你原來的問題是。

相關問題