2016-11-04 102 views
0

我對使用require()在ExpressJS中導入包有困惑。 我包括一些軟件包,例如nodemailer,bcryptjs,即在其內部調用require。所以,我不得不在require他們多次在一個單一的路線文件。在NodeJS(ExpressJS)中,'require()'應該在本地還是全局使用?

一位同事建議所有require語句應該只出現一次,無論是在該路由文件的頂部還是在app.js文件中。我有點困惑。有人可以建議在中間件內使用require包裝的最佳方式。

示例代碼: 假設例如我需要在中間件功能中發送電子郵件。我對這個代碼,如下所示:

var nodemailer = require("nodemailer"); 
       var mailTransport = nodemailer.createTransport(); 
       var mailOptions = { 
        from: constants.mail_sender_email, 
        to: constants.user_won_recipient_mails, 
        subject: templateContext.subject, 
        text: subject + ".\n", 
        html: results.html 
       }; 

每次我需要發送一封電子郵件,我再次使用require('nodemailer')聲明。我是否應該在該路線文件中需要一次,即index.js或可能在app.js? 但是,有些情況下,如require('ObjectID'),這是不經常使用。全球需要這樣的軟件包也會不錯?

感謝。

+0

你同事最有可能是正確的,但是如果你不顯示你的代碼,我們不能告訴你。 – BetaRide

+1

[從應用程序初始化開始就不需要'模塊](https://github.com/alanjames1987/Node.js-Best-Practices#never-require-modules-after-app-initialization) – str

+1

模塊被緩存,所以沒有通過多次包括某些東西來懲罰性能。 –

回答

0

那麼這裏就是一個例子。

http.createServer(yourCallback(req, res) 
{ 
    if(req.Host == "a") 
    { 
     require("moduleA")(req, res); 
    }else 
    { 
     require("moduleB")(req, res); 
    } 
}).listen(80); 

在這種情況下,服務器將選擇使用哪個模塊。例如,您有多個主機,並且您通過js模塊創建該主機。所以你不需要將你的所有主機文件導入到應用程序中。完成後垃圾收集器將其拿走。

萬一你知道你將要使用模塊很多。那麼你只需將其聲明爲全局模塊。如fs,http等。

+0

當我們希望代碼決定在哪種條件下需要哪個模塊時,這非常有用。 對於文件的條件需求,這很好。 –

+0

感謝Anton,但是這解釋了包括有條件的模塊。雖然我的問題是我們是否應該更喜歡功能內部或路徑文件頂部的'require' -ing模塊,或者app.js. –

+0

@MohitBhardwaj thne它沒關係。喜歡風格tbh。它就像C++中的namepsaces一樣。你要麼全局使用名稱空間來調用,要麼你始終使用前綴。同樣在這裏。模塊緩存,不會打你的記憶。 –

1

require('requiredFile/requiredModule');返回文件的上下文,並從requiredFile或requiredModule中公開導出的模塊。

如果您想在全局級別使用該模塊並在app.use()中調用它,以便您可以在每次處理請求時使用它。

但是,如果你想在本地使用它來獲得一個特定的文件,那麼需要它在文件的頂部並將其緩存在一個變量中,然後在整個文件中使用該變量(類似於你在樣本中寫的內容代碼)

+0

感謝您的解釋Vishal。我仍然有點困惑。假設我有3個路由文件,所有這些文件在一些中間件中都需要'nodemailer'。我應該在app.js中還是在每個路徑文件的頂部定義它? –

+1

如果您想在3個單獨的文件中使用節點郵件程序,但是在每個請求中(作爲中間件),則需要在單獨的文件中使用它。 例如,有一些驗證模塊必須用於每個請求,然後它將在app.js中被需要。 –

相關問題