[英]How expensive is it to require() something within an Express.js app?
我有一個Express.js網絡應用程序正在為我的某個域提供服務。 app.js
文件如下所示:
var express = require('express');
var app = express();
// and so on…
我想在app.js
文件中使用我自己的一個函數,所以我想我將函數放在一個單獨的文件中(作為一個模塊,即module.exports =
stuff)然后在app.js
需要它app.js
文件:
var myfunc = require('./path/to/myfunc');
但是,我擔心表現。 在Express.js應用程序中需要文件時是否會有明顯的性能損失? 我想這個問題可歸結為app.js
代碼的執行次數 - 每個HTTP請求一次,或者在初始化期間只執行一次,以及是否在HTTP請求之間以某種方式緩存require()
結果。
您require
代碼將被提取並執行一次 。 之后,您將獲得module.exports
或exports
。
每當第二次調用require
請求位於同一位置時,它都會獲得與module.exports
或exports
相同的引用。
在您的特定情況下,代碼require
d,而引導應用程序require
d一次,同時引導。
然后,每當一個請求require
什么東西還沒有被require
尚未ð,它會獲取和執行。 在此之后的每一次, require
調用只會獲取緩存的數據。
還記得節點是如何單線程的嗎? 這就是為什么如果你試圖require
一個不存在的文件,你就會把整個過程都搞砸了。
回答Šime的問題,關於“何時” require
呼叫被執行。
require
在執行代碼時執行調用,因為沒有預處理或任何花哨的魔法。 如果請求有權訪問該范圍,則整個過程將有效地“共享”所有不屬於請求的內容。
我們來看一個例子。 假設這是你的app.js
,為了簡潔,我忽略了所有不相關的快速引導代碼。
var a = require('./foo.js'); // [1]
app.get('/thing', function (req, res, next) {
next(); // [2]
});
app.get('/thing', function (req, res, next) {
res.end();
});
app.get('/foo', function (req, res, next) {
res.end(a); // [3]
});
[1]立即獲取foo
,就像foo
require
的任何東西一樣, module.exports
被賦值給a
。
[2]當調用此回調時,我們只是告訴express
,什么都不做,跳過我並轉到下一個中間件。
[3]假設a
字符串分配給foo
module.exports
,它對/foo
請求是完全可訪問的。
你需要考慮的是這些函數只是回調express
保持引用,並在它到達它們中的特定一個時調用它們。 它們按順序處理,直到你調用next
,然后進入下一個中間件。 如果你不打電話給next
,你應該結束回復。
我不確定你認為生命周期是如何工作的,但它可能不會像你想象的那樣工作。 節點只是坐着等待請求進入,然后一次處理一個,它永遠不會停止,它永遠不會真正“重新加載”任何東西。
來自文檔 :
模塊在第一次加載后進行緩存。 這意味着(除其他外)每次調用require('foo')將獲得完全相同的返回對象,如果它將解析為同一個文件。
第一次加載后, require
調用的唯一額外開銷是解析文件的路徑。 按照慣例,所有呼叫require
被放置在文件的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.