我的好朋友 Claude
第 115 期|Claude Code|創作者、打工仔|

Claude Code 處理 dependency 升級:major version bump 點安全行、breaking change 點處理

React 18 → 19、Next.js 14 → 15、Node 18 → 20。Major version bump 永遠唔會「跑一個 npm update 就完」。教你用 Claude Code 跑一次受控升級:整理 changelog、開獨立 branch 安裝、逐條 breaking change 分流、跑 regression smoke test。中小企接手 5 年舊 codebase 都搞得掂。

難度 ★★★時間 60 分鐘用具 Claude Code CLI、你個 project + lockfile (package-lock.json / pnpm-lock.yaml / etc.)
【編者撰】一個香港人

情境

你係一間香港 agency 嘅 freelance dev。新客戶交咗一個 5 年舊嘅 Next.js codebase 畀你接手 —— 原本團隊散咗,老闆要你 6 個禮拜內推出兩個新功能。

git clone + npm install,第一輪 warning:

老闆問:「使唔使升級 framework?」你心裡知答案係要,但每次 major bump 都恐怖:

呢個規律嘅根本問題:major version bump 唔係「一個 command 嘅事」,係一個要 有系統咁逐步重構嘅工程 —— 但 changelog 寫得似查閱用嘅技術文件、唔係一份升級攻略。

Claude Code 啱呢類嘢:佢可以消化 changelog、掃描你個 codebase、具體指出你邊度會 break、逐個處理。呢篇示範一套受控升級流程,React 18 → 19 / Next.js 14 → 15 / Node 18 → 20 都通用。

跟住做

1. 升級前評估(15 分鐘)

升之前要知道你會撼到咩。唔好直接跑 npm install react@19

開一條獨立 branch:

git checkout -b upgrade/react-19

落第一個 prompt:

我想升級 React 18 → 19。麻煩你:
1. 抓 React 19 release notes + migration guide
2. 掃描我個 codebase(特別係 src/)
3. 列出我具體 codebase 入面會 break 嘅地方,唔好籠統講
4. 估個工作量範圍(細 patch / 中度重構 / 大手術)

Claude 會:

呢一步係防止「升咗先諗」嘅最大保險。如果報告出嚟係 80 處都要改,你可以同老闆攤牌:呢個唔係 1 日工作,係 3 日。

⚠️ Claude 整理嘅 changelog 唔係 100% 齊全。將佢當作 初步分流,唔係最終定案。

2. 獨立 branch + 安裝(10 分鐘)

確認個計劃之後先至裝。

# 鎖死 Node 版本先(用 .nvmrc / volta / asdf)
echo "20" > .nvmrc
nvm use 20

# Install 新版
pnpm add react@19 react-dom@19
# 或 npm install react@19 react-dom@19

⚠️ 唔好順手 npm update —— 你只係想升 React,唔想連 50 個 transitive dependency 都一齊飛。Major bump 一次處理一個 framework,先至 isolate 到問題根源。

跑第一輪 sanity check:

pnpm typecheck
pnpm build

預期會死。死法越具體越好(type error > runtime crash > 靜悄悄嘅 regression)。

3. 同 Claude 逐條分流 breaking change(25 分鐘)

將 error log 整段交畀 Claude:

typecheck 跑完出咗呢一堆 error(貼 stack trace)。
參照 step 1 個 migration plan,逐個 file 處理:
- 先解釋點解會 break
- 再出最精簡嘅 diff
- 唔好一次過改 10 個 file,1 個 1 個嚟畀我睇

關鍵:逐個 file 批准。Claude 會傾向「一氣呵成」全部改晒,但 dependency upgrade 出錯嘅代價高 —— 你需要每個 diff 都睇過。

Claude Code 嘅 Edit 工具會逐個 file 問權限,照常按 Yes / No 即可。每改完一個 file,重新跑 typecheck,確認 error 數量下降、無新 error 加入。

常見陷阱:

4. Regression smoke test(10 分鐘)

Typecheck + build 過 ≠ 行得起。

pnpm dev
# 開瀏覽器,跑一次最關鍵嘅 user flow

最少跑:

如果有 E2E test:

pnpm test:e2e

冇 E2E?同 Claude 講:

我冇 e2e test。麻煩寫 3 個 Playwright smoke test,覆蓋:
1. Homepage 載入無 console error
2. 主要 navigation link 全部 click 得通
3. 一個有代表性嘅 form 可以提交成功

跑過、綠燈、再 merge。

git checkout main
git merge upgrade/react-19

🎉 Major bump 一次完成、無 regression、留低一條清楚嘅紀錄(branch history)。

變化

變化 1:Node major version bump(runtime 改變)

升 Node 18 → 20 / 22 同 framework bump 唔同 —— 影響嘅唔止 application code,連 build tool、CI image、Docker base 都要跟。

Claude 嘅角色:

我要升 Node 18 → 20。
1. 列出 Node 20 對比 18 嘅 breaking change(特別係 fetch、test runner、ESM)
2. 掃描我個 codebase + package.json + Dockerfile + .github/workflows
3. 出 checklist:邊個 file 要改、邊個 CI step 要換 base image

