【Cloudflare Pages 部署 React】#04 自動化部署與進階設定

測驗:Cloudflare Pages 自動化部署與進階設定

共 5 題,點選答案後會立即顯示結果

1. 當你推送程式碼到 main 分支時,Cloudflare Pages 會產生什麼類型的部署?

  • A. Production 部署
  • B. Preview 部署
  • C. Staging 部署
  • D. Development 部署

2. Preview Deployment 的主要用途是什麼?

  • A. 讓正式網站自動更新
  • B. 讓團隊成員在合併前預覽 PR 的變更效果
  • C. 自動執行單元測試
  • D. 備份舊版本的程式碼

3. 在 _redirects 檔案中,以下規則的狀態碼 200 代表什麼意思?

/* /index.html 200
  • A. 告訴瀏覽器進行 301 永久轉址
  • B. 回傳 404 錯誤頁面
  • C. 直接回傳該檔案的內容,不進行轉址
  • D. 暫時停用該路由規則

4. _redirects_headers 檔案應該放在專案的哪個位置?

  • A. 專案根目錄
  • B. public 資料夾
  • C. src 資料夾
  • D. node_modules 資料夾

5. 使用 Vite 建置的 React 專案,環境變數需要符合什麼條件才會暴露給前端程式碼?

  • A. 以 REACT_APP_ 開頭
  • B. 以 PUBLIC_ 開頭
  • C. 以 VITE_ 開頭
  • D. 無需任何前綴

前言

在前幾篇文章中,我們學會了建立專案、手動部署、以及設定網域與環境變數。本篇將帶你了解 Cloudflare Pages 最強大的功能之一:自動化部署。當你把程式碼推送到 GitHub,Cloudflare 會自動幫你建置並部署,不用再手動上傳檔案。

同時,我們也會學習如何使用特殊檔案來自訂網站行為,解決 React 單頁應用程式(SPA)常見的路由問題。


學習目標

讀完本篇後,你將能夠:

  • 理解 Cloudflare Pages 的自動部署機制
  • 設定 Preview Deployments 用於 PR 預覽
  • 使用 redirectsheaders 檔案自訂行為
  • 解決 SPA 路由問題(React Router)

Git 整合與自動部署

連接 GitHub 儲存庫

當你在 Cloudflare Pages 建立專案時,可以選擇連接 GitHub 或 GitLab 儲存庫。連接後,每次推送程式碼都會自動觸發部署。

在 Dashboard 的 Workers & Pages 頁面中,你會看到專案設定:

Production branch: main

這表示當你推送到 main 分支時,會自動更新正式網站。

自動部署觸發條件

Cloudflare Pages 會在以下情況自動部署:

觸發事件 部署類型 網址格式
推送到 main 分支 Production your-project.pages.dev
推送到其他分支 Preview <commit-hash>.your-project.pages.dev
建立 Pull Request Preview <branch-name>.your-project.pages.dev

查看部署記錄

在專案頁面的「Deployments」分頁,你可以看到所有部署記錄:

Status    Branch    Commit           Time
-------------------------------------------
Success   main      abc1234          2 minutes ago
Success   feature   def5678          1 hour ago
Failed    develop   ghi9012          3 hours ago

點擊任一部署可以查看建置日誌,這對除錯非常有用。


Preview Deployments:PR 預覽功能

什麼是 Preview Deployment

Preview Deployment 是 Cloudflare Pages 的一個實用功能。每當你建立 Pull Request 或推送到非 main 分支,Cloudflare 會自動建置並部署到一個臨時網址。

這讓團隊成員可以在合併程式碼前,先預覽變更效果。

預覽網址格式

預覽網址的格式如下:

https://<commit-hash>.<project-name>.pages.dev

# 例如:
https://abc123def.my-react-app.pages.dev
Code language: PHP (php)

如果是 Pull Request,GitHub 會自動顯示預覽連結在 PR 頁面的檢查區塊。

在 PR 中查看預覽

當你在 GitHub 建立 PR 後,會看到類似這樣的檢查訊息:

Cloudflare Pages - Deploy Preview succeeded
View deployment: https://feature-branch.my-app.pages.dev
Code language: JavaScript (javascript)

點擊連結就能直接看到這個 PR 的變更效果,不需要在本地執行程式。


_redirects 檔案:解決 SPA 路由問題

SPA 路由問題是什麼

當你的 React 專案使用 React Router 時,網址會像這樣:

https://my-app.pages.dev/about
https://my-app.pages.dev/users/123
Code language: JavaScript (javascript)

問題來了:如果使用者直接在瀏覽器輸入 /about,或是重新整理頁面,Cloudflare 會嘗試尋找 /about/index.html 這個檔案。但這個檔案不存在,因為 React Router 是在瀏覽器端處理路由的。

結果就是看到 404 錯誤頁面。

使用 _redirects 解決

在你的專案 public 資料夾中建立 _redirects 檔案:

# public/_redirects

/*    /index.html   200
Code language: PHP (php)

這行設定的意思是:

部分 說明
/* 所有路徑
/index.html 都指向 index.html
200 回傳 200 狀態碼(不是 301 轉址)

狀態碼 200 很重要,它表示「直接回傳這個檔案的內容」,而不是告訴瀏覽器去轉址。這樣 React Router 就能正確接手處理路由。

更複雜的重定向規則

你也可以設定多條規則,規則會從上到下依序比對:

# public/_redirects

# API 請求轉發到後端
/api/*    https://api.example.com/:splat    200

# 舊路徑轉址到新路徑
/old-page    /new-page    301

# SPA fallback 放最後
/*    /index.html    200
Code language: PHP (php)

:splat 是萬用字元,會保留 * 匹配到的部分。例如 /api/users 會轉發到 https://api.example.com/users


_headers 檔案:自訂 HTTP 標頭

什麼時候需要自訂標頭

自訂 HTTP 標頭可以用來:

  • 設定快取策略
  • 增加安全性標頭
  • 啟用 CORS

建立 _headers 檔案

public 資料夾中建立 _headers 檔案:

# public/_headers

/*
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff

/assets/*
  Cache-Control: public, max-age=31536000, immutable
Code language: PHP (php)

常用標頭設定範例

安全性標頭:

/*
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
標頭 作用
X-Frame-Options 防止網站被嵌入 iframe(防 Clickjacking)
X-Content-Type-Options 防止 MIME 類型嗅探
Referrer-Policy 控制 Referer 標頭的發送

快取設定:

/assets/*
  Cache-Control: public, max-age=31536000, immutable

這會讓 /assets/ 下的靜態檔案快取一年。因為 React 打包後的檔案名稱包含 hash,所以可以放心使用長時間快取。


Build 設定進階選項

在 Dashboard 中設定

在專案的「Settings」>「Build & Deploy」頁面,你可以調整建置設定:

Build command: npm run build
Build output directory: dist
Root directory: /
Node.js version: 18

常見框架的建置設定

框架/工具 Build command Output directory
Create React App npm run build build
Vite npm run build dist
Next.js (static) npm run build out

環境變數在建置時使用

在建置過程中,你設定的環境變數會自動可用。例如設定了 VITE_API_URL,在程式碼中可以這樣使用:

// React 程式碼中
const apiUrl = import.meta.env.VITE_API_URL;
Code language: JavaScript (javascript)

注意:Vite 專案的環境變數需要以 VITE_ 開頭才會暴露給前端程式碼。


部署失敗排查技巧

查看建置日誌

當部署失敗時,第一步是查看建置日誌。在專案的「Deployments」頁面,點擊失敗的部署,展開「Build logs」:

[build]   Executing build command...
[build]   > npm run build
[build]
[build]   Error: Cannot find module 'react'
[build]
[build]   Build failed with exit code 1
Code language: JavaScript (javascript)

常見問題與解決方案

問題 1:找不到模組

Error: Cannot find module 'xxx'
Code language: JavaScript (javascript)

原因:package.json 中沒有列出相依套件,或是 node_modules 被加入 .gitignore(正常情況)但套件沒有正確安裝。

解決:確認 package.json 中有列出所有需要的套件。

問題 2:Node.js 版本不符

error: The engine "node" is incompatible with this module
Code language: JavaScript (javascript)

解決:在 Dashboard 的 Build 設定中調整 Node.js 版本。

問題 3:建置輸出目錄錯誤

部署成功但網站空白或顯示 404。

解決:確認「Build output directory」設定正確。Vite 是 dist,CRA 是 build

本地測試建置

在推送前,先在本地執行建置確認沒問題:

npm run build

然後可以用簡單的 HTTP 伺服器預覽:

npx serve dist

檔案位置整理

最後整理一下特殊檔案應該放在哪裡:

my-react-app/
├── public/
│   ├── _redirects     <-- 重定向規則
│   ├── _headers       <-- HTTP 標頭設定
│   └── index.html
├── src/
│   └── ...
└── package.json
Code language: PHP (php)

這些檔案會在建置時被複製到輸出目錄,Cloudflare Pages 會自動讀取並套用。


系列總結

恭喜你完成了【Cloudflare Pages 部署 React】系列!讓我們回顧一下學到的內容:

  • 第 1 篇:認識 Cloudflare Pages 與建立第一個專案
  • 第 2 篇:本地準備 React 專案並手動部署
  • 第 3 篇:設定自訂網域與環境變數
  • 第 4 篇:自動化部署與進階設定

現在你已經具備完整的知識,能夠將 React 專案部署到 Cloudflare Pages,並利用自動部署功能加速開發流程。


重點回顧

  • Git 整合後,推送程式碼會自動觸發部署
  • Preview Deployments 讓每個 PR 都有預覽網址
  • _redirects 檔案解決 SPA 路由的 404 問題
  • _headers 檔案可設定快取與安全標頭
  • 部署失敗時,查看建置日誌是第一步

進階測驗:Cloudflare Pages 自動化部署與進階設定

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你的 React 專案使用 React Router,使用者反映直接在瀏覽器輸入 /about 會看到 404 錯誤。你應該如何解決? 情境題

  • A. 在 src 資料夾建立 about.html 檔案
  • B. 在 Dashboard 設定 404 頁面指向 index.html
  • C. 在 public 資料夾建立 _redirects 檔案,加入 /* /index.html 200
  • D. 修改 React Router 設定使用 HashRouter

2. 你想讓 React 應用的 API 請求 /api/users 轉發到後端 https://api.example.com/users_redirects 檔案應該怎麼寫? 情境題

  • A. /api/* https://api.example.com/* 301
  • B. /api/* https://api.example.com/:splat 200
  • C. /api https://api.example.com 200
  • D. https://api.example.com/* /api/:splat 200

3. 部署失敗,建置日誌顯示以下錯誤。最可能的原因是什麼? 錯誤診斷

[build] Executing build command… [build] > npm run build [build] [build] Error: Cannot find module ‘axios’ [build] [build] Build failed with exit code 1
  • A. package.json 中沒有列出 axios 作為相依套件
  • B. Cloudflare 不支援 axios 套件
  • C. Node.js 版本太舊
  • D. 網路連線問題導致無法下載套件

4. 你使用 Vite 建立的專案部署成功,但網站顯示空白頁面。在 Deployments 頁面查看顯示 Status 為 Success。最可能需要檢查什麼設定? 錯誤診斷

  • A. 環境變數沒有設定
  • B. Build output directory 應該設為 dist 而非 build
  • C. Production branch 設定錯誤
  • D. 缺少 _headers 檔案

5. 團隊想要在網站加入安全性標頭來防止 Clickjacking 攻擊。你應該如何設定? 情境題

  • A. 在 Dashboard 的 Security 頁面啟用 Clickjacking Protection
  • B. 在 _redirects 檔案加入 X-Frame-Options: DENY
  • C. 在 React 程式碼中設定 window.frameOptions = 'DENY'
  • D. 在 public 資料夾建立 _headers 檔案,加入 /* 路徑並設定 X-Frame-Options: DENY

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *