大規模なWebアプリの場合npm install
それぞれyarn install
には多くの時間がかかります。ほとんどの場合、Linking Dependencies
。ここで何が起きてるの?依存関係の依存関係を取得していますか?それとも完全に異なるものですか?このステップでどのファイルが作成されますか?
yarn install
を呼び出すと、次のことが順番に発生します。
Resolution:Yarnは、レジストリに要求を行い、各依存関係を再帰的に検索することにより、依存関係の解決を開始します。
Downloading/Fetching:次に、Yarnはグローバルキャッシュディレクトリを調べて、必要なパッケージが既にダウンロードされているかどうかを確認します。そうでない場合、Yarnはパッケージのtarballを取得し、グローバルキャッシュに配置します。これにより、オフラインで動作し、依存関係を複数回ダウンロードする必要がなくなります。依存関係は、完全なオフラインインストール用のtarballとしてソース管理に配置することもできます。
リンク:最後に、Yarnは、既に存在するものと存在しないものを特定した後、必要なすべてのファイルをグローバルキャッシュからローカルnode_modulesディレクトリにコピーすることにより、すべてをリンクします。
yarn install
には多くの時間がかかります。主にLinking Dependencies
と呼ばれるステップで
Step 3: Linking
は、実際のダウンロードが発生するStep 1: Resolution
およびStep 2: Fetching
よりも時間がかかることに注意してください。このステップでは、準備とダウンロードが必要なものが既にありますが、なぜ時間がかかるのですか?
はい、[〜#〜] copy [〜#〜]ローカルプロジェクトをnode_modules
フォルダーに......!この理由は、このコピーが1つの大きな4.7GB ISOファイルのコピーと同等ではないためです。代わりに、複数の非常に小さなファイルです(複数と言うときは軽くしないでください、15k +ファイル:Pになる可能性があります)。したがって、コピーに時間がかかります。 (また、パッケージをダウンロードするとき、パッケージごとに1つの大きなtarファイルをダウンロードすることに注意することが重要です。そのファイルはキャッシュに抽出されるので、時間がかかります)
により遅い
しかし、これは効率的ですか?グローバルnode_modulesから取得できますか(作成後)?
両方の質問にいいえ。ノードが機能する方法のため、各パッケージは、自身の場所に関連する依存関係のみを見つけます。また、各プロジェクトは同じパッケージの異なるバージョンを使用して、適切に動作し、パッケージの更新によって破損しないようにする必要がある場合があります。
理想的には、プロジェクトフォルダは無駄のないものでなければなりません。これを行う効率的な方法は、globalnode_modules
フォルダーを持つことです。要求されたパッケージがまだ存在しない場合はダウンロードされ、この場所から使用されます。実際、Ruby
はこのようにします。ここに私のグローバルRubyに相当するnode_modules
フォルダーがあります。異なるプロジェクトで使用する同じパッケージの異なるバージョンが存在することに注意してください。
ただし、プロジェクトの移植性が低下することに注意してください。これは、マネージャー(rubygemsまたはノードモジュール)が行う必要のあるトレードオフです。ノードプロジェクトフォルダーをコピーするだけです((ローカル)node_modules
フォルダーもコピーするため、実際には数時間かかることがありますが、そのプロジェクトフォルダーだけがあれば、それが機能することを期待できます) Rubyプロジェクトは数秒から数分になります。ローカルパッケージ(またはそれらを呼び出すGem)フォルダーがないためですが、異なるシステムでプロジェクトを実行するにはこれらのパッケージが必要です。グローバルgemsフォルダーに存在します。
リンクフェーズは、基本的に3つの大きなステップで機能します。
たぶん、Githubのこの問題はあなたを助けるでしょう。