はじめに
npm installが遅くてイライラしたことはありませんか?インストールだけで数分待たされるのは開発効率の大敵です。
この記事では、すぐに実践できる高速化テクニックを7つ厳選して紹介します。
特に効果が高い方法から順に解説していくので、まずは気になるものから試してみてくださいね!
1. 【最速】pnpmに乗り換える
なぜ速いのか
pnpmは、パッケージをシンボリックリンクで管理することで、npmの3倍以上の速度を実現します。
同じパッケージを複数のプロジェクトで使い回せるため、ディスク容量も大幅に節約できますよ!
導入方法
# pnpmをインストール
npm install -g pnpm
# 既存プロジェクトで使う
pnpm install
注意点
- package.jsonはそのまま使えます
- ロックファイルがpnpm-lock.yamlに変わります
- 一部のツールでシンボリックリンクに対応していない場合があります(極めて稀なケース)
互換性チェック: まずは小規模なプロジェクトで試してから、本番環境に導入しましょう。
2. Bunで開発環境を一新する
Bunとは
Bunは2023年に登場した次世代のJavaScriptランタイムです。パッケージマネージャー機能も内蔵しており、npmの10倍以上の速度を誇ります。
導入方法
# Bunをインストール(macOS/Linux)
curl -fsSL https://bun.sh/install | bash
# Windows
powershell -c "irm bun.sh/install.ps1 | iex"
# プロジェクトで使う
bun install
# インストールの確認
bun --version
bun --revision
メリット
- インストールが圧倒的に速い
- TypeScriptをそのまま実行できる
- テスト、バンドラーも統合されている
注意点
比較的新しいツールなので、以下の点に注意が必要です。
- すべてのnpmパッケージとの互換性が保証されているわけではありません
- 企業の本番環境では、十分な検証期間を設けることをおすすめします
- コミュニティはまだ成長途中です
推奨: 新規プロジェクトや個人開発で試してみるのがベストです。
3. npm ciを活用する
npm installとの違い
npm ciはCI環境専用に設計されたコマンドで、次の特徴があります。
- package-lock.jsonだけを見て依存関係を解決(package.jsonは見ない)
- node_modulesを毎回削除してクリーンインストール
- 10〜30秒ほど高速化が期待できる
使い方
# 通常のインストールの代わりに
npm ci
# 本番環境用(開発依存パッケージを除外)
npm ci --omit=dev
使うべきタイミング
- CI/CD環境
- クリーンな状態でインストールしたいとき
- package.jsonとpackage-lock.jsonの整合性を保ちたいとき
重要: ローカル開発では従来通りnpm installを使いましょう。
4. キャッシュを活用する(CI環境)
~/.npmをキャッシュする方法
CI環境では、npmのキャッシュディレクトリをキャッシュすることで大幅に高速化できます。
GitHub Actionsでの設定例
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm' # この1行を追加するだけ
- name: Install dependencies
run: npm ci
より詳細な設定
- name: Setup Node.js
uses: actions/setup-node@v4
id: setup_node
with:
node-version: 20
- name: Cache npm directory
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm ci
node_modulesをキャッシュする方法
より高速化を狙う場合は、node_modulesそのものをキャッシュできます。
- name: Setup Node.js
uses: actions/setup-node@v4
id: setup_node
with:
node-version: 20
- name: Cache node_modules
uses: actions/cache@v4
id: cache
with:
path: node_modules
key: ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm ci
ポイント: キャッシュキーにNode.jsのバージョンとCPUアーキテクチャを含めることで、環境の違いによる問題を防げます。
5. Dockerでの高速化テクニック
問題点
Dockerコンテナ内でnpm installを実行すると、バインドマウントによるファイル同期が原因で遅くなります。
解決策:ボリュームマウントを使う
version: '3.9'
services:
app:
build: .
volumes:
- .:/app # ソースコードをバインドマウント
- node_modules:/app/node_modules # node_modulesはボリュームマウント
volumes:
node_modules: # 名前付きボリュームを定義
なぜ速くなるのか
node_modulesをボリュームマウントすることで、ホストとの同期が不要になり、コンテナ内のみで完結します。これにより大量のファイルI/Oが劇的に改善されます。
注意: node_modulesはホスト側には作成されないため、IDEの補完機能を使いたい場合は別途対応が必要です。
6. WSL2での高速化(Windows環境)
問題:npm installが固まる
WSL2環境でnpm installが異常に遅い、または固まってしまう場合があります。
解決策:DNSを変更する
手順1: wsl.confを編集
sudo nano /etc/wsl.conf
以下を追加します。
[network]
generateResolvConf = false
手順2: resolv.confを書き換え
# シンボリックリンクを削除
sudo rm /etc/resolv.conf
# GoogleのDNSを設定
sudo nano /etc/resolv.conf
以下を記述します。
nameserver 8.8.8.8
nameserver 8.8.4.4
手順3: WSLを再起動
# PowerShellで実行
wsl --shutdown
なぜこれで解決するのか
WSL2のデフォルトDNS設定が原因で名前解決に時間がかかることがあります。GoogleのパブリックDNSに切り替えることで、この問題を回避できます。
7. オフラインモードを活用する
ローカル開発での高速化
一度インストールしたパッケージは、npmのキャッシュに保存されます。オフラインモードを使うことで、ネットワークアクセスをスキップできます。
# キャッシュを優先的に使う
npm install --prefer-offline
# 完全にオフラインモード(キャッシュのみ)
npm install --offline
CI環境での活用
# キャッシュディレクトリを指定
npm ci --prefer-offline --cache /path/to/cache
注意: 初回はキャッシュがないため効果はありません。2回目以降で威力を発揮します。
速度比較まとめ
実際のベンチマーク結果を参考に、各手法の効果をまとめました。
| 手法 | 速度改善効果 | 導入難易度 | おすすめ度 |
|---|---|---|---|
| pnpm | ★★★★★ | ★★☆☆☆ | ★★★★★ |
| Bun | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| npm ci | ★★★☆☆ | ★☆☆☆☆ | ★★★★★ |
| キャッシュ活用(CI) | ★★★★☆ | ★★☆☆☆ | ★★★★★ |
| Docker最適化 | ★★★★☆ | ★★★☆☆ | ★★★★☆ |
| WSL2 DNS設定 | ★★★★☆ | ★★☆☆☆ | ★★★☆☆ |
| オフラインモード | ★★☆☆☆ | ★☆☆☆☆ | ★★★☆☆ |
※環境やプロジェクト規模により効果は変動します
まとめ:どの方法を選ぶべきか
すぐに試せる方法
-
CI環境を使っている場合:
npm ciに変更して、キャッシュを設定する -
ローカル開発:
--prefer-offlineオプションを試す - WSL2ユーザー: DNS設定を変更する
本格的に高速化したい場合
- 新規プロジェクト: Bunを検討する
- 既存プロジェクト: pnpmに移行する
- Docker環境: ボリュームマウントで最適化する
チーム開発での導入
チーム全体で新しいツールを導入する際は、次の手順がおすすめです。
- まず小規模なプロジェクトで検証する
- 開発者向けのドキュメントを整備する
- 段階的に本番環境へ展開する
特にpnpmは、npmとの互換性が高く、移行リスクが低いため最初の選択肢として最適です。
参考リンク
この記事が、あなたの開発環境の高速化に役立てば幸いです。実際に試してみて、体感速度を確かめてみてください。