關鍵額外步驟:

Runtime bump 嘅麻煩位係環境唔同步:local 升咗、CI 未升 → 喺 local 綠燈、喺 CI 紅燈。Claude 幫你一次過掃晒所有 config file。

變化 2:Framework major bump(Next.js / Vue / Nuxt 等)

Framework bump 影響面最大 —— routing、data fetching、build pipeline 都可能換。

以 Next.js 14 → 15 為例,重要嘅 break:

呢類 bump 用 Claude Code 嘅 codemod 做法:

Next.js 15 將 cookies() 改做 async。
1. 揾我所有用到 cookies() / headers() / params 嘅地方
2. 一個一個 file 改:加 await + 將上游 function 轉 async
3. 順住 type error 一路向上推

Claude 識追 type error 點樣一層層傳上去 —— 你改一個 server component → 用佢嘅 page route 要變 async → page 嘅 metadata generator 要變 async → 一路向上。逐個 file 改、逐個 file 批准,30 分鐘搞掂一條本來要 debug 半日嘅鏈。

變化 3:Database driver bump(資料完整性額外重要)

Driver bump(pg、mysql2、Prisma、Drizzle 等)係風險最高嘅 dependency upgrade —— 一條 query 行為微微唔同 = production 資料損壞。

額外步驟:

我要升 Prisma 5 → 6。麻煩:
1. 列出 breaking change,特別點出任何會影響 query 結果嘅
2. 掃描我所有 .prisma migration + 所有 prisma.*.create/update/findMany
3. 列出邊啲 query 嘅行為可能微妙變化(date handling / null handling / transaction isolation)

Driver bump 一定要做嘅步驟:

⚠️ Claude 識讀 changelog + 掃 code,但 production data 嘅 edge case 佢唔識。Driver bump 必須人手檢視 staging dataset。

拆解:點解 work,同邊度會爆

跟到上面就已經用得。下面呢段係畀**想由「升完跑得起」做到「升完三個月都唔會半夜爆 prod」**嘅人——初學者可以跳過,唔影響你跟住做。

Dependency upgrade 最危險嘅地方係:最大鑊嘅問題,唔會喺你個 terminal 紅燈出現。Typecheck 綠、build 綠、page 開得到,你以為穩陣,但有幾類嘢會靜悄悄等你 merge 完先發作。呢幾個位你要預咗:

1. Claude 講嘅 breaking change,可能係「佢以為」嘅版本 Claude 嘅知識有 cutoff,而 framework 升得快。你問佢「React 19 點升」,佢答嘅可能係某個時間點嘅理解——RC 同正式版之間 API 改過、minor patch 又改過。

2. grep 掃唔到嘅用法,先至係漏網之魚 step 1 靠掃 code 揾受影響嘅 API,但 grep 類掃描只睇到「字面寫成咁」嘅用法。

3. Typecheck 綠燈 ≠ 行為冇變 最陰公嘅 breaking change 唔會改 type signature,只改行為——上面提過 Next.js 15 個 caching 預設由 cache-by-default 轉去 fetch-fresh,type 完全唔變。

4. Codebase 太大,Claude 中途會「斷片」 5 年舊 codebase 塞唔晒入一個 context window。分幾次 session 改,Claude 唔會記得上一 session 點改。

呢幾個位,就係「升完跑得起」同「升完三個月都信得過」之間嘅距離。

一個心態

Dependency upgrade 嘅深層體會:bump 唔係「一個動作」,係「一段過程」

未有 Claude Code 之前,香港中小企 / freelance dev 嘅慣性係 唔升

呢個拖延嘅累積成本巨大 —— 5 年後變成冇人維護得到嘅 codebase,客戶要重寫,重寫報價 30 萬。

Claude Code 改變咗條數:1 小時受控升級(升前評估 + 獨立安裝 + 分流 + smoke test)取代咗 1 日驚青升級。1 小時報得出價、做得起、有紀錄可查。

換個角度睇:dependency upgrade 由「高風險大手術」變成「日常保養」。每兩個月做一次、每次升一兩個 framework,你個 codebase 永遠喺最新版減一,CVE 永遠喺修緊,交接永遠順手。

最後提醒:

下個鐘揀你個 stack 入面最舊嗰個 dependency,開條 branch 試一輪受控升級。3 個月後你個 codebase 健康程度會係另一個級數。

文中工具 · 連結

  • 開發者用 — terminal 入面同 Claude pair coding

睇完想同 Claude 一齊行一次?

撳一撳,就將成段 tutor 指示(連埋成篇文嘅內容)抄入剪貼簿。 貼入 Claude.ai 或 Claude Desktop,佢會用廣東話帶你一步一步行, 每步問你填關鍵位,最後畀返一個專為你情況寫嘅 prompt 帶走。

下期預告 · 相關情境
訂閱本副刊

每週日早上,
一道新菜送到你 inbox。

一篇 use case、一個香港情境、一個跟得到嘅做法。 冇 sell course、冇話你「再唔學就會失業」。

訂閱通道執緊緊
newsletter service 仲未接通。想第一時間收到新文章——
直接 email 我哋寫一句「訂閱」就得。

Email 「訂閱」畀我