簡體   English   中英

在Express.js應用程序中要求()的東西有多貴?

[英]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.exportsexports

每當第二次調用require請求位於同一位置時,它都會獲得與module.exportsexports相同的引用。

在您的特定情況下,代碼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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM