Kent Shen
← 所有文章

Cloudflare Workers 與 Pages 差在哪?我踩過的三個坑

  • Cloudflare
  • Workers
  • 開發筆記

如果你在 Cloudflare 上部署過網站,大概看過「Workers & Pages」這個選單。它們放在同一個地方,介面也很像,我一開始以為只是同一個東西的兩種叫法。實際上不是,而且我在這上面踩了幾次一樣的坑。

怎麼分辨你的專案是哪一種

最快的判斷方式是看網址:

  • 網址是 xxx.pages.dev:這是 Cloudflare Pages。
  • 網址是 xxx.workers.dev:這是 Workers with Static Assets(Workers 搭配靜態資源)。

兩種都能服務一個前端網站,也都能附帶後端邏輯,但部署的指令不同:

# Workers with Static Assets
npx wrangler deploy

# Cloudflare Pages
npx wrangler pages deploy

坑一:指令用錯,找不到專案

我的幾個專案在 Cloudflare 上是 Workers 專案,但我習慣性敲出 wrangler pages deploy,結果得到「project does not exist」。這個錯誤訊息很誤導人,因為專案明明就在 Dashboard 裡。原因是 Pages 系統裡真的沒有這個專案,它從頭到尾註冊在 Workers 那一邊。

規則很簡單:Workers 的所有指令就是把 pages 那一段拿掉,wrangler secret put、wrangler dev、wrangler tail 都是。

坑二:一個 Worker 同時管前端與 API

Workers 的做法是在 wrangler.jsonc 裡設定 assets.directory 指向建置出來的靜態檔,再用 main 指向一支 Worker 腳本。請求進來時,Worker 先看自己有沒有要處理這個路徑,沒有就交給靜態資源。這比 Pages Functions 那種每個端點一個檔案的方式更直接,新增 API 只要多寫一個 if (url.pathname === ...)。

要注意的是,如果你的網站不是單頁應用,not_found_handling 不要設成 single-page-application。設了之後所有打錯的路徑都會被導回 index.html,回應的是 200 而不是 404,搜尋引擎也會把這些亂打的網址當成真的頁面。

坑三:搬家之後舊站還活著

我的 Elsewhere 和 Undercurrent 原本都是 Pages 專案,後來照官方的遷移指南搬到 Workers。搬完之後,舊的 pages.dev 站台並不會自動消失,它會停在最後一次部署的內容。如果上面有已經分享出去的連結(例如行程分享網址),先確認這些連結還要不要保留,再決定要不要關掉。

搬家時業務邏輯我一個字都沒改。Pages Functions 拿到的是 context 物件,Workers 拿到的是 (request, env, ctx),我只寫了一層轉接,把後者包成前者的形狀。這樣舊的處理函式可以原封不動地跑。

該選哪一個

新專案我會直接選 Workers with Static Assets:前後端同一個專案,同一個指令部署,靜態資源命中時還不計入 Worker 的呼叫次數。已經在 Pages 上穩定運作的站,沒有必要為了搬而搬。

重點是搞清楚自己用的是哪一個。一個簡單的網址判斷,可以省掉一個下午的疑惑。