Astro 7 升級前要檢查什麼?從 Astro 5/6 到 Vite 8 的建置清單
Astro 7 的升級重點不只是把 astro 版本號往上改。官方升級指南列出的變化包含 Vite 8、新的 Rust compiler、Markdown pipeline、穩定化的功能旗標,以及保留給 Advanced Routing 的 src/fetch.ts 檔名。
這篇整理成升級前清單。目的不是保證每個專案都要改程式碼,而是先找出會讓 build、Markdown 外掛、路由或產出 HTML 改變的地方,再安排可回滾的升級。
先確認你在哪個 Astro major
Astro 官方 v7 migration guide 是從 v6 到 v7;如果專案還在更舊版本,文件建議先完成前一個 major 的升級。不要把 Astro 5、6、7 的所有 breaking changes 一次混在同一個 diff 裡。
我在 ZeroOne 專案本機查到目前版本是 Astro 5.12.8、pnpm 9.14.4:
pnpm list astro --depth 0pnpm why astro升級前先建立分支並保存基準:
git switch -c chore/astro-7-upgradepnpm installpnpm checkpnpm build如果目前是 Astro 5,先依 Astro 6 的 migration guide 完成一次獨立檢查;確認 baseline build 通過後,再進入 v7。若已在 v6,官方推薦用這個工具同步更新 Astro 與官方 integrations:
pnpm dlx @astrojs/upgrade執行升級工具後先看 package.json 與 pnpm-lock.yaml 的 diff,不要在沒有讀過相依版本的情況下直接提交。
Vite 8:先查自訂 plugin 與 bundler 設定
Astro 7 使用 Vite 8 作為開發伺服器與 production bundler。官方指南指出,多數 Astro 專案可能不需要修改,但依賴 Vite internals 的 integration、plugin 或設定要另外檢查。
可以先搜尋:
rg -n 'rollupOptions|esbuild|vite|plugin' astro.config.mjs package.json src不要只看到 rollupOptions 就直接刪除。先確認它是否只是一般 Rollup 相容設定、是否有自訂 plugin、是否引用 Vite 私有 API,再對照 Vite 8 migration guide 測試。升級後至少要重新跑:
pnpm checkpnpm build如果 build 速度變快,也要把「輸出檔案、路由數量、Markdown HTML 和 client bundle」一起比對;速度不能取代產出正確性。
Rust compiler 會把寬鬆 markup 變成 build 問題
Astro 7 使用新的 Rust-based compiler,官方列出的行為差異包括:
- 未閉合的非 void HTML 或 component tag 會報錯。
- 不再把語意不合法的 HTML 自動重排成另一種結構。
- JSX-style whitespace handling 可能改變 inline element 之間的空白。
升級前可先做基本搜尋,然後依 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'這兩個搜尋只能抓到一部分風險,不能當成 HTML parser。真正的驗證仍是 build、檢查產出的 HTML,以及在瀏覽器確認文字空白、巢狀結構和互動元件。
把已穩定的 experimental 設定移到正確位置
Astro v7 migration guide 列出幾個不再需要留在 experimental 的設定:
- logger 改放到頂層。
- queuedRendering 已是預設行為,移除舊旗標。
- rustCompiler 已是預設且唯一的 compiler。
- advancedRouting 已啟用;同時要注意 src/fetch.ts 是保留檔名。
- cache 與 routeRules 若原本在 experimental,要移到頂層。
先找出專案是否真的有這些設定:
rg -n 'experimental|queuedRendering|rustCompiler|advancedRouting|routeRules|src/fetch\.ts' \ astro.config.mjs src package.json沒有使用的功能不要為了「跟新版本一致」而新增設定;有使用的功能才依 migration guide 移動,並為每個設定留下 build 或 runtime 驗證。
src/fetch.ts 與 Markdown pipeline 是兩個容易漏查的邊界
Advanced Routing 讓 src/fetch.ts 成為 Astro request pipeline 的入口,但 v7 把它列為保留檔名。如果你的專案原本就有同名檔案,升級前要先確認它的用途;不要直接覆蓋。
test -e src/fetch.ts && sed -n '1,220p' src/fetch.ts || true另一個邊界是 Markdown。Astro 7 引入新的預設 Markdown processor;如果專案依賴 remark/rehype plugin 的順序、AST 節點或自訂 directive,不能只看文章頁面還能打開就算完成。
ZeroOne 目前的設定檔有多個 remarkPlugins、rehypePlugins、數學公式、GitHub card 和自訂 admonition。升級時應先列出它們:
rg -n 'remarkPlugins|rehypePlugins|remark-|rehype-' astro.config.mjs src如果某個 plugin 依賴 unified pipeline,對照 Astro 文件是否需要明確使用 @astrojs/markdown-remark;不要在沒有測試所有 Markdown 文章前,直接接受預設 processor。應至少抽查表格、程式碼區塊、數學公式、directive、內部連結與 FAQ schema。
移除項目要在升級前找出來
Astro v7 migration guide 也列出先前已 deprecated 或被移除的項目,例如 @astrojs/db。搜尋的目的不是把所有命中都批次刪掉,而是先知道哪一項會影響 runtime:
rg -n '@astrojs/db|getContainerRenderer|astro:transitions' \ package.json pnpm-lock.yaml astro.config.mjs src如果沒有命中,記錄為已確認;如果有命中,就單獨建立 migration commit,避免和 Vite、Markdown、HTML 變更混在一起。
建置通過後,還要驗證網站輸出
靜態部落格最容易漏掉的是「build 成功,但產出的 HTML 或網址變了」。升級後至少檢查:
- 首頁、文章、tag、archive、RSS、sitemap 與英文路徑仍能產生。
- published、canonical、hreflang 和 trailing slash 沒有改變。
- Markdown heading id、程式碼區塊、數學公式與 admonition 沒有消失。
- 圖片路徑、local cover、Pagefind index 和 RSS description 都正常。
- 針對一篇使用 Content Loader 的文章,再確認資料仍能載入;可搭配 Astro Content Loader 的 glob collection 實作 對照。
若是 CSP、遠端圖片或 SEO 設定在升級後出現差異,應回到各自的檢查清單,例如 Astro CSP inline script 與 style 的 Report-Only 驗證 和 遠端圖片白名單設定,不要把所有輸出問題都歸咎於 Vite。
一個可回滾的 Astro 7 升級流程
可以把整個變更切成以下順序:
- 保存 Astro 5/6 的 pnpm check、pnpm build 與輸出抽查結果。
- 依官方 migration guide 先完成前一個 major,再升到 Astro 7。
- 讀 package.json、lockfile 與 integration diff。
- 盤點 Vite plugin、experimental 設定、src/fetch.ts 和 Markdown plugin。
- 逐項修正 compiler、Markdown 或 integration 問題。
- 重跑 check、build,並抽查路由、HTML、搜尋索引和社群 metadata。
- 只有在輸出與必要 runtime 行為都通過後,才合併升級。
這樣做的重點是保留一個能回到「已知可用」的節點。Astro 7 帶來的功能很多,但升級是否安全取決於你的 integration、Markdown pipeline 和實際產出,不是 release note 上的功能數量。
常見問題
Q: Astro 5 可以直接升到 Astro 7 嗎?
A: 官方 v7 migration guide 是從 v6 到 v7,較舊版本應先完成 Astro 6 的升級與驗證。分開 major 版本能讓 compiler、integration 和設定檔的錯誤更容易定位。
Q: 升級 Astro 7 一定要重寫所有 .astro 元件嗎?
A: 不一定。官方指出多數專案可能不需修改,但 Rust compiler 對未閉合 tag、無效 HTML 和 whitespace 的處理更嚴格。應以 pnpm check、pnpm build 和輸出抽查決定實際修正範圍。
Q: Vite 8 會讓所有 Astro plugin 失效嗎?
A: 不會直接推論成全部失效;主要風險在依賴 Vite internals、特定 plugin API 或 bundler 設定的 integration。列出實際 plugin,逐一對照 Vite 8 migration guide 並跑 build。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。