ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js での CommonJS モジュール仕様の使用法の概要

Node.js での CommonJS モジュール仕様の使用法の概要

伊谢尔伦
伊谢尔伦オリジナル
2017-07-24 10:20:501883ブラウズ

Javascript には本質的にモジュールという機能が 1 つ欠けており、CommonJS 仕様の登場によりこの欠点が補われています。 CommonJS 仕様の登場により、フロントエンドとバックエンドの Javascript を統合できるようになりました。 Node は CommonJS の Modules 仕様を利用して、非常に使いやすいモジュール システムを実装します。

1. CommonJS モジュール仕様

CommonJS モジュール仕様は 3 つの部分に分かれています:

1) モジュール参照: require() メソッドを通じてモジュールの API を現在のコンテキストに導入し、モジュール識別子を渡します。 var math = require('math');
2 など)。 モジュール定義: 現在のモジュールのメソッドまたは変数を、exports オブジェクトを通じてエクスポートします。モジュール内にはモジュール オブジェクトもあり、エクスポートは実際にはモジュールの属性です。 Node では、ファイルはモジュールであり、モジュール内の「グローバル変数」は外部からは見えません。exports.add = function() {}; のように、エクスポートにマウントされた属性のみが公開されます。 = 3.1415926;
3). モジュール識別: 実際には、上記の「math」など、require() に渡されるパラメーターであり、camel 命名法に準拠するか、「.」で始まる文字列である必要があります。 " 相対パスまたは絶対パス、ファイル名のサフィックス「.js」を付けることはできません

2. Node モジュールの実装プロセス

Node では、モジュールは 2 つのカテゴリに分けられます。1 つは Node 自体によって提供されるコア モジュールです。 、その他のクラスはユーザー自身が作成したファイル モジュールです。コア モジュールの一部は、Node のソース コードのコンパイル プロセス中にバイナリ ファイルにコンパイルされます。コア モジュールは、Node の起動時にメモリに直接ロードされるため、ロード速度が最も速くなります。ファイル モジュールは実行時に動的にロードされ、パス分析、ファイルの場所、コンパイルと実行の 3 つの手順が必要です。なお、Nodeは二次導入コストを削減するためにインポートしたモジュールをキャッシュしており、同一モジュールの二次ロードは最優先でキャッシュからロードする戦略を採用しています。

2.1 パス分析

パス分析は主に上記のモジュール識別子を分析します。モジュール識別子は主に次のカテゴリに分類されます:

1)、http、fs、path などのコアモジュール
2)、または。 / で始まる相対パス ファイル モジュール 3)、/ で始まる絶対パス ファイル モジュール 4)、ファイルまたはパッケージの形式のカスタム ファイル モジュール。ノードはモジュール パス配列 module.paths に従ってターゲット ファイルを 1 つずつ検索しようとします。通常、現在のディレクトリに沿ってルート ディレクトリまで段階的に node_modules という名前のディレクトリを検索します。そのため、これが最も時間のかかる方法です。それを見つけるために。

2.2 ファイルの場所

パス分析に基づいて、ファイルの場所は次の詳細に注意する必要があります:

1)、ファイル拡張子の分析: CommonJS 仕様では拡張子を入力しないモジュールの識別が許可されているため、Node は.jsを押し、.jsonと.nodeの順序が拡張子に対して不十分な場合は、

2)、ディレクトリ解析、パッケージ化の順に試してください: 上記のファイル拡張子解析後に対応するファイルが見つからないが、ディレクトリが取得された場合, Nodeはディレクトリをパッケージとして扱います


2.3 コンパイルと実行

特定のファイルを見つけた後、Nodeは新しいモジュールオブジェクトを作成し、パスに従ってロードしてコンパイルします。拡張機能が異なると、読み込み方法も異なります:

1)、.js ファイル: fs モジュールを通じてファイルを同期的に読み取り、コンパイルして実行します

2)、.node ファイル: これは C/C++ で書かれた拡張ファイルです。 dlopen() メソッドを通じてロードされます

