目前Express框架中的路由需要先加載模塊。但是,在有數百個模塊的現實生活場景中,這樣做效率不高。我想只加載所需的模塊。有沒有一種方法可以在不預先加載模塊的情況下定義到目標模塊的路徑。在沒有預先加載nodejs模塊中的模塊的情況下組織路由
像這樣
app.get( '用戶/ SHOWALL', 'user.list');
所以我想只有當這個特定的請求需要加載時才加載用戶模塊。
目前Express框架中的路由需要先加載模塊。但是,在有數百個模塊的現實生活場景中,這樣做效率不高。我想只加載所需的模塊。有沒有一種方法可以在不預先加載模塊的情況下定義到目標模塊的路徑。在沒有預先加載nodejs模塊中的模塊的情況下組織路由
像這樣
app.get( '用戶/ SHOWALL', 'user.list');
所以我想只有當這個特定的請求需要加載時才加載用戶模塊。
由於模塊必須在運行時加載,因此我寧願使用快速請求處理的啓動速度慢於使用慢速請求處理的快速啓動。
但如果你真的願意,你可以創建一箇中間件來實現這樣的行爲(沒有經過測試的):
var lazyload = function(route) {
var s = route.split('.');
var mod = s[0];
var exp = s[1];
return function(req, res, next) {
require(mod)[exp](req, res);
};
};
...
app.get('user/showall', lazyload('user.list'));
(假定路由始終命名爲MODULENAME.EXPORTEDNAME
)。
I second what @robertklep said「我寧願有一個緩慢的啓動與快速請求處理比快速啓動緩慢的請求處理」。
但我強烈建議不要做require
來處理請求,因爲第一個調用是同步的並會阻塞服務器,這不僅會影響當前請求,而且會阻止處理任何其他請求。有足夠的這樣的請求,並且您的服務器將停止應答請求。基本上:預加載您需要的所有代碼,但延遲加載數據(以異步方式)。
(這不是你要求的,但這會被認爲是不好的做法)。
我也想慢速啓動與快速請求處理。我對nodejs中模塊緩存的範圍並不確定(無論這些模塊是在單個http請求中的多個調用中緩存還是跨越多個http請求緩存),但我得到了我的答案。考慮到一旦加載模塊可用於所有後續調用,我的問題的一部分被回答。 – Rajiv 2013-02-28 09:38:19