2012 字
10 分鐘

Astro 7.3.4 升級前要檢查什麼?從 Astro 5/6 到 Vite 8 的建置清單

截至 2026 年 9 月 23 日,Astro 7.3.4 是 7.3 系列的最新 patch;它在 9 月 22 日發布,補上 incremental build、astro check、Markdown escaping、dev server invalidation 與 domain-based i18n 等修正。這些變更看似比 major migration 小,卻可能直接影響產出的 HTML、開發時更新速度與部署環境。

這篇把 Astro 7 升級拆成兩層:先處理 Astro 5/6 到 v7 的 migration,再把 7.3.3、7.3.4 的 patch 修正轉成可執行的回歸測試。目標不是保證每個專案都要改程式碼,而是讓你知道哪些項目已驗證、哪些功能不適用,以及遇到問題時可以退回哪一個節點。

先確認你在哪個 Astro major#

Astro 官方 v7 migration guide 是從 v6 到 v7。若專案還在 Astro 5,先完成 Astro 6 的獨立升級與 baseline,避免把兩個 major 的 breaking change 混在同一個 diff 裡。

先留下版本、lockfile 和建置基準:

Terminal window
pnpm list astro --depth 0
pnpm why astro
pnpm install --frozen-lockfile
pnpm check
pnpm build

ZeroOne 的現有文章曾記錄 Astro 5.12.8 與 pnpm 9.14.4;實際升級前仍應以專案當下的 pnpm list 與 lockfile 為準。若目前是 Astro 6,可用官方升級工具整理 Astro 與官方 integration 的版本,但執行後要先讀 package.json 和 pnpm-lock.yaml 的 diff:

Terminal window
pnpm dlx @astrojs/upgrade

Vite 8:先查 plugin 與 bundler 設定#

Astro 7 使用 Vite 8 作為開發伺服器與 production bundler。多數專案不一定需要改動,但依賴 Vite internals、特定 plugin API 或 bundler 私有行為的 integration 要單獨驗證。

先找出實際設定,不要看到 rollupOptions 就直接刪除:

Terminal window
rg -n 'rollupOptions|esbuild|vite|plugin' astro.config.mjs package.json src

對每一個命中項目回答三個問題:

  1. 它是公開 Vite/Rollup 設定,還是依賴私有 API?
  2. 它會改變 chunk、asset、SSR 或 dev server 行為嗎?
  3. 升級後有沒有對應的 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 和輸出抽查:

Terminal window
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:

Terminal window
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;不要在不了解用途時直接覆蓋:

Terminal window
test -e src/fetch.ts && sed -n '1,220p' src/fetch.ts || true

Markdown 也要獨立測試。若專案依賴 remark/rehype plugin 的順序、AST 節點、數學公式或自訂 directive,不能只看文章頁面能開啟就算完成:

Terminal window
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 要補哪些 patch 回歸#

升到 7.3.4 不等於只測一次 production build。下面把官方 release notes 的修正範圍改寫成「有使用才執行」的測試表。

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 變了」。至少確認:

  1. 首頁、文章、tag、archive、RSS、sitemap 與英文路徑仍能產生。
  2. published、canonical、hreflang 和 trailing slash 沒有改變。
  3. heading id、程式碼區塊、數學公式、admonition 與圖片 alt 都保留。
  4. local cover、Pagefind index 和 RSS description 都正常。
  5. astro preview 能在乾淨環境啟動;--ignore-lock 只用於處理 preview lock,不是繞過所有部署問題。
Terminal window
pnpm check
pnpm build
pnpm astro preview --ignore-lock

如果 CSP、遠端圖片或 SEO 設定出現差異,應回到各自的檢查清單,例如 Astro CSP inline script 與 style 的 Report-Only 驗證 和 遠端圖片白名單設定,不要把所有輸出問題都歸咎於 Vite。

一個可回滾的升級順序#

  1. 保存目前 Astro 5/6 的 pnpm check、pnpm build 與輸出抽查結果。
  2. 先完成前一個 major,再升到 Astro 7;每一個 major 都留下獨立 commit。
  3. 讀 package、lockfile、Vite plugin、integration 和 experimental 設定的 diff。
  4. 先升到目標 7.3.4,再依 7.3.3/7.3.4 表格執行適用的 smoke test。
  5. 比較路由、HTML、asset、搜尋索引、RSS 與 runtime metadata。
  6. 只有在輸出與必要 runtime 行為都通過後,才合併升級;保留上一個可部署版本作為回退點。

常見問題#

Q: Astro 5 可以直接升到 Astro 7 嗎?#

A: 官方 v7 migration guide 以 v6 到 v7 為前提。較舊版本應先完成 Astro 6 的升級與驗證,這樣 compiler、integration 和設定檔的錯誤比較容易定位。

Q: Astro 7.3.4 只是 patch,為什麼要測圖片、i18n 和 dev server?#

A: 因為 patch 修正直接碰到 local image、domain routing、Markdown output、incremental build 和 module graph。沒有使用某項功能可以記為不適用,但使用中的邊界仍應有最小回歸。

Q: TypeScript 7 的 astro check 錯誤要怎麼處理?#

A: 先依 7.3.4 的錯誤訊息確認目前 Astro 對 TypeScript 7 的支援狀態,再選擇暫留支援版本或依官方建議補上相容套件。不要用忽略錯誤來掩蓋未確認的型別問題。

參考資料:

Astro Docs:Upgrade to Astro v7

Astro GitHub:[email protected] release

Astro GitHub:[email protected] release

Vite:Migration from v7

Astro Docs:CLI reference

Astro 7.3.4 升級前要檢查什麼?從 Astro 5/6 到 Vite 8 的建置清單
https://laplusda.com/posts/astro-7-upgrade-checklist/
作者
Zero
發佈於
2026-08-07
許可協議
CC BY-NC-SA 4.0