機構を搭載1. NPMモジュール。
- 発行
npm install
コマンドを - ディレクトリの問い合わせnode_modules内の特定のモジュールが存在するかどうか
- なくなった場合は、再インストールしていません
- もしそこに
- レジストリクエリモジュール圧縮されたパッケージにNPMのURL
- ルートディレクトリに格納され、アーカイブをダウンロード
.npm
ディレクトリ - 現在のプロジェクトにアーカイブを解凍
node_modules
ディレクトリ
2. NPMの実装原理
NPMコマンドをインストールしてQiaoxiaを入力します入力した後、(例えばNPM 5.5.1で)、次の段階を経ます:
- プロジェクト自体の実装では、プレインストール
定義された現在のプロジェクトNPMはフックをプレインストールした場合、この時間は、実行されます。
- 一階の依存決意モジュール
まず行う必要があるプロジェクト一階に依存し、すなわち、依存関係とdevDependenciesプロパティを直接指定されたモジュール(無添加NPMパラメータをインストールしないと仮定)を決定することです。
プロジェクト自体がツリーの全粒依存ルートで、各モジュールは、マルチノード・プロセスを開きますNPMは徐々に各モジュールからのより深いレベルが第1の床に依存検索し始めたルートノードの下のサブツリーの一階に依存しています。
- 取得モジュール
取得モジュールは、以下のステップに分け、再帰的なプロセスです。
- 取得モジュール情報。モジュールをダウンロードする前に、我々は最初のバージョンを決定する必要がありますpackage.jsonはセマンティックバージョン(semver、セマンティックバージョン)であるので、それはしばしばです。この時点で、倉庫から取得できない場合は、直接、取ることができ、モジュールのバージョン情報の説明ファイル(NPM-shrinkwrap.jsonまたはパッケージ-lock.json)がある場合。このようなパッケージ^ 1.1.0にバージョンpackaeg.jsonとして、NPMは、アコードの1.xxのフォームの最新バージョンを入手するために倉庫に行きます。
- 取得モジュールエンティティ。Previous'llアーカイブモジュールアドレス(解決フィールド)を取得、NPMはこのアドレスを使用して、ローカルキャッシュをチェックします、キャッシュは倉庫からのダウンロードが存在しない場合は、直接を取ることがあります。
- その後、停止しない場合は、ステップ1に戻り依存がある場合、モジュールは、依存して下さい。
- 平坦化モジュール(重複排除など)
前のステップで取得するリピートモジュールの多数を含むことができる完全な依存性ツリーです。モジュールBモジュールもlodashに依存し、そのようなloadshに依存します。前npm3に設置されたツリー構造に基づいて厳格に依存し、それはモジュールの冗長性の原因となります。
開始npm3のデフォルトから、重複排除のプロセスに参加しました。これは即ち、第1層のノードモジュール、モジュール一つ一つのルートノード下のすべてのノードを横断します。モジュールが重複して発見された場合、それは破棄されます。
これは、同じモジュール名とsemver互換性を指すリピートモジュールの定義であるべきです。各期間は、交差点の範囲を可能にするために2つのモジュールのバージョンが存在する場合、それは互換性のあるバージョンを入手することができ、許容範囲バージョンsemver対応し、バージョン番号は同一である必要はなく、より多くの冗長モジュールがプロセス重複排除に除去させることができます。
例えば、モジュールの依存関係lodashする@ FOOノードモジュール^ 1.0.0、バーモジュールの依存関係lodash@^1.1.0、^は、互換性のあるバージョン1.1.0です。
fooがlodash @ ^ 2.0.0、バー依存lodash@^1.1.0を依存している場合は、その後、互換性のあるバージョンが存在しない、どちらもsemver規則に従って。それはnode_modulesのバージョンになり、もう一方は、ツリーに依存したまま。
たとえば、これは元々依存ツリーだったと仮定します。
node_modules
- fooの
---- lodash @ VERSION1
-バー
---- lodash @バージョン2
バージョン1バージョン2の前提と重複排除は次の形式になります後、互換性のあるバージョンのとおりです。
node_modules
- FOO
- バー
- lodash(予約済みバージョン互換性のあるバージョン)
VERSION1 VERSION2と非互換性のあるバージョンを仮定し、バージョンは、依存関係ツリーの後ろに残っています:
node_modules
- FOO
- lodash @ VERSION1
-バー
---- lodash @バージョン2
- インストールモジュール
このステップは、(順番にプレインストール、インストール、インストール後の)機能のライフサイクルにおけるプロジェクトnode_modulesを更新し、実行モジュールます。
- プロジェクトのライフサイクル自体の実装
あなたは、現在のプロジェクトのNPMフックを定義した場合、この時間は、(インストールに応じて、インストール後、prepublish、オーダーを準備)が実行されます。
最後のステップは、発生以降、プロファイル、NPMプロセスが完了し、インストールすることです。
参考http://www.ruanyifeng.com/blog/2016/01/npm-install.html