Astro 7.4.2 升級檢查:Node.js 門檻、開發伺服器與建置回歸
Astro 7.4.2 的升級不能只改套件版本:這次 patch 同時把最低 Node.js 版本提高為 22.23.4。本機能安裝成功,CI、容器和部署平台仍可能使用另一個 runtime;先對齊環境,再測開發伺服器與實際輸出。
本文於 2026 年 10 月 22 日查核 7.4.2 官方 release,保留從 Astro 5/6 到 v7 的遷移重點,補上這次 patch 的驗收方法。以下是文件與程式碼檢閱形成的清單;本專案仍使用 Astro 7.3.8,沒有把本站建置通過當成 7.4.2 的實測。
7.4.2 先核對 Node.js,再檢查 dev 與 build 是否互相干擾
7.4.2 的 package.json宣告 engines.node: >=22.23.4。這是套件最低門檻,不代表任何高於該數字的舊 patch 都已包含最新安全修正。官方此次提高門檻的理由是 10 月 Node.js 安全更新;若使用 Node.js 24 或 26,仍需核對自己版本線的安全 patch,可參考 Node.js 更新判斷與回歸清單。
在專案根目錄、本機終端與 CI 的安裝階段各執行一次下列唯讀指令;部署時若有 server runtime,也在那個環境核對。靜態站則先確認實際負責 build 的環境:
node --versionnode -p 'JSON.stringify({ executable: process.execPath, node: process.versions.node, platform: process.platform, arch: process.arch })'pnpm list astro --depth 0把每個環境的結果列在同一份升級紀錄中。只修改 .nvmrc 或 CI matrix 而未核對實際 binary,不能證明平台已採用新版本;engines 通過也不能取代依賴安裝和應用測試。
這次修正的驗收依功能分流,沒有使用的項目標示不適用:
| 專案有使用的功能 | 升級後的檢查方法 |
|---|---|
dev 期間另外執行 astro sync、check 或 build | 先開 dev 並操作一個互動 island,再於另一終端執行檢查/建置,回到原分頁確認互動仍正常;release 修正了這些命令覆寫 dev optimized dependencies 的問題 |
astro:env/server 且變數含 $& 等替換樣式 | 以無敏感的測試值啟動 dev,確認模組能解析、頁面讀到原字串;不要把正式金鑰貼進診斷紀錄 |
server:defer island 匯入 astro:actions 或 astro:config/server | 重啟 dev,先開另一個 island 頁,再開目標頁;這是官方修正中特定的載入順序邊界 |
Cloudflare adapter 與間接 require node-fetch 的 server 依賴 | 啟動 dev 並走到該依賴的呼叫路徑,確認不再出現 Calling require for "node-fetch";靜態 build 無法驗證此 dev 問題 |
experimental.collectionStorage: "chunked" | 對照升級前後的 collection 筆數、特殊字元與渲染內容,再量測 sync;官方大型資料集的改善不等於本站速度保證 |
先建立升級前的可重現基準,再逐項驗收。若只能執行 production build,就把 dev、adapter 與載入順序測試記為未驗證,不要把整份清單勾選完成。
先確認你在哪個 Astro major
Astro 官方 v7 migration guide 是從 v6 到 v7。若專案還在 Astro 5,先完成 Astro 6 的獨立升級與 baseline,避免把兩個 major 的 breaking change 混在同一個 diff 裡。
先留下版本、lockfile 和建置基準:
pnpm list astro --depth 0pnpm why astropnpm install --frozen-lockfilepnpm checkpnpm buildZeroOne 的現有文章曾記錄 Astro 5.12.8 與 pnpm 9.14.4;實際升級前仍應以專案當下的 pnpm list 與 lockfile 為準。若目前是 Astro 6,可用官方升級工具整理 Astro 與官方 integration 的版本,但執行後要先讀 package.json 和 pnpm-lock.yaml 的 diff:
pnpm dlx @astrojs/upgradeVite 8:先查 plugin 與 bundler 設定
Astro 7 使用 Vite 8 作為開發伺服器與 production bundler。多數專案不一定需要改動,但依賴 Vite internals、特定 plugin API 或 bundler 私有行為的 integration 要單獨驗證。
先找出實際設定,不要看到 rollupOptions 就直接刪除:
rg -n 'rollupOptions|esbuild|vite|plugin' astro.config.mjs package.json src對每一個命中項目回答三個問題:
- 它是公開 Vite/Rollup 設定,還是依賴私有 API?
- 它會改變 chunk、asset、SSR 或 dev server 行為嗎?
- 升級後有沒有對應的 build、preview 或瀏覽器 smoke test?
不要只用「build 成功」判斷 bundler 相容性;還要比對輸出檔案、路由數量、Markdown HTML、client bundle 和 runtime error。
Rust compiler 會讓寬鬆 markup 變成錯誤
Astro 7 使用新的 Rust-based compiler,對未閉合 tag、無效 HTML 與 JSX-style whitespace 的處理更嚴格。可以先做低成本搜尋,再把真正的修正交給 pnpm check、pnpm build 和輸出抽查:
rg -n '<(p|div|span|section|main|article|Layout)([^>]*)$' src --glob '*.astro'rg -n '>\s*<(span|a|strong|em)' src --glob '*.astro'這些規則只能抓到部分風險。最小回歸範圍應包含巢狀 component、inline 文字空白、<script>/<style>、表單和含有特殊字元的內容。
把穩定功能移出 experimental
依 Astro v7 migration guide,升級時要盤點這些設定是否還留在舊位置:
- logger 改放到頂層設定。
queuedRendering已是預設行為,移除過時旗標。rustCompiler已是預設且唯一的 compiler。advancedRouting已啟用,並保留src/fetch.ts這個特殊檔名的語意。- cache、route rules 等設定若原本放在
experimental,依文件移到頂層。
使用搜尋建立清單,不要批次刪除所有 experimental:
rg -n 'experimental|queuedRendering|rustCompiler|advancedRouting|routeRules|src/fetch\.ts' \ astro.config.mjs src package.json沒有使用的功能不要為了「看起來像新版」而新增設定;有使用的功能則為每一項留下 build 或 runtime 證據。
src/fetch.ts 與 Markdown pipeline
Advanced Routing 讓 src/fetch.ts 成為 request pipeline 的保留檔名。升級前先確認專案是否已有同名檔案,以及它是不是一般 utility;不要在不了解用途時直接覆蓋:
test -e src/fetch.ts && sed -n '1,220p' src/fetch.ts || trueMarkdown 也要獨立測試。若專案依賴 remark/rehype plugin 的順序、AST 節點、數學公式或自訂 directive,不能只看文章頁面能開啟就算完成:
rg -n 'remarkPlugins|rehypePlugins|remark-|rehype-' \ astro.config.mjs src package.json至少抽查表格、程式碼區塊、數學公式、admonition、圖片 alt、內部連結與 FAQ schema。如果站台有 Content Loader,也要抽查一篇 collection 文章;可參考 Astro Content Loader 的 glob collection 實作 對照資料是否仍能載入。
從舊版跨上來,保留 7.3.3/7.3.4 的回歸項目
如果從 7.3.2 或更舊版本升級,下列歷史 patch 的修正仍適合作為回歸範圍。它們不是本次 7.4.2 才加入的功能;只測一次 production build 也無法涵蓋 dev 行為。
Astro 7.3.3
| 修正範圍 | 升級後要驗證什麼 |
|---|---|
| local image 輸出在特定情境下可能回應錯誤或遺失 | 抽查 local image、missing image 與 image service 的成功/失敗回應 |
| locale 大小寫與底線路徑的處理修正 | 用大小寫不同或含底線的 locale 產生頁面,確認 canonical、redirect 與 fallback 一致 |
| preview lock、dev toolbar、middleware invalidation 修正 | 重啟 dev/preview,確認殘留 lock 不會阻塞;修改 middleware 後確認頁面立即使用新結果 |
getImage() 型別、MDX prebundle 與 WASM 測試修正 | 執行 pnpm check,並抽查使用 image helper、MDX integration 或 WASM 的頁面 |
Cloudflare prerender 與 nodejs_compat、trailing slash response 修正 | 若使用 Cloudflare adapter,測試 prerender、redirect body、headers 與 adapter fallback |
| SVGO 4.0.2 與 dev startup 等依賴/效能修正 | 比較 SVG 輸出與 dev server 啟動時間,不把速度變快當成內容正確性的證據 |
Astro 7.3.4
| 修正範圍 | 升級後要驗證什麼 |
|---|---|
| incremental build 在 module 或 compiled CSS 引用 bundled asset 時,避免重複 render 不變頁面 | 比較 clean build、第二次 build 與只改一個頁面後的輸出;確認 asset hash 和 HTML 參照仍一致 |
astro check 對 TypeScript 7 顯示更清楚的 unsupported 訊息與升級方向 | 若 CI 已嘗試 TypeScript 7,確認錯誤是可理解的版本提示;不要把提示誤判成 Astro component 錯誤 |
| Markdown image 的 alt/title 不再被重複 escape | 用含 & 等特殊字元的 Markdown 圖片,檢查產出 HTML 是否只有預期的 entity |
| dev server 不再每次 request 都重新評估整個 server module graph | 修改 astro:head、middleware 與 server module,確認 dev 更新不會造成不必要的整站重載 |
domain-based i18n routing 尊重 security.allowedDomains | 若使用 domain i18n,對允許與不允許的 host 各測一次,確認 fallback、redirect 與安全設定一致 |
responsive styles 的 object-position 錯誤值處理與 Windows AI agent 行為修正 | 抽查圖片 responsive 設定;Windows 專案則重新跑 agent/dev workflow,其他環境記為不適用 |
這些測試不是每個站台都要全部執行。沒有 Cloudflare、domain i18n、TypeScript 7 或 WASM 的專案,應記錄「不適用」,不要為了填滿清單而新增假的測試。
建置成功後要驗證實際輸出
升級最容易漏掉的是「build 成功,但網址或 HTML 變了」。至少確認:
- 首頁、文章、tag、archive、RSS、sitemap 與英文路徑仍能產生。
- published、canonical、hreflang 和 trailing slash 沒有改變。
- heading id、程式碼區塊、數學公式、admonition 與圖片 alt 都保留。
- local cover、Pagefind index 和 RSS description 都正常。
astro preview能在乾淨環境啟動;--ignore-lock只用於處理 preview lock,不是繞過所有部署問題。
pnpm checkpnpm buildpnpm astro preview --ignore-lock如果 CSP、遠端圖片或 SEO 設定出現差異,應回到各自的檢查清單,例如 Astro CSP inline script 與 style 的 Report-Only 驗證 和 遠端圖片白名單設定,不要把所有輸出問題都歸咎於 Vite。
一個可回滾的升級順序
- 保存目前 Astro 5/6 的
pnpm check、pnpm build與輸出抽查結果。 - 先完成前一個 major,再升到 Astro 7;每一個 major 都留下獨立 commit。
- 讀 package、lockfile、Vite plugin、integration 和 experimental 設定的 diff。
- 固定目標 Astro 7.4.2 與對應 Node.js 安全 patch,再依本次與歷史修正清單執行適用的 smoke test。
- 比較路由、HTML、asset、搜尋索引、RSS 與 runtime metadata。
- 只有在輸出與必要 runtime 行為都通過後,才合併升級;保留上一個可部署版本作為回退點。
常見問題
Q: Astro 5 可以直接升到 Astro 7 嗎?
A: 官方 v7 migration guide 以 v6 到 v7 為前提。較舊版本應先完成 Astro 6 的升級與驗證,這樣 compiler、integration 和設定檔的錯誤比較容易定位。
Q: 為什麼 Astro patch 也會提高 Node.js 最低版本?
A: Astro 官方支援政策允許在已揭露並修補的 Node.js 安全問題影響 Astro 時,提高 Maintenance LTS 的最低版本。7.4.2 就採用這項政策;因此要同時核對套件 engines 與各個環境實際執行的 Node.js。
Q: TypeScript 7 的 astro check 錯誤要怎麼處理?
A: 先依 7.3.4 的錯誤訊息確認目前 Astro 對 TypeScript 7 的支援狀態,再選擇暫留支援版本或依官方建議補上相容套件。不要用忽略錯誤來掩蓋未確認的型別問題。
參考資料:
Astro Docs:Upgrade to Astro v7
Astro GitHub:astro@7.3.4 release