3)、.json ファイル: fs モジュールを通じて同期的にファイルを読み取り、JSON.parse() を使用して解析して結果を返します
4)、その他の拡張ファイル: すべて としてロードされます。 js ファイル

各モジュール ファイルには、デフォルトで、require、exports、および module という 3 つの変数があることがわかっています。Node の API ドキュメントでも、各モジュールには、Where Did から派生した 2 つの変数 filename と dirname があることがわかっています。それはどこから来たのですか? Node のモジュールは、宣言された「グローバル変数」が実際に他のモジュールを汚染しないことをどのように保証するのでしょうか?実際、Node は JS モジュールのコンパイル中にファイルの内容の先頭と末尾をラップします。以下は、最初から最後までパッケージ化された JS ファイルの例です:

(function(exports, require, module, __filename, __dirname) {
    /* 中间是JS文件的实际内容 */
    var math = require('math');
    exports.area = function(radius) {
        return Math.PI * radius * radius;
    };
    /* JS文件的实际内容结束 */
});

このように、各モジュール ファイルはスコープ分離を持ち、require、exports、module などの変数もコンテキストに挿入されます。モジュールの。これは、CommonJS モジュール仕様の Node の実装です。 C/C++ モジュールとノード コア モジュールのコンパイル プロセスは比較的複雑なので、詳細は説明しません。

3. モジュール呼び出しスタック

以下の図に示すように、Node 内のさまざまなモジュールの呼び出し関係を明確にする必要があります:

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).test: 単体テスト ケースを保存するディレクトリ

4.2 パッケージ説明ファイル

パッケージ説明ファイルは JSON ファイル - package.json で、次の場所にあります。パッケージのルート ディレクトリはパッケージの重要な部分であり、パッケージの一般情報を記述するために使用されます。後で説明する NPM のすべての動作は、このファイルのフィールドと密接に関連しています。以下では、よく知られた Web フレームワーク Express プロジェクトの package.json ファイルを例として使用して、いくつかの一般的なフィールドの意味を説明します。

1).name: パッケージ名
2).description: パッケージの紹介
3).version: バージョン番号。「セマンティック バージョン管理」に準拠する必要があります。http://semver.org/
4) を参照してください。 dependency : 現在のパッケージを使用するために必要なパッケージのリスト。この属性は非常に重要です。NPM は、この属性を通じて依存パッケージを自動的に読み込みます
5).repositories: ソース コードがホストされている場所のリスト

他のフィールドの使用方法については、NPM package.json の説明を参照してください

4.3 NPM 共通機能

NPM (ノード パッケージ マネージャー)、よくノード パッケージ マネージャーと呼ばれます。その主な機能は、インストール、アンインストール、更新、表示、検索、リリースなどのノード パッケージを管理することです。

4.3.1 NPM パッケージのインストール

Node パッケージのインストールは、ローカル インストールとグローバル インストールの 2 種類に分けられます。 2 つの違いは次のとおりです:

1). ローカル インストール npm install 232e112a1ffb9f21e3b1b7ffee4c43c2: パッケージは現在のディレクトリにダウンロードされ、現在のディレクトリでのみ使用できます。
2). グローバル インストール npm install -g : パッケージは特定のシステム ディレクトリにダウンロードされ、インストールされたパッケージはすべてのディレクトリで使用できます。

4.3.2 NPM パッケージ管理

以下では、一般的に使用されるパッケージ管理コマンドをリストする例として grunt-cli (grunt コマンド ライン ツール) を取り上げます:

1).npm install: の依存関係と依存関係をインストールします。 package.json ファイル devDependency フィールドで宣言されたすべてのパッケージ
2).npm install grunt-cli@0.1.9: 特定のバージョンの grunt-cli をインストールします
3).npm install grunt-contrib-copy --save: インストールgrunt-contrib-copy、依存関係を package.json ファイルに保存します
4).npm uninstall grunt-cli: パッケージをアンインストールします
5).npm list: どのパッケージがインストールされているかを確認します
6).npm public

以上がNode.js での CommonJS モジュール仕様の使用法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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