Nodejs を使用する場合、サードパーティ モジュールを参照することは避けられません。Nodejs に付属しているものもあります (例: http、net...)。また、npm で公開されているものもあります (例: mssql、elasticsearch...)。 )
この章では 3 つの問題に焦点を当てます:
Nodejs モジュールの読み込みプロセス。
アプリケーション起動のプロセス。
アプリケーションが依存モジュールをロードする方法。
1. モジュールの読み込み処理
Nodejsのモジュールは大きく4種類に分けられます:
a) 組み込みモジュール Nodejs内でC++形式で提供されるモジュール。
b) 定数モジュールは、Nodejs で定数を定義するモジュールです。
c) Nodejs の JavaScript 形式で提供されるネイティブ モジュール モジュール。
d) サードパーティモジュール サードパーティによって提供されるモジュール。
まず、組み込みモジュールとネイティブモジュールの生成プロセスを見てみましょう。
ネイティブ JS モジュールの生成は比較的複雑です。コンパイル後、node_natives.h が /out/release/obj/gen ディレクトリに生成されます。
このファイルは js2c.py によって生成され、Nodejs ソース コードの lib ディレクトリにあるすべての js ファイルを ASCII コードに変換し、対応する配列に保存します。
組み込み C++ モジュールの生成プロセスは比較的単純です。各組み込み C++ モジュール エントリは、マクロ NODE_MODULE_CONTEXT_AWARE_BUILTIN を通じて func に展開されます。たとえば、tcp_wrap モジュールの場合、静的 void register_tcp_wrap() に展開されます。属性(コンストラクター)関数。
GCC に詳しい友人は、属性 (コンストラクター) によって変更された関数が Nodejs の main() 関数の前に実行されることを知っています。言い換えれば、組み込み C++ モジュールは main() の前に modlist_builtin リストにロードされます。 modlist_builtin は struct node_module 型のポインタであり、get_builtin_module() は必要なモジュールを見つけるために走査します。
実際、それが単純な JS モジュールであっても、組み込みの C++ モジュールであっても、最終的には実行可能ファイルにコンパイルされます。 2 つの抽出方法はまったく異なります。js モジュールは process.binding('natives') を使用しますが、C++ モジュールは get_builtin_module() を直接使用します。
node.cc には binding() 関数が提供されています。 require() を使用して別のモジュールを参照すると、 binding() 関数が導入されます。この関数を分析してみましょう:
この関数が主に組み込み、定数、ネイティブの 3 つのモジュールを提供していることが視覚的にわかります。
builtin は最も高い優先度を持ち、modlist_builtin で検索されます。プロセスは非常に簡単で、リスト全体を調べて同じ名前のモジュールを検索するだけです。見つかった後、モジュールの登録関数が最初に実行され、その後データのエクスポートが返されます。
定数モジュールは 2 番目に優先され、Nodejs の定数定義は定数を通じてエクスポートされます。
ネイティブの優先度が最も低くなります。
2. アプリケーション起動処理
上の図は、test.jsをパラメータとして起動し、最後に実行するまでを記述したフローチャートです。全体のプロセスは 4 つのステップに分けることができます:
1. 実行可能ファイル ノード: 主に起動プロセス中の環境準備の役割を果たすノード エントリ
2.src/node.js: 起動スクリプト
3. ネイティブモジュール: モジュール用 .js の実行の準備
4.module.js: アプリケーションのロード、コンパイル、実行に使用されるネイティブ モジュール
アプリケーションが依存モジュールをロードする方法
前述したように、NativeModule.require () はネイティブ モジュールの参照を支援することのみを担当します。lib/module.js にはこれで十分です。
しかし、一般的なアプリケーションが matatives モジュールだけでなくサードパーティのモジュールも参照する必要があることは明らかです。 module.js の Module.prototype._require() 関数を見てみましょう。
関連する推奨事項:
nodejsのnodemailerモジュールの基本的な使い方 - 添付ファイルをサポートするメール送信サンプルコード(写真)
以上がNodejsモジュールのロードと動作原理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。