メインコンテンツまでスキップ

第04章:「固定」には3段階ある📦📦📦

この章は、「どこまで固定すればいいの?」問題に“答え”を作る回です✍️✨ 結論から言うと、固定は 3レイヤーに分けると一生迷いません👍


🎯 この章のゴール

  • 「固定すべき場所」を 3つに分解できる🧠✨
  • “最小の固定” と “ガチ固定” の違いが分かる😎
  • どのプロジェクトでも使える 判断軸が手に入る🧭

✅ 2026-02-09 時点の前提になる事実(超重要)🧱

  • Nodeは v25 が Current、v24 が Active LTS、v22 が Maintenance LTS という状態です。(Node.js)
  • Dockerの公式Nodeイメージには、24-bookworm-slim24.13.0-bookworm-slim みたいな “固定しやすいタグ” が揃っています。(Docker Hub)
  • TypeScriptは 5.9 系が現行で、npmの “Latest” も 5.9.3 です。(typescriptlang.org)

🌈 固定の3段階(これが全体像!)

固定対象を ごちゃ混ぜにすると、初心者は100%混乱します😇 なので、こう分ける👇

  1. Node本体(ランタイム) 🟢🐳
  2. パッケージマネージャ(npm / pnpm / yarn) 🧰🔧
  3. 依存(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.jsonpackageManager フィールドで「このプロジェクトはこのpmでこのバージョンね!」を宣言できます📣

  • pnpm の最新は 10.29.1。(npm)
  • Yarn(Berry系)は npmの @yarnpkg/cli4.12.0。(npm)

例(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点セットが鉄板です👇

  • Nodenode:24-bookworm-slim(LTS固定)(Docker Hub)
  • パッケージマネージャ:まずは npmでOK(必要なら Corepack + packageManager で固定)(GitHub)
  • 依存:lockfileをコミットして、npmなら npm ci を使う(npmドキュメント)

これで「PC差で動かない」系の事故が激減します🥳✨


🧪 ミニ演習(5分)🕔✨:あなたのプロジェクトはどこまで固定できてる?

プロジェクトに対して、次の3つをチェック✅

  1. Node固定:Dockerfileの FROM node:... に “意図したタグ” が書いてある?(Docker Hub)
  2. PM固定package.jsonpackageManager を書く運用にする?(pnpm/yarnなら特に強い)(npm)
  3. 依存固定: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章では、この固定の考え方を使って「できた判定(動くの定義)」を作って、迷いをゼロにします😆✨