yarn — Node.js向けの代替パッケージマネージャーで、2016年にFacebookがExponent、Google、Tildeと共同で作成しました。yarnはnpm 2-4の速度とセキュリティの問題を解決しました:並列インストール、厳格なロックファイル、オフラインキャッシュ。現在もyarnはReact Native、Expo、モノレポで人気を保っています。詳細はyarn Documentationをご覧ください。
重要ポイント
yarn(Yet Another Resource Negotiator)は2016年10月に、npm 2-4の問題(インストールの遅さ、ロックファイルの欠如、安全でないパッケージ)への対応としてFacebookによってリリースされました。yarnは並列パッケージダウンロード、決定論的なyarn.lock、チェックサムによる整合性検証を導入しました。2020年にyarnはPlug'n'PlayとTypeScript-firstアプローチを備えたバージョン2(Berry)に移行しました。
yarnのアーキテクチャはnpmとは異なります:yarnはパッケージを並列でダウンロードし(npmはバージョン5以前は順次)、各パッケージを~/.cache/yarnにプロジェクト間で重複なくキャッシュし、チェックサムで整合性を検証します。yarnは常にインストールごとにyarn.lockを生成しますが、npmのpackage-lock.jsonはバージョン5でようやく登場しました。
yarn 2(Berry、2020)以降、yarnは完全にTypeScriptで書き直され、Plug'n'Play、workspaces、モノレポ用のconstraints、さまざまなソース(npm、git、tarball)からのインストールプロトコルをサポートしています。yarn 3+(2022)はZero-Installsを追加しました — ネットワークなしで即座にインストールできるよう、リポジトリにキャッシュを保存します。
yarn install — package.jsonとyarn.lockを読み取り、依存関係をインストールするメインコマンドです。yarnはパッケージを並列でダウンロードするため、npm 4以前と比較してインストールが2〜3倍高速化されます。yarnはオフラインキャッシュを使用します:パッケージが別のプロジェクトですでにダウンロードされている場合、再ダウンロードではなくキャッシュからコピーされます。
# yarnの基本コマンド
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# 対話型アップデート
$ yarn upgrade-interactive
# 重複パッケージの削除
$ yarn dedupe
yarn add — 新しいパッケージをインストールするコマンドです。yarn add <package>はdependenciesに追加し、yarn add --devはdevDependenciesに追加します。yarnは自動的にyarn.lockを更新します。yarn upgradeはセマンティック範囲内でパッケージを最新バージョンに更新します。yarn upgrade-interactive — 更新する特定のパッケージを選択するインタラクティブモードです。
yarn cache — ~/.cache/yarn/v6にあるグローバルキャッシュです。各パッケージはチェックサムとともにZIPアーカイブに一度だけ保存されます。yarnキャッシュは自動的にクリーンアップされますが、手動でyarn cache cleanを実行することもできます。yarn cache dirはキャッシュパスを表示します。yarn cache list — キャッシュされたパッケージのリストです。
yarn.lock — すべての依存関係とその推移的パッケージの正確なバージョンを記録するロックファイルです。package-lock.json(JSON)とは異なり、yarn.lockはフラット構造のYAML形式を使用します。yarn.lockはyarn installまたはyarn add時に常に自動生成されます — これにより、すべての開発者とCIサーバーが同一のパッケージセットを取得することが保証されます。
# yarn.lock構造の例
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
yarn.lockのフィールド: version — パッケージの正確なバージョン、resolution — ソースとバージョン、dependencies — その依存関係、checksum — 検証用のチェックサム。yarn.lockはリポジトリにコミットされ、依存関係の唯一の信頼できる情報源です。yarn.lockとpackage.jsonに不一致がある場合、yarnは警告を発します。
Yarn constraints — yarn.lock内の依存関係バージョンをチェックして強制するモノレポ用のルールシステムです。制約はYarn Constraint Languageを使用してyarn.constraints.jsファイルに記述されます。Constraintsを使用すると、モノレポ内のすべてのパッケージが同じバージョンのReactやTypeScriptを使用することを保証できます。
React Nativeは伝統的にyarnと密接に関連しています。Expo CLI、React Native CLI、Create React Native Appは当初yarnを使用していました。React Nativeプロジェクトでは、yarn.lockがネイティブモジュールのバージョンを固定し、CocoaPods(iOS)やGradle(Android)による安定したコンパイルに不可欠です。共有コードを使用するReact Nativeモノレポではyarn workspacesが人気です。
React Nativeモノレポでのyarn workspaces: ルートのpackage.jsonに"workspaces": ["packages/*", "mobile"]を含めます。yarn installはルートレベルに単一のnode_modulesフォルダーを作成します。パッケージはシンボリックリンクを介して相互に参照します。ネイティブ依存関係を変更した後、CocoaPodsを更新するためにnpx pod-installが実行されます。
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+はnpx create-expo-appで作成された新しいプロジェクトにyarnを公式に推奨しています。yarnはExpoモジュールとの互換性を保証し、正しいyarn.lockを自動生成します。yarn 3+のZero-Installsはキャッシュをリポジトリにコミットすることを可能にし、開発者はgit clone後に依存関係をインストールすることなくすぐに使用できる環境を得られます。
npmとyarnは同じ問題を解決します — Node.jsパッケージの管理です。npm 5-7のリリースにより、機能の差は実質的になくなりました。npm 7+はworkspaces、npm ci(yarn install --frozen-lockfileに相当)、並列インストールを含みます。ただし、yarnは特定のシナリオで利点を維持しています:Plug'n'Play、Zero-Installs、成熟したconstraintsシステムです。
| 特徴 | npm | yarn |
|---|---|---|
| 作成年 | 2010 | 2016 |
| ロックファイル | package-lock.json(JSON) | yarn.lock(YAML) |
| インストール | 順次(npm 5+) | 並列 |
| Plug'n'Play | いいえ | はい(yarn 2+) |
| Workspaces | はい(npm 7+) | はい |
| Zero-Installs | いいえ | はい(yarn 3+) |
| キャッシュ | フラット化されたnode_modules | グローバル~/.cache/yarn |
| 実装言語 | JavaScript | TypeScript(yarn 2+) |
yarnを選ぶべき時: Expo SDK 50+のプロジェクト、大規模モノレポ(100+パッケージ)、Zero-Installsを重視するチーム、すでにyarnを使用しているレガシープロジェクト。npmを選ぶべき時: 標準的なcreate-react-appプロジェクト、Next.js、Vite、特定のパッケージマネージャー要件がないチーム。
yarn 4(2024)はパフォーマンスの向上、ネイティブESMサポート、大規模モノレポの最適化を導入しました。npm 10+はセキュリティと互換性に焦点を当てて進化を続けています。今日のnpmとyarnの選択は、チームの好みと特定のプロジェクト要件の問題であり、一方のツールの技術的優位性ではありません。
よくある質問
yarnは当初、並列パッケージインストールと積極的なキャッシュにより速度でnpmを上回りました。yarn.lockはインストールごとに自動生成されますが、package-lock.jsonはnpm 5で登場しました。yarnはインストール時間ゼロのnode_modulesの代替であるPlug'n'Playを提供します。npm 7+では、基本的なシナリオでの速度と機能の差は最小限です。
yarn workspaces — 単一のリポジトリで複数のパッケージを管理するメカニズムです。ルートのpackage.jsonにフィールド"workspaces": ["packages/*"]を含めます。yarn installは共有依存関係をトップレベルの単一のnode_modulesにインストールし、ローカルパッケージ間にシンボリックリンクを作成し、重複を回避します。すべてのworkspaceのコマンドはyarn workspaces run <script>で実行されます。
Plug'n'Play(PnP)— yarn 2で導入された従来のnode_modulesフォルダーの代替です。ファイルをコピーする代わりに、yarnは.pnp.cjsに依存関係マップを作成し、パッケージをグローバルキャッシュのZIPアーカイブに保存します。PnPの利点: 数秒でのインストール、Node.jsの起動時間が30〜50%短縮、node_modulesや関連するパスの問題がありません。
yarnをグローバルにインストール:npm install -g yarn。プロジェクトのルートでyarn importを実行すると、yarnがpackage-lock.jsonを読み取り、同等のyarn.lockを作成します。node_modulesとpackage-lock.jsonを削除し、yarn installを実行して確認します。npmをyarnに置き換えてCI/CD設定を更新します。yarnはpackage.jsonと完全に互換性があります。
「Integrity check failed」エラーは、yarn.lockとnode_modulesの同期が取れていない場合に発生します。解決策:node_modules、yarn.lockを削除し、キャッシュをクリアして(yarn cache clean)、yarn installを再度実行します。バージョンの競合には、yarn upgrade-interactiveを使用して特定の更新を選択します。yarn dedupeで重複パッケージを削除します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。