2016-11-04 5 views
0

require()を使用してExpressJSでパッケージをインポートする際に混乱があります。 私はいくつかのパッケージを含めていました。 nodemailerbcryptjsをローカルに呼び出します。つまり、関数内にrequireを呼び出します。だから、私はrequireを1回のルートファイルに何回も書き込まなければならなかった。NodeJS(ExpressJS)では 'require()'をローカルまたはグローバルに使用する必要がありますか?

requireステートメントは、そのルートファイルの先頭またはapp.jsファイルのいずれかに1回だけ入力するようにしてください。私は少し混乱している。誰かがrequireパッケージをmiddlwares内に収める最良の方法を提案してもらえますか?

例コード: 私はミドルウェア機能で電子メールを送る必要があります。

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)に1回必要ですか? しかし、非常に頻繁には使用されないrequire('ObjectID')のようなケースがあります。そのようなパッケージもグローバルに要求されるのは良いでしょうか?

ありがとうございました。

+0

あなたが同僚かもしれませんが、あなたのコードを表示していない場合、私たちはshureを教えることはできません。 – 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に感謝しますが、条件付きでモジュールを含めることが説明されています。私の質問は、関数内またはルートファイルの先頭やapp.jsの中でモジュールをrequireする必要があるかどうかです。 –

+0

@MohitBhardwaj thneそれは問題ではありません。スタイルtbhの好み。 C++のネームスペースと同じです。名前空間globalyを使用して呼び出しているか、常に接頭辞を使用しています。こっちも一緒。モジュールはキャッシュされ、あなたのメモリには負けません。 –

1

require( 'requiredFile/requiredModule');ファイルのコンテキストを返し、エクスポートされたモジュールをrequiredFileまたはrequiredModuleから公開します。

モジュールをグローバルレベルで使用する場合は、requireを呼び出してapp.use()内で呼び出して、要求が処理されるたびに使用できるようにします。

しかし、特定のファイルに対してローカルで使用したい場合は、ファイルの先頭にそのファイルを必要とし、変数にキャッシュしてから、その変数をファイル全体で使用します(サンプルに書いたものに似ていますコード)

+0

おかげでVishal。私はまだちょっと混乱しています。私は3つのルートファイルを持っていて、それらのすべてがいくつかのミドルウェアで 'nodemailer'を必要とすると仮定します。 app.jsまたは各ルートファイルの先頭に定義する必要がありますか? –

+1

ノードメーラーを3つの別々のファイルで、すべての要求(ミドルウェアとして)で使用する場合は、別々のファイルでそれを要求します。 たとえば、各リクエストで使用する認証モジュールがいくつかありますが、app.jsで必要になります –

関連する問題