Nodeのモジュールロード
2746 ワード
モジュール実装
CommonJSのモジュール仕様に従い、require()を使用してモジュールのapiを導入し、exportsを使用してモジュールのメソッド、変数をエクスポートします.moduleオブジェクトはモジュール自体を表し、exportsはその属性です.
Node導入モジュールは、パス解析、ファイルの位置決め、コンパイルによって実行され、導入されたモジュールに対してコンパイルおよび実行後のオブジェクトがキャッシュされ、ロード時にキャッシュが優先され、コアモジュールのみがキャッシュされます.カスタムモジュール(サードパーティ製パッケージ)のロードが最も遅いので、node_を上へ逐次再帰的に検索します.modulesディレクトリ
Require()にファイル拡張子が含まれていないことを許可するため、Nodeは
require()ファイル拡張子を解析してもファイルは検出されませんが、ディレクトリが取得されます.この場合、Nodeはディレクトリをパッケージとして処理します.現在のディレクトリの下でpackage.json(CommonJSで規定されたパッケージ記述ファイル) を検索 JSON.parse()解析によりmain属性で指定したファイル名を取り出し、拡張名がなければ拡張名 を遍歴する.
mianプロパティがファイル名を誤って指定し、package.jsonファイルがない場合、Nodeはindex.をデフォルトファイル名として、順次拡張名を検索、遍歴します.
ディレクトリの解析に成功しなかった場合は、次のモジュールパスを検索し、モジュールパスが見つかりませんでした.
モジュールコンパイル
このように各モジュールは役割ドメインとして分離され、パッケージされたコードはvmオリジナルモジュールrunInThisContext()によって実行され、functionオブジェクトを返し、現在のモジュールオブジェクトのexports属性、require()、module、ファイルの完全なパス、およびファイルディレクトリをパラメータとしてfunction()に渡す.最後に呼び出し元がexportsプロパティを取得しました
**exportsとmodule.exportsの違い**exportsオブジェクトはパラメータ形式で渡され、直接付与された値は役割ドメイン外の値を変更しません.module.exportsオブジェクトに値を割り当てる必要があります.exportsプロパティに値を割り当てるのは問題ありません.
コンパイルされたモジュールを、Module.cacheオブジェクトにファイルパスをインデックスとして保存します.
コアモジュールは、通常、ユーザによって呼び出されないため、コアモジュールの中でc/c++で純粋に書かれたものをビルドモジュールと呼ぶ. 部分モジュールはc/c++によってコア部分を記述し、jsは包装、導き出し性能を向上させる を実現する.
Nodeはv 8のjs 2 c.pyを使用して、すべての内蔵jsをc++の配列に変換し、node_を生成します.natives.shヘッダファイルは、Node起動時にメモリを追加し、require()に従ってロード、実行します.NativeModuleにキャッシュされたヘッドエンドパッケージも経験します.Cacheオブジェクト上
NPM
CommonJSのモジュール仕様に従い、require()を使用してモジュールのapiを導入し、exportsを使用してモジュールのメソッド、変数をエクスポートします.moduleオブジェクトはモジュール自体を表し、exportsはその属性です.
: 、
Node導入モジュールは、パス解析、ファイルの位置決め、コンパイルによって実行され、導入されたモジュールに対してコンパイルおよび実行後のオブジェクトがキャッシュされ、ロード時にキャッシュが優先され、コアモジュールのみがキャッシュされます.カスタムモジュール(サードパーティ製パッケージ)のロードが最も遅いので、node_を上へ逐次再帰的に検索します.modulesディレクトリ
Require()にファイル拡張子が含まれていないことを許可するため、Nodeは
.js、.node、.json ,
に従い、fsモジュール同期ブロックを呼び出してファイルが存在するかどうかを判断する必要があります.Node単一スレッドによるパフォーマンスの問題、 .node、.json
カタログとパッケージの分析require()ファイル拡張子を解析してもファイルは検出されませんが、ディレクトリが取得されます.この場合、Nodeはディレクトリをパッケージとして処理します.
mianプロパティがファイル名を誤って指定し、package.jsonファイルがない場合、Nodeはindex.をデフォルトファイル名として、順次拡張名を検索、遍歴します.
ディレクトリの解析に成功しなかった場合は、次のモジュールパスを検索し、モジュールパスが見つかりませんでした.
モジュールコンパイル
.js fs
,Nodeは取得したjsファイルの内容を頭と尾で包装した.(function(exports,require,module,__filename,__dirname){//
var math=require('math');
});
このように各モジュールは役割ドメインとして分離され、パッケージされたコードはvmオリジナルモジュールrunInThisContext()によって実行され、functionオブジェクトを返し、現在のモジュールオブジェクトのexports属性、require()、module、ファイルの完全なパス、およびファイルディレクトリをパラメータとしてfunction()に渡す.最後に呼び出し元がexportsプロパティを取得しました
**exportsとmodule.exportsの違い**exportsオブジェクトはパラメータ形式で渡され、直接付与された値は役割ドメイン外の値を変更しません.module.exportsオブジェクトに値を割り当てる必要があります.exportsプロパティに値を割り当てるのは問題ありません.
var change = function(a) {
a = 100;
console.log(a); // => 100
};
var a = 10;
change(a);
console.log(a); // => 10
.node c/c++ , dlopen()
はwindows、*nixで異なる実現があり、libuv互換層パッケージを通じて、実際にコンパイルする必要はありません.それはc/c++コンパイルによって生成され、ロード、実行さえすれば、exportsオブジェクトは直接.nodeと連絡し、実行効率が高いです..json fs , JSON.parse() , exports
、JSONファイルに対して直接require()を使うのはfsより効率的ですコンパイルされたモジュールを、Module.cacheオブジェクトにファイルパスをインデックスとして保存します.
コアモジュール
Nodeはv 8のjs 2 c.pyを使用して、すべての内蔵jsをc++の配列に変換し、node_を生成します.natives.shヘッダファイルは、Node起動時にメモリを追加し、require()に従ってロード、実行します.NativeModuleにキャッシュされたヘッドエンドパッケージも経験します.Cacheオブジェクト上
NPM
package.json
dependencies npmこの自動ロード依存パッケージに基づいて、scriptsはパッケージマネージャがパッケージ(フックコマンド、preinstallなど)devDependencies開発時の依存パッケージをインストール、コンパイル、テスト、アンインストールするために使用されます.binコマンドラインツール -g
は、パケットをrequire()からグローバルに使用可能な実行コマンドに変更します.
npm install package.jsonの場所を指定し、npm install[pg]--registry=http://registry.url あるいはミラーソースnpm config set registryを直接採用するhttp://registry.url NPM