1712 字
9 分鐘

Astro incremental build 怎麼用?用 incrementalBuild 與 cacheKey 減少重建

Astro 部落格或文件站的頁數一多,最花時間的階段可能不是 bundling,而是每次都把所有 prerendered pages 重新輸出。即使只改了一篇文章,整個 [slug].astro route 仍可能重新產生大量 HTML。

Astro 7.2 在 2026 年 8 月 6 日加入 experimental incremental static builds,讓靜態頁面在「程式碼依賴沒有變、這條路徑的資料 key 也沒有變」時重用上一輪產物。直接答案是:先在設定檔開啟 experimental.incrementalBuild,再讓 getStaticPaths() 為每個 path 回傳會隨輸出資料變動的 cacheKey 沒有 cacheKey 的路徑仍會照常渲染。

這不是 runtime ISR,也不是只加一個全域 cache 就完成;它是 build 階段的選擇性重建,而且目前仍屬 experimental。

先確認這個功能適合你的 route#

Incremental static builds 針對的是 prerendered static pages。比較適合的路徑通常有以下特徵:

  • getStaticPaths() 會產生很多文章、文件或產品頁。
  • 每個 path 都有可以判斷資料是否變動的 digest、版本或時間戳。
  • CI 能夠在兩次 build 之間保存 Astro 的 cache directory。
  • 團隊願意在 experimental 功能上線前,用輸出差異做回歸。

如果頁面是 SSR、每次 request 都依賴即時資料,或路徑的輸出來源沒有可靠的變更 key,就不要先把它標成「可以安全跳過」。本文的設定範例聚焦靜態內容 route;Astro 7 的整體升級風險可以參考 Astro 7 升級前的 compiler、Vite 與 Markdown 清單

在 astro.config.mjs 開啟 incrementalBuild#

先確認專案已升到 Astro 7.2 或更新版本,再在 astro.config.mjs 加入旗標:

import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: {
incrementalBuild: true,
},
});

Astro 官方使用的是 incrementalBuild 單數名稱,不是 incrementalBuilds。如果設定寫錯,請先以安裝版本的 configuration reference 和 build log 為準,不要靠猜測的旗標名稱繼續排查 cache。

開啟旗標本身不會讓每一條 route 都開始重用。下一步必須在 route 的 getStaticPaths() 為每個 path 提供 cacheKey;這個設計讓你可以逐條 route 進入 experimental 行為,而不是一次改變整個網站的失效邏輯。

用 content entry digest 當作 cacheKey#

假設內容集合叫做 posts,而每個頁面只依賴該文章 entry 的內容,可以這樣寫:

---
import { getCollection } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection('posts');
return posts.map((post) => ({
params: { slug: post.id },
props: { post },
cacheKey: post.digest,
}));
}
const { post } = Astro.props;
---
<h1>{post.data.title}</h1>

post.digest 適合「頁面輸出主要由該 entry 內容決定」的情境。它不是一個可以到處複製的固定答案;如果頁面還依賴 locale、分類 metadata、遠端 CMS 欄位或其他 route-specific 輸入,cacheKey 就必須在那些輸入改變時一起改變。

換句話說,cacheKey 要回答的是:「這個 path 的輸出資料是否仍然和上一輪相同?」如果答案不確定,就先讓該 route 每次重建,等資料依賴盤點清楚後再 opt in。

Astro 會同時檢查 module graph 與 cacheKey#

Astro 7.2 的失效判斷有兩層:

判斷代表什麼發生變化時
Route 的 module graph hashtemplate、layout、component、imported asset 與 package code 等程式碼依賴該 route 的所有 path 重新渲染
每個 path 的 cacheKey該頁面所使用的資料是否變動只有 key 變動的 path 需要重新渲染

兩者都沒有變時,Astro 才會重用上一輪結果。只改了資料 key,仍可能要重建該 path;只改了 layout 或 component,則可能讓整條 route 的頁面重新輸出。這也是為什麼不能把 cacheKey 當成「忽略所有程式碼變更」的開關。

沒有回傳 cacheKey 的 path 會一直渲染。對尚未完成依賴盤點的 route,可以先保留沒有 key 的寫法,讓既有 build 行為不變,再以單一路由逐步驗證。

CI 要保存哪個 cache?#

Astro 官方說明 incremental build 使用 cacheDir,預設位置是 node_modules/.astro/,與 content layer 和 image cache 放在一起。若 CI 每次都從完全乾淨的 workspace 開始,這個功能就沒有上一輪結果可重用。

可以先把 build 分成兩種檢查:

Terminal window
# 第一次建立基準
time pnpm build
# 保留同一份工作目錄與 cache 後,再次執行
time pnpm build

CI 的 cache key 至少要與 lockfile、Node/Astro 版本和會影響輸出的 build 設定對齊。這是維運上的 cache 管理原則,不是把任何舊 cache 都視為有效;恢復 cache 後仍要檢查產出的 HTML、圖片與 Pagefind 索引。

如果網站還在處理大型 content collection,可以搭配 Astro Content Collection 的 collectionStorage 分塊方式,但兩者解決的階段不同:collectionStorage 影響內容資料的保存與載入,incremental build 則影響 prerendered route 是否需要重新輸出。

用輸出回歸驗證失效範圍#

不要只看第二次 build 變快就宣布設定完成。至少做三組變更:

  1. 只改一篇文章內容:確認該篇重新輸出,其他未變 path 沒有被錯誤重用。
  2. 改共用 layout 或 component:確認依賴該 module graph 的頁面都有更新。
  3. 改 route 依賴的 metadata 或外部資料 key:確認 cacheKey 有同步變動。

每組測試都保留 build command、變更檔案、輸出 HTML 的抽查結果與時間。若你使用圖片最佳化、RSS、sitemap 或 Pagefind,也要抽查這些衍生產物;「頁面沒有重新渲染」不一定代表整個 build pipeline 都不需要驗證。

目前功能仍是 experimental,官方也邀請使用者回報真實網站上的結果。對 production 站點,先選一條可回滾、可比對輸出的內容 route,等失效規則和 CI cache 都通過後再擴大使用。

這個功能真正的重點不是把所有 build 都變成增量,而是讓每個 path 的資料依賴可以被明確描述。 module graph 負責程式碼變更,cacheKey 負責該 path 的資料變更;兩邊都能驗證,才有資格跳過重建。

常見問題#

Q: Astro incremental build 是 ISR 嗎?#

A: 不是。Astro 7.2 的 experimental incremental static builds 發生在 build 階段,目標是跳過沒有變更的 prerendered pages;它不會把靜態頁面自動變成 request 時重新產生的 ISR。

Q: 開啟 incrementalBuild 後,所有頁面都會自動使用 cache 嗎?#

A: 不會。route 還要在 getStaticPaths() 對每個 path 回傳 cacheKey。沒有 key 的 path 仍會重新渲染;這是 Astro 保持既有行為、讓使用者逐條 route opt in 的方式。

Q: cacheKey 可以固定寫成同一個字串嗎?#

A: 不應該。key 應該在該 path 使用的資料改變時跟著改變;全部 path 共用固定字串會讓 Astro 缺少資料層的失效訊號。若暫時無法可靠計算 key,先不要為該 route opt in,比錯誤重用舊頁面更容易驗證。

參考資料:

Astro Blog:Astro 7.2

Astro Docs:Configuration Reference

Astro Roadmap:Incremental static builds RFC

Astro incremental build 怎麼用?用 incrementalBuild 與 cacheKey 減少重建
https://laplusda.com/posts/astro-incremental-static-build-cache-key/
作者
Zero
發佈於
2026-08-21
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。