Cloudflare Pages 的 Astro 檔案數超過怎麼辦?先分清 Pages 與 Workers
Astro build 成功,不代表 Cloudflare Pages 一定能完成上傳。遇到部署階段的 file limit 錯誤時,先不要急著刪頁面或把整個專案改成 SSR;先量出 dist/ 實際產生多少檔案,再分清楚你遇到的是總檔案數、單檔大小,還是其實需要 request-time rendering。
Cloudflare 目前的 Pages 限制是:Free 每個 site 最多 20,000 個檔案,付費方案可到 100,000 個,但要在 Pages project settings 設定 PAGES_WRANGLER_MAJOR_VERSION=4。單一 Pages asset 上限則是 25 MiB。Workers Static Assets 也有相同的 20,000/100,000 檔案與 25 MiB 單檔限制,因此「改搬到 Workers」不會自動得到無限的靜態檔案空間。
先量 dist/,不要只數 Markdown
在與部署相同的 Node、套件和 build command 下執行:
pnpm buildfind dist -type f | wc -ldu -sh distfind dist -type f -size +25M -print第一個數字是要和平台檔案數比較的起點。du -sh 只能看總磁碟大小,不能代替檔案數限制;最後一個指令則找出可能超過單檔限制的資產。要特別注意 sitemap、分頁、圖片轉檔、source map 和每一篇預先產生的 HTML,因為它們都會成為 dist/ 的檔案。
Pages、付費 Pages 與 Workers Static Assets 怎麼選
dist/ 狀態 | 先做什麼 | 適合的路徑 |
|---|---|---|
| 少於 20,000 個檔案,沒有 SSR 需求 | 保持靜態輸出並驗證 build | Pages Free 或其他靜態主機 |
| 超過 20,000、但低於 100,000 個檔案 | 確認方案並設定 PAGES_WRANGLER_MAJOR_VERSION=4 | 付費 Pages;也可比較付費 Workers Static Assets |
| 超過 100,000 個檔案 | 減少生成輸出、拆站或重新設計路由 | 不要只換平台,因為付費靜態資產仍有上限 |
| 需要 sessions、bindings 或 request-time rendering | 盤點 runtime、cache、CPU 與路由 | Astro Cloudflare adapter + Worker-oriented deployment |
如果只是把大批內容預先渲染成 HTML,先問「是否真的每頁都要在 build time 產生」。改變生成策略可能降低檔案數,但也可能把成本與故障點移到 Worker runtime;這不是單純的部署設定替換。
純靜態 Astro 不必先加 Cloudflare adapter
Cloudflare 的 Astro 文件把兩種輸出分得很清楚:純預先產生的 Astro site 可以直接把 dist/ 當 static assets 提供,不必安裝 @astrojs/cloudflare;需要 on-demand rendering 或 Cloudflare bindings 時,才使用 adapter 和 Worker script。
若選擇 Workers Static Assets,設定可以是這樣:
{ "name": "my-astro-site", "compatibility_date": "2026-08-18", "assets": { "directory": "./dist", "not_found_handling": "404-page" }}assets.directory 必須指向實際的 Astro build output。not_found_handling 也要按路由需求選擇;靜態內容網站不應為了「看起來像成功」就任意使用 SPA fallback,否則遺失的頁面可能被回傳成首頁。
如果網站本來就需要 sessions 或 Cloudflare bindings,請把它當成另一種輸出模型來驗證。Cloudflare 的 adapter 預設會把 Astro 設成 output: 'server',頁面轉由 Worker 在 request time 處理;這和把 dist/ 上傳成靜態檔案不是同一條部署路徑。
從 Pages 搬到 Workers 時要換設定層
Pages 的 build output 設定與 Workers Static Assets 的設定名稱不同。Pages 可能使用:
{ "name": "my-pages-project", "pages_build_output_dir": "./dist"}搬到 Worker 專案後,要改成 assets.directory,並用 wrangler deploy 走新的部署流程。切換前依序確認:
- 記下原本 Pages 的 build command、output directory 和自訂 domain。
- 在本機執行
pnpm build,確認dist/目錄與實際部署一致。 - 只在改用 Workers Static Assets 時,把
pages_build_output_dir換成assets.directory。 - 為 preview 使用明確的 compatibility date,並檢查 404、redirect、HTML、CSS 和圖片路徑。
- 先部署非正式環境,確認代表性網址後再切換 domain。
如果問題是單一 .astro/data-store.json 或其他生成資料過大,可以參考 Astro Content Collection 用 collectionStorage 分塊儲存。那能處理特定輸出檔過大的問題,但不會改變 Cloudflare 的總檔案數上限;若問題是 deploy 後多出不需要的 SESSION binding,則看 Astro Cloudflare 的 session: false 邊界。
把「檔案限制」和「SSR 需求」分開判斷
這次錯誤如果只是 20,000 個檔案,第一個修正方向是量測和控制生成輸出;如果網站需要登入、個人化頁面、KV、D1、R2 或 AI binding,則要重新評估 runtime。不要因為 static upload 失敗,就直接把所有頁面改成 on-demand rendering,也不要因為想保留靜態部署,就把必要的 server logic 硬塞進 build time。
判斷順序可以固定成:數檔案 → 查單檔大小 → 判斷是否純靜態 → 再選 Pages 或 Workers 的輸出模型。 這樣平台選擇是由實際需求驅動,而不是被第一個錯誤訊息牽著走。
常見問題
Q: Cloudflare Pages Free 可以放多少 Astro 生成檔?
A: Cloudflare 目前文件列出 Free plan 每個 Pages site 最多 20,000 個檔案;付費方案可到 100,000 個,但必須在 Pages project settings 設定 PAGES_WRANGLER_MAJOR_VERSION=4。仍要以部署當天的官方限制頁面為準。
Q: Workers Static Assets 沒有 Cloudflare Pages 的檔案數限制嗎?
A: 仍有相同量級的限制:Workers 文件列出 Free 每個 Worker version 20,000 個 static asset files、付費 100,000 個,單檔 25 MiB。搬到 Workers 不等於移除檔案數上限。
Q: 純靜態 Astro site 一定要安裝 @astrojs/cloudflare 嗎?
A: 不一定。Cloudflare 的 Astro 指南指出,完全預先產生的 site 可以直接提供 dist/ 靜態資產;需要 on-demand rendering 或 Cloudflare bindings 時,才使用 adapter。先決定輸出模型,再安裝整合套件。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。