設立以来、JavaScriptをプログラミング言語と見なした人はいませんでした。 Web 1.0 ERAでは、このスクリプト言語は主にフォーム検証とWebページの特殊効果に使用されていました。フロントエンドエンジニアがそれを使用してWebページのユーザーエクスペリエンスを大幅に改善するのは、Web 2.0 ERAになってから、JSが広く評価されていました。 JSがますます人気が高まるにつれて、ツールライブラリ、コンポーネントライブラリ、フロントエンドフレームワーク、フロントエンドアプリケーションの変更が大まかに行われます。 JavaScriptには本質的に機能が不足しています:モジュールと、CommonJS仕様の出現は、この欠点を補います。この記事では、CommonJS仕様とノードモジュールメカニズムを紹介します。
他の高レベルの言語では、Javaにはクラスファイルがあり、Pythonにはインポートメカニズムがあり、PHPには含まれています。 JSが<script>タグを介してコードを導入する方法は乱雑に思えます。過去には、人々は名前空間やその他の方法を使用してコードを人為的に制約する必要がありました。フロントエンドとバックエンドのJavaScriptが大きな統一を達成することができたのは、CommonJSの仕様が出現するまでではありませんでした。ノードは、非常に使いやすいモジュールシステムを実装するために、CommonJSのモジュール仕様を貸し出します。
1。CommonJSモジュール仕様
CommonJSモジュール仕様は3つの部分に分割されます。
1)。モジュールの参照:var math = require( 'math')などのモジュール識別子をrequire()メソッドを使用して、モジュールのAPIを現在のコンテキストに導入します。
2)。モジュール定義:エクスポートオブジェクトを介して現在のモジュールのメソッドまたは変数をエクスポートします。モジュールにはモジュールオブジェクトもあり、エクスポートは実際にはモジュールの属性です。ノードでは、ファイルはモジュールであり、モジュールの「グローバル変数」は外の世界には見えません。エクスポートなど、エクスポートに取り付けられた属性のみが公開されます。Add= function(){}; Exports.pi = 3.1415926;
3).MODULE ID:実際には、()を要求するために渡されたパラメーターです。たとえば、上記の「数学」は、ラクダの命名法に準拠する文字列でなければなりません。 ".."ファイル名の接尾辞 ".js"を持たないことができます
2。ノードモジュールの実装プロセス
ノードでは、モジュールは2つのカテゴリに分割されます。1つはノード自体によって提供されるコアモジュールで、もう1つはユーザー自身が作成したファイルモジュールです。一部のコアモジュールは、ノードソースコードのコンパイル中にバイナリファイルにコンパイルされます。ノードが起動すると、コアモジュールがメモリに直接ロードされるため、負荷速度が最速です。ファイルモジュールは実行時に動的にロードされ、パス分析、ファイルの場所、コンパイルと実行の3つのステップが必要です。 Node Cachesは、二次導入中にオーバーヘッドを減らすためのモジュールを導入し、同じモジュールの二次負荷に最も好ましい戦略を採用していることに注意してください。
2.1パス分析
パス分析は、主に上記のモジュール識別子を分析します。これは、主に次のカテゴリに分かれています。
1)HTTP、FS、パスなどのコアモジュール。
2)から始まる相対パスファイルモジュール。または 。
3) /で始まる絶対パスファイルモジュール
4)ファイルまたはパッケージの形であるカスタムファイルモジュール。ノードは、モジュールパスアレイモジュールに従ってターゲットファイルを1つずつ見つけようとします。パスは、通常、現在のディレクトリに沿ってルートディレクトリまで段階的に段階的に段階的にnode_modulesという名前のディレクトリを探しているので、これを見つけるのに最も時間のかかる方法です。
2.2ファイルの場所
パス分析に基づいて、以下の詳細に注意する必要があります。
1)ファイル拡張分析:CommonJS仕様ではモジュール識別子を入力しないようにするため、ノードは.JS、.JSON、および.NODEの順に試します
2)ディレクトリ分析とパッケージ:上記のファイル拡張機能分析の後に対応するファイルが見つからないが、ディレクトリが取得されない場合、ノードはディレクトリをパッケージとして扱います。
2.3編集と実行
特定のファイルを見つけた後、ノードは新しいモジュールオブジェクトを作成し、パスに従ってロードしてコンパイルします。さまざまな拡張機能の場合、読み込み方法は異なります。
1).jsファイル:FSモジュールを介してファイルを同期して読み取り、コンパイルして実行します
2).Nodeファイル:これは、dlopen()メソッドを介してロードされたc/c ++で記述された拡張ファイルです
3).jsonファイル:FSモジュールを介してファイルを同期して読み取り、json.parse()を使用して結果を解析して返します
4)その他の拡張ファイル:それらは.jsファイルとしてロードされます
各モジュールファイルには、デフォルトで必要、エクスポート、モジュールの3つの変数があることがわかっています。 Node APIドキュメントでさえ、各モジュールにはFilenameとDirnameの2つの変数もあることがわかっています。彼らはどこから来ますか?ノードモジュールは、宣言された「グローバル変数」が実際に他のモジュールを汚染しないことをどのように達成しますか?実際、NodeはJSモジュールのコンパイル中にファイルの内容を最初と最後にラップします。 JSファイルがヘッドとテールで包まれている例は次のとおりです。
コードコピーは次のとおりです。
(function(exports、require、module、__filename、__dirname){
/*中央はJSファイルの実際のコンテンツです*/
var math = require( 'math');
exports.area = function(radius){
return math.pi * radius * radius;
};
/* JSファイルの実際のコンテンツは終了します*/
});
このようにして、各モジュールファイルは分離されたスコープであり、必要性、エクスポート、モジュールなどの変数もモジュールコンテキストに注入されます。これは、NodeのCommonJSモジュール仕様の実装です。 C/C ++モジュールとノードコアモジュールの編集プロセスは比較的複雑ですので、再び繰り返しません。
3.モジュールコールスタック
下の図に示すように、ノード内のさまざまなモジュールの呼び出し関係を明確にする必要があります。
C/C ++の組み込みモジュールは、最低レベルのモジュールであり、コアモジュールに属します。主にJavaScriptコアモジュールとサードパーティのJavaScriptファイルモジュールを呼び出すAPIを提供します。実際、そのようなモジュールとはほとんど接触していません。 JavaScriptコアモジュールには2つの主な責任があります。1つは、ファイルモジュール呼び出し用のC/C ++の組み込みモジュールのカプセル化層とブリッジングレイヤーとして機能することであり、もう1つは基礎となるレイヤーに対処する必要のない純粋な機能モジュールです。ファイルモジュールは通常、通常のJavaScriptモジュールやC/C ++拡張モジュールを含む第三者によって記述されます。
4。パッケージとNPM
4.1パッケージ構造
パッケージは基本的にアーカイブファイル(通常.zipまたは.tar.gz)であり、これは解凍され、インストール後にディレクトリに復元されます。 CommonJSパッケージ仕様は、パッケージ構造とパッケージ説明ファイルの2つの部分で構成されています。 CommonJS仕様に完全に準拠するパッケージ構造には、次のファイルを含める必要があります。
1).package.json:パッケージ説明ファイル
2).bin:実行可能なバイナリファイルが保存されているディレクトリ
3).lib:JavaScriptコードが保存されるディレクトリ
4).DOC:ドキュメントが保存されているディレクトリ
5)。テスト:単体テストケースが保存されているディレクトリ
4.2パッケージ説明ファイル
パッケージの説明ファイルは、パッケージのルートディレクトリにあるJSONファイル-Package.jsonであり、パッケージの重要な部分であり、パッケージの概要情報を説明するために使用されます。後で言及されるNPMのすべての動作は、このファイルのフィールドに密接に関連しています。以下に、よく知られているいくつかのフィールドの意味を示す例として、よく知られているWebフレームワークExpressプロジェクトのPackage.jsonファイルを使用します。
1).NAME:パッケージ名
2).Description:パッケージの紹介
3).version:バージョン番号は「セマンティックバージョンコントロール」に準拠する必要があります。http://semver.org/を参照してください
4)依存関係:現在のパッケージが依存する必要があるパッケージのリストを使用します。このプロパティは非常に重要です。 NPMはこのプロパティを介して依存パッケージを自動的にロードします
5).repositories:ソースコードをホストするための場所のリスト
他のフィールドの使用は、npm package.jsonの説明を参照できます
4.3 npmの一般的な関数
NPM(ノードパッケージマネージャー)、一般にノードパッケージマネージャーとして知られています。その主な機能は、インストール、アンインストール、更新、表示、検索、公開など、ノードパッケージを管理することです。
4.3.1 npmパッケージのインストール
ノードパッケージのインストールには、ローカルインストールとグローバルインストールの2種類があります。 2つの違いは次のとおりです。
1)。ローカルインストールnpmインストール<パッケージ名>:パッケージは現在のディレクトリにダウンロードされ、現在のディレクトリでのみ使用できます。
2)。 Global Installation NPMインストール-G <Package -Name>:パッケージは特定のシステムディレクトリにダウンロードされ、インストールされたパッケージはすべてのディレクトリで使用できます。
4.3.2 npmパッケージ管理
以下は、例として、Grunt-Cli(Grunt Command Lineツール)を使用して、一般的に使用されるパッケージ管理コマンドのリストです。
1).NPMインストール:Package.jsonファイルの依存関係と開発のフィールドで宣言されたすべてのパッケージをインストールします
2).NPMインストール[email protected]:Grunt-Cliの特定のバージョンをインストールします
3).npm grunt-contrib-copyをインストールする - ゼーブ:grunt-contrib-copyをインストールし、パッケージへの依存関係を保存します。
4).NPM UNINSTALL GRUNT-CLI:アンインストールパッケージ
5).NPMリスト:インストールされているパッケージを確認します
6).NPM Pubration <Folder>:パッケージを公開します