パッケージ マネージャーの領域には、次の 3 つの主要なプレーヤーがあります。
npm
Yarn
ハイパフォーマンス npm (pnpm)
実際には、すべてのパッケージ マネージャーに基本的に同様の機能が実装されているため、機能以外の要件に基づいてどれを使用するかを決定する可能性が高くなります。 パッケージ マネージャー、インストール速度、ストレージの消費、実用性など。
もちろん、各パッケージ マネージャーの使用方法は異なりますが、基本的にはすべてのパッケージ マネージャーに一貫した概念があります。上記のパッケージ マネージャーはすべて、次のコマンドを実行できます。
ただし、それにもかかわらず、パッケージ マネージャーは内部的には異なります。従来、 npm
とYarn
依存関係をフラットな node_modules フォルダーにインストールしていました。 (こちらの注文に注意してください。 yarn
最初にタイル張り、 npm
以前に再帰的でした)。しかし、タイル張りは一連の安全上の問題を引き起こす可能性もあります。
そのため、
依存構造の不確実性。
平坦化アルゴリズム自体は非常に複雑で時間がかかります。
依存関係
を
より効率的に保存するために、 pnpm
node_modules
フォルダーにいくつかの新しい概念が導入されました。 Yarn Berry
さらに、 node_modules
の (PnP) モードを完全に放棄することでさらに進んでいます (これについては別の記事で詳しく説明します)。
最も早くリリースされたパッケージ マネージャーは、2010 年 1 月にリリースされたnpm
でした。これは、今日のパッケージ マネージャーがどのように機能するかの中核となる原則を確立しました。しかし、 npm
10 年以上存在しているのに、なぜ他の選択肢があるのでしょうか?これが当てはまる主な理由は次のとおりです。
node_modules
フォルダー構造には、さまざまな依存関係解決アルゴリズム (ネストおよびタイル、 node_modules
と PnP モード) およびhoisting
)locking
形式 ( yarn
自体によって記述されたものなど、さまざまなパフォーマンス)monorepos
の保守性と速度に影響を与える、マルチパッケージ プロジェクト (別名workspaces
) のサポートの違い見ていきましょうnpm
の台頭後にこれらの側面がどのように決定されたかの歴史、 Yarn Classic
これらの問題のいくつかをどのように解決したか、 pnpm
これらの概念をどのように拡張したか、 Yarn Classic
の後継者としてYarn Berry
これらの伝統的な概念とプロセスをどのように打ち破ったかの歴史です。
npm
パッケージ マネージャーの元祖です。多くの人々は、 npm
が「ノードパッケージマネージャー」の頭字語であると誤って信じていますが、そうではありません。
そのリリースは、以前にプロジェクトの依存関係が手動でダウンロードされ管理されたため、革命を構成しました。 npm
、ファイルやそのメタデータフィールドなどのものを導入し、 node_modules
、カスタムスクリプト、パブリックおよびプライベートパッケージなどに依存関係を保存しました。
2020年にGitHubがnpmを買収したため、 npm
原則としてMicrosoftが管理することになりました。執筆時点での最新メジャー バージョンは v8 で、2021 年 10 月にリリースされます。
2016 年 10 月、Facebook は、当時存在していた npm の一貫性に対処するための新しいパッケージ マネージャー (engineering.fb.com/2016/10/11/…) を開発するために Google および他の多くの企業と提携することを発表しました。セキュリティとパフォーマンスの問題。彼らはその代わりの糸を「糸」と名付けました。
Yarn
は依然としてnpm
の多くの概念とプロセスに基づいて設計および構築されていますが、 Yarn
パッケージ マネージャーの分野に大きな影響を与えています。 npm
と比較して、 Yarn
操作を並列化してインストール プロセスを高速化します。これは、 npm
の以前のバージョンの大きな問題点でした。
Yarn
読み取りと書き込み、セキュリティとパフォーマンスに関してより高い基準を設定し、多くの概念を発明しました (後にnpm
もこのために多くの改良を加えました)。
monorepo
キャッシュをサポートしLocking
)。 Yarn v1 でメンテナンス モードに入る2020年。それ以来、v1.x シリーズはレガシーとみなされ、 Yarn Classic
名前に変更されました。その後継となる Yarn v2 (Berry) は、現在、より活発な開発ブランチです。
pnpm
pnpm
のバージョン 1 は、2017 年に Zoltan Kochan によってリリースされました。これはnpm
の代替となるため、 npm
プロジェクトをお持ちの場合は、すぐにpnpm
使用できます。
pnpm
が作成された主な理由は、 npm
とYarn
プロジェクト間で使用される依存関係のストレージ構造の点で非常に冗長であるためです。 Yarn Classic
npm
よりも速度に優れていますが、 pnpm
同じ依存関係解決方法を使用します。npm とnpm
Yarn Classic
hoisting
node_modules
以前の構造を最適化する代わりにホイスティングを使用して、node_modules を平坦化します。pnpm pnpm
別の依存関係解決戦略が提案されています。コンテンツアドレス指定されたストレージ構造。このメソッドによって生成されるnode_modules
フォルダーは、実際には、メイン フォルダーにグローバルに保存されている~/.pnpm-store/
ディレクトリに依存します。依存関係の各バージョンは、このディレクトリ フォルダーに物理的に一度保存され、単一のソース アドレスを形成して、ディスク領域を大幅に節約します。
node_modules
構造は、 symlinks
を使用して作成された依存関係の入れ子構造です (フォルダー内の各ファイル/パッケージはハード リンクを通じて保存されます)。公式ドキュメントの次の図は、これを示しています。 (埋められる画像: ソフトリンクとハードリンク)
pnpm
の影響は、2021年のレポートで表示されます。コンテンツアドレス型ストレージの革新のため、競合他社は、シンボリックリンクの構造やパッケージの効率的なディスク管理など、 pnpm
概念を採用することを検討しています。
Yarn 2 は 2020 年 1 月にリリースされ、オリジナルのYarn
へのメジャー アップグレードとして請求されました。 Yarn
チームは、これが本質的に新しいコード ベースと新しい原則を備えた新しいパッケージ マネージャーであることをより明確にするために、これをYarn Berry
と呼んでいます。
Yarn Berry
の主な革新は、node_modules を修復するための戦略としてのプラグ アンド プレイ (PnP) アプローチです。 node_modules
を生成する戦略の代わりに、依存関係ルックアップテーブルを備えたファイル.pnp.cjs
を生成します。これにより、ネストされたフォルダー構造ではなく単一のファイルであるため、依存関係のより効率的な処理が可能になります。さらに、各パッケージは.yarn/cache/
ではなく zip ファイルの形式でフォルダーに保存され、必要なディスク容量はnode_modules
よりも少なくなります。
これらすべての変更は非常に急速に起こったため、リリース後に多くの論争を引き起こしました。このような壊れた壊れた変更は、PNPの壊れた変更で、メンテナーが既存のパッケージを更新して互換性がある必要があります。新しい PnP アプローチをデフォルトで使用し、 node_modules
に戻すことは当初は簡単ではありませんでした。そのため、多くの有名な開発者がそれを考慮せず、Yarn 2 を公に批判しました。
それ以来、 Yarn Berry
チームはその後のリリースで多くの問題に対処してきました。 PnP の非互換性の問題を解決するために、チームはデフォルトの動作モードを簡単に変更する方法を提供しました。 node_modules プラグインを使用すると、従来のnode_modules
アプローチに戻すには、1 行の設定のみが必要になります。
さらに、JavaScript エコシステムは時間の経過とともに PnP のサポートを強化しており、この互換性表からわかるように、いくつかの大規模なプロジェクトがYarn Berry
採用し始めています。
Yarn Berry
まだ若いですが、すでにパッケージ マネージャー領域に影響を与えています。pnpm pnpm
2020 年後半に PnP アプローチを採用しました。
パッケージ マネージャーは、まず各開発者のローカル システムおよび CI/CD システムにインストールする必要があります。
npm
Node.js
に同梱されているため、追加の手順は必要ありません。オペレーティング システム用の Node.js インストーラーをダウンロードすることに加えて、CLI ツールを使用してソフトウェア バージョンを管理することが一般的になりました。ノードのコンテキストでは、ノードバージョンマネージャー(NVM)またはVoltaは非常に便利なユーティリティになりました。
Yarn 1 は、 npm
パッケージなど、さまざまな方法でインストールできます。 .$ npm i -g yarn
Yarn Classic から Yarn Berry に移行するには、次の方法が推奨されます。
Yarn Classic
を To にインストールまたは更新します
バージョン
yarn set version berry
コマンドを使用します
。ただし、ここで Yarn Berry をインストールする推奨方法は、Corepack を使用することです。
Corepack は Yarn Berry の開発者によって作成されました。このイニシアチブは当初、Package Manager Manager (pmm) という名前でしたが、LTS v16 で Node に統合されました。
Corepack の助けを借りて、Node はnpm
の代替パッケージ マネージャーです。Node にはYarn Classic
、 Yarn Berry
、およびpnpm
バイナリが含まれているため、「個別に」インストールする必要はありません。これらの shim を使用すると、ユーザーは最初に明示的にインストールせずに、またノードの配布を台無しにすることなく、Yarn および pnpm コマンドを実行できます。
corepackには、node.js≥v16.9.0でプリインストールされています。ただし、古いノードバージョンの場合、⬇️npm
インストール-g corepackを使用して
、使用する前にcorepackを有効にすることができます。この例では、Yarn Berry v3.1.1 でアクティブ化する方法を示します。
# 最初にオプトインする必要があります $ コアパックを有効にする # シムはインストールされていますが、具体的なバージョンをアクティブ化する必要があります $ corepack [email protected] --activate
pnpm
npm
パッケージとしてインストールできます: $ npm i -g pnpm
。 Corepack を使用して pnpm をインストールすることもできます。
$ corepack prepare [email protected] --activate
このセクションでは、さまざまなパッケージ マネージャーの主な機能が一目でわかります。特定のパッケージマネージャーの構成に関係しているファイルと、インストールステップでどのファイルが生成されるかを簡単に見つけることができます。
すべてのパッケージマネージャーは、すべての重要なメタ情報をProject Manifest Package.jsonファイルに保存します。 さらに、ルートレベルの構成ファイルを使用して、さまざまなプライベートパッケージまたは異なる依存関係解像度構成をセットアップできます。
インストールステップ中、 dependencies
node_modules
などのファイル構造に保存され、 locking
ファイルが生成されます。このセクションでは、ワークスペースの設定を考慮していないため、すべての例は、依存関係が保存されている単一の場所のみを示しています。
$ npm install
または短い$ npm i
を使用してnpmは、 package-lock.json
ファイルとnode_modules
フォルダーを生成します
ルート レベルのディレクトリに配置できる.npmrc
などの構成可能なファイルもあります。ファイルのlocking
の詳細については、次のセクションを参照してください。
。 §── ノードモジュール/ §── .npmrc package-lock.json package.json
$ yarn
を実行すると、 yarn.lock
ファイルとnode_modules
フォルダーが作成されます。 .yarnrc
ファイルも構成オプションにすることができ、 Yarn Classic
.npmrc
ファイルもサポートします。あるいは、キャッシュ フォルダー.yarn/cache/
と、ローカルの.yarn/releases/
に保存されている最新のYarn Classic
バージョンを使用することもできます。
。 §── .yarn/ │├├。cache/ │ └── リリース/ │ └─ 糸-1.22.17.cjs §── ノードモジュール/ §── .yarnrc §── package.json └└)lock
この特別なインストールモードのため、他のパッケージマネージャーよりもYarn Berry
プロジェクトでより多くのファイルとフォルダーを扱う必要があります。一部はオプションであり、一部は必須です。
Yarn Berry
.npmrc
または.yarnrc
をサポートしなくなりました。 node_modules
フォルダーの生成の従来のワークフローの場合、 node_modules
またはpnpm
構成を使用するにはnodeLinker
構成を提供する必要があります(この部分はわかりません)。
#.yarnrc.yml nodeLinker:node-modules # または
$ yarn
を実行する pnpm は、すべての依存関係をnode_modules
フォルダーにインストールします。 yarn.lock
ファイルが生成されますが、これはより新しいですが、 Yarn Classic
と互換性がありません。さらに、オフラインインストールのために.yarn/cache/
フォルダーが生成されます。このフォルダーはオプションであり、プロジェクトで使用されるYarn Berry
のバージョンを保存するために使用されます。
。 ├├)/ yarn/ │├├。cache/ p │└│。-YARN-3.1.1.CJS ├├)node_modules/ ├··ックス。yarnrc.yml §── package.jsonpnp
のロック
PNPの厳密なモードであろうとルースモードであろうと、 .pnp.cjs
とyarn.lock
を使用して$ yarn
実行するかどうかは.yarn/cache/
および.yarn/unplugged
を生成します。 PNP Strictはデフォルトモードを設定する場合は、次のフォームで有効にする必要があります
。 Nodelinker:PNP PNPMode:
PNPプロジェクトでは、 releases
フォルダーに加えて、 .yarn
フォルダーにはIDEサポートを提供するsdk/
フォルダーも含まれている可能性があります。ユースケースに応じて、 .yarn
より多くのフォルダーを含めることもできます。
。 ├├)/ yarn/ │├├。cache/ p ││└│。。 ││·ックス/ sdk/ │└··ックス/プラグがありません pnp.cjs pnp.loader.mjs ├··ックス。yarnrc.yml §── package.json ━──yarn.lock`
npm
またはYarn Classic
プロジェクトと同じですpnpm
にもpackage.json
ファイルが必要です。 $ pnpm i
使用して依存関係をインストールすると、 node_modules
フォルダーが作成されますが、その内容はアドレス指定可能なストレージであるため、その構造は完全に異なります。
pnpm
独自のロックファイルpnp-lock.yml
も生成します。 オプションの.npmrc
ファイルを使用して追加の構成を提供できます。
。 ├├)node_modules/ pnpm/ .pnpm/ §── .npmrc §── package.json pnpm-lock.yml
前のセクションで述べたように、すべてのパッケージマネージャーがロックファイルを作成します。
lock
ファイルは、プロジェクトによってインストールされたすべての依存関係の正確なバージョンを保存し、より予測可能で決定的なインストールを可能にします。このlock
ファイルは、依存バージョンがバージョン範囲(≥V1.2.5など)で宣言される可能性が高いため重要です。バージョンを「ロック」しない場合、インストールされている実際のバージョンは異なる場合があります。
ファイルをロックすることも、チェックサム(私が思い出すようにハッシュ)を保存することもあります。これは、セキュリティセクションでより詳細にカバーします。
npm
V5+から、ロックファイルは常にnpm
package-lock.json
pnpm
pnpm-lock.yaml
機能yarn.lock
Yarn Berry
前のセクションでは、 node_modules
フォルダー構造に依存関係をインストールするという従来のアプローチが見られました。これは、 npm
、 Yarn Classic 、および pnpm で使用されるソリューションです ( pnpm
他のものより効率的です)。
Yarn Berry
、PNPモードで異なる方法で行います。 node_modules
フォルダーの代わりに、依存関係はzipファイルに.yarn/cache/
and .pnp.cjs
ファイルの組み合わせとして保存されます。
すべてのチームメンバーが同じバージョンをインストールするため、これらのロックファイルをバージョン制御下に配置する方が良いため、「マシンとマイニングで動作する」問題を解決します。
次の表は、 npm
、 Yarn Classic
、 Yarn Berry
、およびpnpm
で利用可能なさまざまなCLIコマンドを比較しています。これは決して完全なリストではなく、チートシートです。このセクションでは、ワークフロー関連のコマンドをカバーしていません。
npm
とpnpm
多くのアドホックコマンドとオプションエイリアスがあります。つまり、コマンドは異なる名前を持つことができます。つまり、 $ npm install
対$ npm add
。 さらに、多くのコマンドオプションには、 --save-dev
の代わりに-D
などのバージョンが省略されています。 テーブルでは、すべての略式バージョンエイリアスを呼び出します。これらの各パッケージマネージャーを使用して、複数の依存関係を追加、更新、または削除できます。
このテーブルは、 package.json
で指定されたすべての依存関係をインストールまたは更新するために使用される依存関係管理コマンドをカバーします。
アクション | NPM | YARNクラシック | YARN BERRY | PNPM INSPATION | |
---|---|---|---|---|---|
DEPS PACKAGE.JSON | NPMインストールエイリアス: | YarnインストールまたはYARN | の | 追加エイリアス: | |
Package.json | Upgrade | Yarn | の | アップグレードSemver Up(プラグインを介して) | PNPMアップデートエイリアス: |
Package.jsonの | Up Up Up UpYarn Upgrade - | LatestYarn Up | PNPM | アップデート - Latest Alias:-L | |
Update | React | Yarn Upgrade React | Yarn semver up react | pnpm up react | |
update deps deps to rest | npm update@rest | yarn upgrade | react-latestyarn up react | pnpm up -l react | update|
deps | deps | deps | deps | deps | - インタラクティブエイリアス:-i |
ランタイムdeps | npmを追加私は | Classic | pnpm add | add | |
dev | depm | depm i -d babelエイリアスのように反応yarnを追加するyarn add npm dev i -d babel airas: - save -dev | yarn | add -d babelエイリアス: | -d babelエイリアス: - save -dev deps |
add deps fackage.json withe semver | npm i -e react alias: - save -exact | yarn add -e reactエイリアス: - exact lik | like classic | pnpm add -e reactエイリアス: - | |
をアンインストールしてexact exact | |||||
Package.json | npmアンインストールReactエイリアス:remove、rm、r、un、link | yarn remove remove | like classic | pnpm remove Reactエイリアス:rm、un、アンインストール | |
deps deps uppatedをアンインストールします。 JSON | NPMアンインストール-No-Save | n/a | n/a | n/a |
次の例は、開発中のパッケージの管理方法を示しています。テーブルで使用される用語:
- パッケージ:依存関係またはバイナリ
- バイナリ:
node_modules/.bin/
or.yarn/cache/
(pnp)
Yarn Berry
package.json
で実行するか、公開できることを理解することが重要です
bin/
ファイルの指定されたバイナリファイル。
アクション | NPM | YARNクラシック | ヤーンベリー | PNPM |
---|---|---|---|---|
パッケージインストールパッケージグローバル | NPM I -G NTLエイリアス: - グロバル | ヤーングローバル追加NTL | N/A(グローバル削除) | PNPM追加 |
パッケージグローバル | NPMアップデート-G NTL | YARNグローバルアップグレードNTL | N NTL N NTL /A | PNPMアップデート-Global NTL |
グローバルにパッケージを削除した | NPM UNINSTALL -G NTL | YARNグローバル削除NTL | N/A | PNPM remove -Global | NTL
YARN | NTL | YARN | NTL | PNPM NTL |
RUN | BINARIES | FROM SCRIPT NTL NTL NTL | NTL | NTL |
ダイナミックパッケージ実行 | NPX NTL | N/A | YARN DLX NTL | PNPM DLX NTL |
RUNTITE DEPS | NPM IRECLECT | YARN ADD | CLASSICE | PNPM ADD ADD |
DEV | DEPM I -D BABEL ALIAS:-SAVE -DEV | YARN ADD -D BABEL ALIAS: -dev | lik classic | pnpm add -d babelエイリアス: - save -dev deps |
add deps a semver | npm npm i -e reactエイリアス: - save -exact | yarn add -e reactialas: - exact | like classic | pnpm Add -e Reactエイリアス: - save -exact |
uninstall depsとpackage.json | npm uninstall Reactエイリアス:remove、rm、r、un、link | yarn remove remove | remove remove remain liremremover | reactialas:rm、un、uninstall |
uninstall deps package.json | npm uninstallの更新をw/o w/o save | n/a | n/a | n/a |
このテーブルは、いくつかの便利な組み込みコマンドをカバーします。公式コマンドがない場合、通常、サードパーティコマンドはnpm
パッケージまたはYarn Berry
プラグインを介して使用できます。
アクション | NPM | YARNクラシック | ヤーンベリー | PNPM |
---|---|---|---|---|
パブリッシュ | NPMパブリッシュ | パブリッシュ | YARN NPM Public | Pnpm Publish |
Listインストール済みDEPS | NPM LSエイリアス:リスト、LA、LL | YARNリスト | PNPMリストエイリアス:LS | |
リスト時代のDEPS | npm時代遅れの | 糸時代遅れの | 糸アップグレードインタラクティブ | PNPM時代遅れの |
NTL | の | |||
エイリアス | を | 説明 | する | 理由 |
-yes | yarn init -y yarn init(interactive)エイリアス: - yes | yarn init | pnpm init -y pnpm init(interactive)エイリアス:-yes | |
印刷ライセンス情報 | n/a(サードパーティパッケージ経由) | yarnライセンスリスト | n/ A(またはプラグイン経由、その他のプラグインを介して) | N/A(サードパーティパッケージ経由) |
Package Managerバージョン | n/a(サードパーティツールを使用して、たとえば、NVM) | をnpm:yarnポリシーセットバージョン1.13.0 | with CorePack :YARN SETバージョン3.1.1 | N/A(NPM、CorePack) |
セキュリティ監査 | NPM監査 | YARN監査 | YARN NPM監査 | PNPM監査 |
PCACKER.JSON ADD DEPSをsemver | npm i -e -e reactエイリアス: - save -exact | yarn add add -e reactエイリアス: - | クラシック | PNPMのようにexact -e reactエイリアス: - save -exact |
uninstall depsとremody.json | npm uninstall reactエイリアス:remove、rm、r、un、link | yarn remove remove remain | classic | pnpm Remain Reactエイリアス:RM、UN、アン |
インストールパッケージの更新付きデパルのアン | インストールjson npm uninstall-no-save | n/a | n/a n | /a |
Package Managerの構成はpackage.json
と専用の構成ファイルで発生します。
monorepo
います.npmrc
npm
のworkspaces
機能を使用する場合は、 package.json
にワークスペースメタデータフィールドを追加して、NPMにサブプロジェクトまたはワークスペースフォルダーを見つける場所を指示する必要があります。
// ... "ワークスペース": [ 「フック」、 「utils」 】 }
すべてのパッケージマネージャーは、パブリックnpm
レジストリを使用できます。おそらく、それらを公開することなく再利用したいと思うでしょう。これを.npmrc
ファイルのレジストリをプライベートに設定できます。 (基本的にすべてが現在プライベートソースがあります)
#.NPMRC @doppelmutzi:registry = https://gitlab.doppelmutzi.com/api/v4/projects/41/packages/npm/
npm
には多くの構成オプションがあります。ドキュメントで確認するのが最善です。
yarn
のworkspaces
package.json
に設定できます(プライベートパッケージである必要があります)。
{ // ... 「プライベート」:本当、 「ワークスペース」:["Workspace-A"、 "Workspace-B"]] }
オプションの構成は.yarnrc
ファイルになります。一般的な構成オプションは、 yarn-path:
各チームメンバーに指定されたバイナリバージョンを使用するように強制します。 yarn-path
特定のYarn
バージョンを含むフォルダーを指しています(例: .yarn/releases/
)。コマンド(Classic.yarnpkg.com/en/docs/cli…)を使用して、Unified Yarn Classic
バージョンをインストールできます。
Yarn Berry
のワークworkspaces
の構成は、 Yarn Classic
( package.json
)の構成に似ています。 ほとんどのYarn Berry
構成は.yarnrc.yml
で発生し、多くの構成オプションが利用可能です。
#.yarnrc.yml yarnpath:.yarn/leleases/yarn-3.1.1.cjsyarnberry
yarn berry
、インポート方法$> yarn plugin import <name>
を使用してプラグイン(yarnpkg.com/cli/plugin/>)を拡張できます。また、更新されます.yarnrc.yml
。
#.yarnrc.yml プラグイン: - パス:.yarn/plugins/@yarnpkg/plugin-semver-up.cjs 仕様: "https://raw.githubusercontent.com/tophat/yarn-plugin-semver-up/master/bundles/%40yarnpkg/plugin-semver-up.js"
歴史セクションでは、互換性の理由により、 PNP Strictモードの依存関係にいくつかの問題があるかもしれません。このタイプのPNP問題には典型的なソリューションがあります:パケット拡張構成ポリシー。
#.yarnrc.yml PackageExtensions: 「スタイルコンポーネント@*」: 依存関係: React-IS: "*"
pnpm
npm
と同じ構成メカニズムを使用するため、 .npmrc
ファイルを使用できます。プライベートレジストリの構成もnpm
使用するのと同じように機能します。 PNPMのワークスペース機能では、マルチパッケージプロジェクトをサポートできます。 monorepo
初期化するには、 pnpm-workspace.yaml
ファイルのパッケージの場所を指定する必要があります。
#pnpm-workspace.yaml パッケージ: - 'パッケージ/**'
(実際には、単一の倉庫と複数のプロジェクト、単一の倉庫と単一のプロジェクト、複数の倉庫と複数のプロジェクトがあります)
monorepo
は、これらのプロジェクトを含むworkspace
です。複数のリポジトリを使用する代わりに、すべてを1か所に保つことは、プロジェクト組織戦略です。
もちろん、これは追加の複雑さをもたらします。 Yarn Classic
この機能を有効にした最初のものでしたが、現在、すべての主要なパッケージマネージャーがワークスペース機能を提供しています。このセクションでは、それぞれの異なるパッケージマネージャーを使用してワークスペースを構成する方法を示します。
npm
チームは、V7で待望のNPMワークスペース機能をリリースしました。ルートパッケージからのマルチパッケージプロジェクトの管理を支援する多くのCLIコマンドが含まれています。ほとんどのコマンドは、 workspace
に関連するオプションで使用でき、特定のワークスペース、複数、またはすべてのワークスペースに対して実行する必要があるかどうかをnpm
に伝えることができます。
#すべてのワークスペースのすべての依存関係をインストールします $ npm i -workspaces。 #1つのパッケージに対して実行します $ npm run test -workspace = hooks #複数のパッケージに対して実行します $ npm run test -workspace = hooks -workspace = utils #すべてに対して実行します $ npm run test -workspaces #ignoreすべてのパッケージがありませんテストはありません $ npm run test -workspaces-if-present
Tips:他のパッケージマネージャーと比較して、 npm
V8は現在、複数のワークスペース関連コマンドの高度なフィルタリングまたは並列実行をサポートしていません。
2017年8月、 Yarn
チームはワークスペース機能のmonorepo
サポートを発表しました。以前は、パッケージマネージャーは、Lernaなどのサードパーティソフトウェアを使用してマルチパッケージプロジェクトでのみ使用できました。 Yarn
へのこの新しい追加は、他のパッケージマネージャーがそのような機能を実装する方法を舗装します。
興味がある場合は、Yarn Classicのワークスペース機能の使用方法を参照することができます。しかし、この記事では、 Yarn Classic
Workspaceのセットアップで依存関係を管理するのに役立つ必要なコマンドのみを紹介します。
#すべてのワークスペースのすべての依存関係$ YARNをインストールします #依存関係のツリー$ YARNワークスペース情報を表示します #別のパッケージを実行して$ YARN Workspace Awesomeを起動する - パッケージ開始 #ウェブパックをパッケージに追加する$ YARNワークスペースAwesome -PackageAdd -D webpack #すべてのパッケージにReactを追加$ YARN ADD REACT -W
Yarn Berry
その実装がYarn Classic
の概念に基づいて構築されているため、最初からワークスペースを掲載しています。 Redditのコメントで、Yarn Berryのリード開発者は、
Yarn Berry
package.json
ファイルのdependencies
またはdevDependencies
フィールドで使用できる多数のプロトコルを使用します。その中には、 workspace
プロトコルがあります。
Yarn Classic
のワークスペースとは対照的に、 Yarn Berry
依存関係がこのmonorepo
のパッケージの1つでなければならないことを明確に定義しています。それ以外の場合、バージョンが一致しない場合、 Yarn Berry
リモートレジストリからバージョンを取得しようとする場合があります。
{ // ... "依存関係": { "@doppelmutzi/hooks": "workspace:*"、 「http-server」:「14.0.0」、 // ... } }
workspace
Protocolを介して、 pnpm
Yarn Berry
と同様のmonorepo
プロジェクトに貢献しました。多くのpnpm
コマンドは、 monorepo
コンテキストで特に役立つ--recursive (-r)
または - フィルターオプションを受け入れます。そのネイティブフィルタリングコマンドは、 Lerna
を非常に補完します。
#すべてのワークスペースを剪定します pnpm -r exec -rm -rf node_modules && rm pnpm -lock.yaml #scope @doppelmutziですべてのワークスペースのすべてのテストを実行する PNPM再帰実行テスト - フィルター @doppelmutzi/`
パフォーマンスは選択決定の重要な部分です。このセクションでは、小規模で中規模のプロジェクトに基づいたベンチマークを紹介します。サンプルプロジェクトに関するメモを次に示します。
、
詳細な評価と説明については、プロジェクト1(P1)とプロジェクト2(P2)の結果をご覧ください。
node_modules
または.pnp.cjs
node_modules
または.pnp.cjs
node_modules
または.pnp.cjs
なしでは、Tool Gnomonを使用して、インストール( yarn
| gnomon
)で消費される時間を測定しました。さらに、生成されたファイルのサイズ$ du -sh node_modules
を測定しました。
プロジェクト1のパフォーマンス結果 | |||||||
---|---|---|---|---|---|---|---|
メソッド | NPM V8.1.2 | YARNクラシックV1.23.0 | PNPM V6.24.4 | YARNBERRY PNP | LOOS V3.1.1 YARNBERRY PNP STRICT V3.1.1 | YARN BERRY NODE_MODULES V3.1.1 | YARN BERRY PNPM |
V3.1.1 | UC | 1 | 86.63S | 103.58 | 30.13S | 56.64S | 60.91S |
UC | 2 | 41.54S | 65.49S | 26.43S | 12.46S | 12.66S | 46.36S |
40.74S | UC | 3 | 23.59S | 40.35S | 20.32S | 1.61S | 1.36S |
28.72S | :467m | node_modules:397m yarn.lock:504k | pnpm-lock.yaml:412k node_modules:319m | yarn.lock:540kキャッシュ:68m未塗り:29m .pnp.cjs:1.6m | yarn.lock:540k cache:1.6m PNP.CJS:1.5m | node_modules:395m yarn.lock:540kキャッシュ:68m | node_modules:374m yarn.lock:540kキャッシュ: |
プロジェクト2のパフォーマンス結果 |
---|
メソッド | NPM V8.1.2 | YARNクラシックV1.23.0 | PNPM V6.24.4 | YARN BERRY PNP | LOOS V3.1.1 YARN | BERRY | PNP |
STRICT | V3.1.1 | YARN | BERRY | NODE_MODULE | 6.44S | 23.62S | 20.09S |
UC 2 | 7.92S | 33.65S | 8.86S | 7.09S | 5.63S | 15.12S | 14.93S |
UC 3 | 5.09S | 15.64S | 4.73S | 0.93S | 0.79S | 8.18S | 6.02S |
ファイルとサイズ | パッケージロック。 151M | Yarn.Lock:268K node_modules:159m | pnpm-lock.yaml:212k node_modules:141m | .pnp.cjs:1.1m .pnp.loader.mjs:8.0k yarn.lock:292k .yarn:38m | .pnp.cjs:1.0。 M .PNP.Loader.MJS:8.0K Yarn.Lock:292K .YARN:38M | YARN.LOCK:292K NODE_MODULES:164M CACHE:34M | YARN.LOCK:292K NODE_MODULES:156m Cache:34m |
npm
、悪いパッケージの処理に関しては少し寛大すぎて、多くのプロジェクトに直接影響を与えるセキュリティの脆弱性に遭遇しました。たとえば、バージョン5.7.0では、Linuxオペレーティングシステムでsudo npm
コマンドを実行すると、システムファイルの所有権を変更して、オペレーティングシステムを使用できません。
2018年にビットコインの盗難を含む別の事件が発生しました。 node.jsパッケージイベントストリームは、3.3.6バージョンに悪意のある依存関係を追加しました。この悪意のあるパッケージには、開発者のマシンからビットコインを盗もうとする暗号化方法が含まれています。
これらの問題を解決するために、新しいnpm
バージョンは暗号化アルゴリズムを使用して、インストールされたパッケージの整合性を確認します。 SHA-512。
Yarn Classic
とYarn Berry
チェックサムを使用して、最初からすべてのパッケージの完全性を検証します。また、 Yarn
、 package.json
で宣言されていない悪意のあるパッケージの取得を防止しようとします。JSON:不一致が見つかった場合、インストールは中止されます。
PNPモードのYarn Berry
には、従来のnode_modules
メソッドのセキュリティ問題はありません。 Yarn Classic
と比較して、 Yarn Berry
コマンド実行のセキュリティを改善します。 package.json
で宣言されたパッケージのみを実行できます。このセキュリティ機能は、以下で説明するpnpm
に似ています。
pnpm
コードを実行する前に、インストールされた各パッケージの整合性を確認するためにチェックサムを使用しています。
上で述べたように、 npm
とYarn Classic
両方に昇進によりセキュリティの問題があります。 pnpm
、その管理モデルが標高を使用しないnode_modules
、この状況を回避します。これは、依存関係が.package.json
で宣言されることを意味します。
議論したように、これはmonorepo
設定で特に重要です。なぜなら、アルゴリズムを強化すると依存性の非決定につながることがあるからです。
NPM | YARN | ||
クラシック | ヤーン | ベリー | PNPM |
SVELTE | REACT | JEST | ( |
node_modules | ) | | |
| | | |
| | | |
ナクスト | |||
Reactアプリを作成します | |||
webpack-cli | |||
感情 |
実際、さまざまなパッケージマネージャーの原則には大きな違いがあります。
pnpm
、CLIの使用量が似ているが、 pnpm
のアプローチが非常に異なるため、 npm
のように見えます。 Yarn Classic
はまだ人気がありますが、レガシーソフトウェアと考えられており、近い将来にサポートが削除される可能性があります。 Yarn Berry PnP
真新しいですが、パッケージマネージャーの世界に革命を起こす可能性はまだ再び実現していません。
長年にわたり、多くのユーザーは、どのパッケージマネージャーを使用するかを尋ねてきました。全体的な人々は、 Yarn Berry PnP
の成熟度と採用に特に興味を持っているようです。
この記事の目的は、自分で使用するパッケージマネージャーを決定するための複数の視点を提供することです。特定のパッケージマネージャーをお勧めしないことを指摘したいと思います。それはあなたがさまざまな要件をどのように比較検討するかに依存します - あなたはまだあなたが好きなものを選択することができます!
英語のオリジナルアドレス:https://blog.logrocket.com/javascript-package-managers-compared/