ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejsモジュールのロードと動作原理の詳細な説明

Nodejsモジュールのロードと動作原理の詳細な説明

小云云
小云云オリジナル
2018-02-24 09:07:272780ブラウズ

Nodejs を使用する場合、サードパーティ モジュールを参照することは避けられません。Nodejs に付属しているものもあります (例: http、net...)。また、npm で公開されているものもあります (例: mssql、elasticsearch...)。 )

この章では 3 つの問題に焦点を当てます:

  1. Nodejs モジュールの読み込みプロセス。

  2. アプリケーション起動のプロセス。

  3. アプリケーションが依存モジュールをロードする方法。

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を深く理解する

nodeJSはWeChat機能共有を実装します

以上がNodejsモジュールのロードと動作原理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。