第04章:「固定」には3段階ある📦📦📦
この章は、「どこまで固定すればいいの?」問題に“答え”を作る回です✍️✨ 結論から言うと、固定は 3レイヤーに分けると一生迷いません👍
🎯 この章のゴール
- 「固定すべき場所」を 3つに分解できる🧠✨
- “最小の固定” と “ガチ固定” の違いが分かる😎
- どのプロジェクトでも使える 判断軸が手に入る🧭
✅ 2026-02-09 時点の前提になる事実(超重要)🧱
- Nodeは v25 が Current、v24 が Active LTS、v22 が Maintenance LTS という状態です。(Node.js)
- Dockerの公式Nodeイメージには、
24-bookworm-slimや24.13.0-bookworm-slimみたいな “固定しやすいタグ” が揃っています。(Docker Hub) - TypeScriptは 5.9 系が現行で、npmの “Latest” も 5.9.3 です。(typescriptlang.org)
🌈 固定の3段階(これが全体像!)
固定対象を ごちゃ混ぜにすると、初心者は100%混乱します😇 なので、こう分ける👇
- Node本体(ランタイム) 🟢🐳
- パッケージマネージャ(npm / pnpm / yarn) 🧰🔧
- 依存(lockfile) 📌🔒
1) Node本体を固定する🟢🐳(土台)
なぜ必要?🤔
Nodeは “同じコード” でも、バージョン差で挙動が変わることがあります(特に ESM/CJS、標準API、ビルド周り)💥 だから最初に Nodeを閉じ込めて固定します🔒
✅ どう固定する?
Dockerなら「イメージタグで固定」が最強です💪
公式イメージには、LTS系の 24-... と、さらに細かい 24.13.0-... みたいなタグが用意されています。(Docker Hub)
💡固定タグの“おすすめ段階”🧭
-
初心者の最適解(バランス型):
node:24-bookworm-slim- “v24系” の範囲で更新される(セキュリティ面に強い)🛡️
-
ガチ固定(再現性MAX):
node:24.13.0-bookworm-slimのように パッチまで固定- まったく同じ環境が再現できる(ただし更新は自分でやる)🔁
「最初はバランス型」→ 慣れたらガチ固定、が事故りにくいです😄✨
2) パッケージマネージャを固定する🧰🔧(道具)
ここ、地味にハマりポイント💣
同じ package-lock.json でも、npmのバージョン差で微妙に挙動が変わることがあります😇
さらに pnpm/yarn もバージョン差で lockfile の形式・解釈が変わります🌀
✅ どう固定する?
ここで出てくる救世主が Corepack です🦸♂️✨ Corepackは Nodeに同梱される範囲があり、少なくとも「Node 25 以降は同梱されない」扱いです(なので LTSの v24 が安定運用向き)。(GitHub)
そして package.json の packageManager フィールドで「このプロジェクトはこのpmでこのバージョンね!」を宣言できます📣
例(pnpmに固定する)
{
"packageManager": "pnpm@10.29.1"
}
(※数字は例。チーム/自分の運用で“揃える版”を決めて書く感じです👍)
例(Yarn 4系に固定する)
{
"packageManager": "yarn@4.12.0"
}
もし「npmで行く!」なら、まずは Nodeを固定=npmもほぼ一緒に固定になるので、最初はそれでも全然OKです😆 (後で必要になったら、npm自体を特定バージョンに上げ下げする運用もできます)
3) 依存を固定する(lockfile)📌🔒(本丸)
lockfileは「依存の設計図」🗺️
package.json は「希望(範囲指定)」
lockfile は「決定(このバージョン!)」
って感覚です😄
固定の心臓部はここ❤️🔥
✅ lockfile別の“固定コマンド”まとめ
npm(package-lock.json)
npm ciを使う(CI向け・クリーンインストール)🧼npm installと違う前提が明確に書かれています。(npmドキュメント)
pnpm(pnpm-lock.yaml)
- CIだと lockfile がズレてたら失敗する方向(
--frozen-lockfile相当がデフォルト)です。(pnpm)
Yarn(yarn.lock)
yarn install --immutableで lockfile がズレたら止めるのが王道です。(Yarn)
🧠 “最小の固定セット”はこれだけでOK(まず勝とう😆🔥)
初心者が最初に採用するなら、この3点セットが鉄板です👇
- Node:
node:24-bookworm-slim(LTS固定)(Docker Hub) - パッケージマネージャ:まずは npmでOK(必要なら Corepack +
packageManagerで固定)(GitHub) - 依存:lockfileをコミットして、npmなら
npm ciを使う(npmドキュメント)
これで「PC差で動かない」系の事故が激減します🥳✨
🧪 ミニ演習(5分)🕔✨:あなたのプロジェクトはどこまで固定できてる?
プロジェクトに対して、次の3つをチェック✅
- Node固定:Dockerfileの
FROM node:...に “意図したタグ” が書いてある?(Docker Hub) - PM固定:
package.jsonにpackageManagerを書く運用にする?(pnpm/yarnなら特に強い)(npm) - 依存固定:lockfileがコミットされていて、インストールが “ズレたら止まる” 設定?(npmドキュメント)
💥 よくある事故と対策(ここだけ覚えればOK)😇
- 事故①:Nodeだけ固定して満足 → lockfileが無い → 依存が毎回変わって「昨日動いたのに…」になる💀
- 事故②:lockfileはあるのに
npm installで更新される → “いつの間にかlockが書き換わる” 事故 → npmならnpm ciを基本にすると安定🧼(npmドキュメント) - 事故③:pnpm/yarn のバージョン差でlockfileが変わる
→ Corepack +
packageManagerで揃えると強い🧰(GitHub)
🤖 Copilot/Codexに投げる一言(そのままコピペOK)✨
「このリポジトリを“3段階固定(Node / パッケージマネージャ / lockfile)”にしたい。
Nodeは v24(LTS) の bookworm-slim 系で、依存はズレたらエラーで止めたい。
npmなら npm ci、pnpmなら frozen、yarnなら immutable の方針で、必要な設定ファイルと最小手順を提案して。」
🏁 まとめ:固定は“レイヤーで考える”だけで勝てる🎉
- Node固定=環境の土台を揃える🧱
- PM固定=道具の挙動を揃える🧰
- lockfile固定=依存の中身を揃える🔒
次の第5章では、この固定の考え方を使って「できた判定(動くの定義)」を作って、迷いをゼロにします😆✨