フラットNodeLangモジュールは唯一の方法ではありません


この記事はPNPMの古いバージョンを扱います.記事の更新されたバージョンのためにgo here .
の新しいユーザーpnpm の奇妙な構造についてよく尋ねてくださいnode_modules pnpmが作成します.なぜフラットではないのですか?すべてのサブ依存関係はどこですか?

I am going to assume that readers of the article are already familiar with flat node_modules created by npm and Yarn. If you don't understand why npm 3 had to start using flat node_modules in v3, you can find some prehistory in Why should we use pnpm?.


では、なぜPNPMのnode_modules 大荷持ちが小荷持ちに銭借りる?つのディレクトリを作りましょうnpm install express その中でpnpm install express もう一方で.ここでは、最初のディレクトリに何を得るの先頭ですnode_modules :

ディレクトリ全体を見ることができますhere .
そして、これはあなたがnode_modules PNPMによって作成されます:

あなたはそれをチェックすることができますhere .
では、すべての依存関係はどこですか?中には1つだけのフォルダがありますnode_modules 呼ばれる.registry.npmjs.org と呼ばれるシンボリックリンクexpress . まあ、インストールのみexpress , これはアプリケーションがアクセスしなければならない唯一のパッケージです

Read more about why pnpm's strictness is a good thing here


何が中にあるか見ましょうexpress :
express がないnode_modules ? すべての依存関係はexpress ?
トリックはexpress はシンボリックリンクです.ノード.jsは依存性を解決します.そして、それは彼らの本当の場所を使用します.しかし、どこの本当の場所はexpress , お願いします.
こちらnode_modules/.registry.npmjs.org/express/4.16.3/node_modules/express .
ので、今私たちの目的を知っている.registry.npmjs.org/ フォルダ..registry.npmjs.org/ すべてのパッケージを平らなフォルダー構造に格納するので、すべてのパッケージがこのパターンで指定されたフォルダーで見つけることができます.
.registry.npmjs.org/<name>/<version>/node_modules/<name>
このフラットな構造は、ネストされたnode_modules NPMのv 2によって作成されたパッケージは、フラットとは異なり分離node_modules NPM v 3 , 4 , 5 , 6によって作成されます.
では、次の場所を見てみましょうexpress :

それは詐欺ですか.まだ欠けているnode_modules ! PNPMの第2のトリックnode_modules 構造体はパッケージの依存関係が依存するパッケージの本当の位置にある同じディレクトリレベルにあることです.したがって、express でない/express/4.16.4/node_modules/express/node_modules/ でも/express/4.16.4/node_modules/ :

すべての依存関係express は、node_modules/.registry.npmjs.org/ . 依存性の配置express つのレベルのアップは、円形のシンボリックリンクを回避することができます.
あなたが見ることができるようにnode_modules 最初は構造が異常らしい
  • それは完全にノードです.互換性の
  • パッケージは、依存性をうまくグループ化します
  • 構造は少しmore complex ピア依存関係を持つパッケージに対しては、そのアイデアは同じです.Symlinkを使用して、フラットディレクトリ構造の入れ子を作成します.
    試してみたい場合はpnpm , NPMで簡単にインストールできます.npm i -g pnpm . それからNPMの代わりに実行してください.pnpm install foo bar .