先頃リリースされたnpm 7には、開発者から要求されたいくつかの機能が追加されている。たとえば、ワークスペースのサポート、ピア依存関係管理のより良いサポート、決定論的に再現可能なビルドだ。npm 7は、開発者エクスペリエンス全体の改善を目的としたいくつかの重大な変更を含む大きなリリースだ。
npm 7のCLIはワークスペースをサポートするようになった。つまり、単一のトップレベルのルートパッケージからの複数パッケージの管理をサポートする。npmによって実装されるワークスペースは、Yarnワークスペースおよびpnpmワークスペースに似ている。npmワークスペースのRFCでは次のように説明されている:
コミュニティからフィードバックを入手した後、npm CLIで必要な2つの主要な実装/変更があります。それは、ネストされたパッケージのより良い管理を可能にする機能セットを提供するためです。
- npm CLIをワークスペース対応にします。
- Install: npmワークスペースのセットアップでは、ユーザはネストされたすべてのパッケージをインストールし、最上位のワークスペースから関連するライフサイクルスクリプトを実行できることを期待しています。また、相互に依存しているワークスペースを認識し、それらは適切にシンボリックリンクする必要があります。
package.json
構成ファイルは、ファイルシステム内のワークスペースを参照するパスのセットをリストする workspaces
プロパティをサポートするようになった。
{
"name": "workspace-example",
"version": "1.0.0",
"workspaces": {
"packages": [
"packages/*"
]
}
}
npm CLIは、新しいプロパティを使用して、構成された場所で有効な package.json
ファイルを検索し、ワークスペースとして扱われるパッケージのリストを作成する。
npm install
は、ワークスペース全体に依存関係をインストールするようになった。RFCが提供する npm install
出力の例は次のとおり:
// Given this package.json structure:
├── package.json { "workspaces": ["dep-a", "dep-b"] }
├── dep-a
│ └── package.json { "dependencies": { "dep-b": "^1.0.0" } }
└── dep-b
└── package.json { "version": "1.3.1" }
$ npm install
// Results in this symlinking structure:
├── node_modules
│ ├── dep-a -> ./dep-a
│ └── dep-b -> ./dep-b
├── dep-a
└── dep-b
npm 7は、それぞれが依存するパッケージとともに、それぞれの間の依存関係も自動的にインストールする。npm 7より前は、開発者は独自にそれぞれの依存関係を管理およびインストールする必要があった。npm 6は、警告を表示して開発者にそうすることを促しただけだった。対応するRFCは、新しい動作の背後にある理論的根拠を詳述する:
その警告はしばしば問題として誤解され、パッケージメンテナに報告されました。パッケージメンテナはそれに応じてそれぞれの依存関係を省略し、かわりに事実上オプションの依存関係として扱ったが、バージョンの範囲や有効性はチェックされませんでした。
さらに、npmインストーラはそれぞれの依存関係を認識しないため、それぞれの間の依存関係が存在する場合に問題を引き起こすツリーを設計することがありました。
この提案されたアルゴリズムはこれらの問題に対処し、
peerDependencies
をファーストクラスの概念にしてパッケージツリーの有効性の要件にします。
npm 7には、決定論的に再現可能なビルドを可能にする新しいpackage-lock フォーマットが追加で付属している。npm v7では、package-lock.json
ファイルには、npmがパッケージツリーを完全に構築するために必要なすべてのものが含まれる。
npm 7には、一部のワークフローを壊す可能性のある変更が含まれている。npm-6のロックファイルを使用するプロジェクトでnpm 7を使用して npm install
を実行すると、そのロックファイルは新しいフォーマットに置き換えられる。このデフォルトの動作は、npm install --no-save
を使用することで回避できる。npm 7は、自動的に解決できないアップストリームの依存関係の競合が存在する場合、パッケージのインストールをブロックするようになった。
開発者は、シェルターミナルで npm install --global npm
を実行して npm 7をインストールすることができる。npm 6をインストールするには、かわりに npm install --global npm@6
を実行する必要がある。
npm 7で利用可能な追加機能と重大な変更の詳細について興味のある読者は完全なリリースノートを参照してください。
2016年10月にFacebookによってオープンソース化されたYarnは、パブリックなnpmレジストリと互換性のあるパッケージマネージャであり、デフォルトで使用される。Yarnは、さまざまなクライアント側のエクスペリエンスを提供するよう努めている。それは、通常はnpmクライアントと比較してパフォーマンスと決定論に焦点を当てている。
pnpm は、JavaScript用のnpm互換のパッケージマネージャーであり、パフォーマンスとディスクスペースの使用量の改善に努めている。
2010年にNode.jsのオープンソースパッケージマネージャとして作成されたnpmは、パブリックnpmレジストリで100万を超えるパッケージをホストするようになった。npmは、世界中の約1,100万人の開発者に、1日あたり10億を超えるJavaScriptパッケージのリクエストを処理する。