跳到主要内容

Pages

Cloudflare Pages 是一个静态网站托管平台,支持自动构建和部署,与 GitHub、GitLab 深度集成。它提供无限带宽、全球 CDN 加速,非常适合托管静态网站、博客、文档站点等。

Pages 简介

什么是 Pages?

Pages 是 Cloudflare 提供的 JAMstack 平台,可以:

  • 自动从 Git 仓库构建和部署网站
  • 托管静态网站和单页应用(SPA)
  • 集成 Cloudflare Workers 实现动态功能
  • 提供预览部署,每个 PR 都有独立预览链接

Pages 的优势

免费无限带宽:与 Vercel、Netlify 相比,Pages 免费版提供无限带宽。

全球 CDN:网站自动部署到全球 300+ 边缘节点。

自动 HTTPS:免费 SSL 证书,自动续期。

预览部署:每个 Pull Request 都有独立的预览链接。

Workers 集成:可以添加 Functions 实现动态功能。

免费计划限制

资源限制
并发构建1 个
每月构建次数500 次
自定义域名100 个
文件数量20,000 个
单文件大小25MB
Functions 请求10 万次/天

快速开始

方式一:连接 Git 仓库

  1. 登录 Cloudflare 控制台
  2. 进入 "Workers & Pages" → "Create application"
  3. 选择 "Pages" → "Connect to Git"
  4. 授权 GitHub 或 GitLab
  5. 选择要部署的仓库
  6. 配置构建设置
  7. 点击 "Save and Deploy"

方式二:直接上传

  1. 进入 "Workers & Pages" → "Create application"
  2. 选择 "Pages" → "Upload assets"
  3. 输入项目名称
  4. 拖拽或选择文件上传
  5. 点击 "Deploy site"

使用 Wrangler 部署

# 部署当前目录
npx wrangler pages deploy ./dist

# 指定项目名称
npx wrangler pages deploy ./dist --project-name=my-site

构建配置

框架预设

Pages 内置了常见框架的构建配置:

框架构建命令输出目录
Next.js (Static)npm run buildout
React (Create React App)npm run buildbuild
Vue.jsnpm run builddist
Angularnpm run builddist/browser
Astronpm run builddist
Hugohugopublic
Jekylljekyll build_site
Hexohexo generatepublic

自定义构建

如果框架不在预设中,可以自定义:

Framework preset: None
Build command: npm run build
Build output directory: dist
Root directory: /

环境变量

在构建设置中添加环境变量:

Settings → Environment variables

可以设置:

  • Production 环境变量
  • Preview 环境变量

Functions

Pages 可以添加 Functions 来实现动态功能,Functions 本质上是 Workers。

创建 Function

在项目根目录创建 functions 目录:

project/
├── functions/
│ └── api/
│ └── hello.ts
├── dist/
└── ...

Function 示例

functions/api/hello.ts

export async function onRequest(context) {
const { request, env, params } = context;

return new Response(JSON.stringify({
message: 'Hello from Pages Functions!'
}), {
headers: { 'Content-Type': 'application/json' }
});
}

访问 https://your-site.pages.dev/api/hello 即可调用。

处理不同 HTTP 方法

export async function onRequestGet(context) {
return new Response('GET request');
}

export async function onRequestPost(context) {
const body = await context.request.json();
return Response.json({ received: body });
}

使用环境变量

export async function onRequest(context) {
const apiKey = context.env.API_KEY;
return Response.json({ apiKey });
}

绑定 KV/R2/D1

在 Pages 设置中配置绑定:

Settings → Functions → KV namespace bindings
Settings → Functions → R2 bucket bindings
Settings → Functions → D1 database bindings

使用绑定:

export async function onRequest(context) {
const value = await context.env.MY_KV.get('key');
return Response.json({ value });
}

预览部署

自动预览

每次推送到非主分支或创建 PR 时,Pages 会自动创建预览部署:

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

预览设置

在项目设置中可以配置:

  • 预览分支白名单
  • 预览访问控制(密码保护)

自定义域名

添加域名

  1. 进入项目设置
  2. 选择 "Custom domains"
  3. 点击 "Set up a custom domain"
  4. 输入域名
  5. 按提示配置 DNS

DNS 配置

如果域名托管在 Cloudflare:

  • 自动配置 CNAME 记录

如果域名托管在其他地方:

  • 添加 CNAME 记录指向 <project>.pages.dev

子域名路由

可以配置不同子域名指向不同路径:

blog.example.com → /blog
docs.example.com → /docs

重定向与重写

_redirects 文件

在输出目录创建 _redirects 文件:

# 简单重定向
/old-page /new-page 301

# 代理(需要 Functions)
/api/* https://api.example.com/:splat 200

# SPA 路由回退
/* /index.html 200

_headers 文件

在输出目录创建 _headers 文件:

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

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

部署钩子

部署成功通知

可以配置部署成功后通知:

  • Slack
  • Discord
  • 自定义 Webhook

部署触发

使用 Deploy Hook 触发部署:

curl -X POST "https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/<token>"

本地开发

安装 Wrangler

npm install -g wrangler

本地运行

# 运行静态文件服务
npx wrangler pages dev ./dist

# 带 Functions 开发
npx wrangler pages dev ./dist --compatibility-flag=nodejs_compat

绑定本地服务

npx wrangler pages dev ./dist --kv=MY_KV --r2=MY_BUCKET

实战示例

部署 React 应用

# 创建 React 应用
npx create-react-app my-app
cd my-app

# 构建
npm run build

# 部署
npx wrangler pages deploy build --project-name=my-react-app

部署 Vue 应用

# 创建 Vue 应用
npm create vue@latest my-vue-app
cd my-vue-app
npm install

# 构建
npm run build

# 部署
npx wrangler pages deploy dist --project-name=my-vue-app

部署静态博客(Hexo)

# 安装 Hexo
npm install -g hexo-cli
hexo init my-blog
cd my-blog
npm install

# 生成静态文件
hexo generate

# 部署
npx wrangler pages deploy public --project-name=my-blog

部署文档站点(Docusaurus)

# 创建 Docusaurus 项目
npx create-docusaurus@latest my-website classic
cd my-website

# 构建
npm run build

# 部署
npx wrangler pages deploy build --project-name=my-docs

CI/CD 集成

GitHub Actions

name: Deploy to Cloudflare Pages

on:
push:
branches: [main]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: '20'

- run: npm ci
- run: npm run build

- name: Deploy to Cloudflare Pages
uses: cloudflare/pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: my-site
directory: dist

常见问题

构建失败怎么办?

  1. 检查构建日志
  2. 确认构建命令和输出目录正确
  3. 检查 Node.js 版本是否匹配
  4. 确认依赖安装正确

SPA 路由 404 怎么办?

添加 _redirects 文件:

/* /index.html 200

如何配置 Node.js 版本?

在环境变量中设置:

NODE_VERSION=20

或在项目根目录创建 .nvmrc 文件:

20

参考链接

下一步

完成 Pages 学习后,接下来学习 R2 存储,了解如何使用对象存储服务。