Skip to content

05 · 部署(Cloudflare Pages)

把博客推到全球 CDN,拿到一个能给朋友的链接。全程免费、不需要服务器、不需要域名、不需要备案、国内外都能访问


一、为什么选 Cloudflare Pages

简短回答

国内可访问 + 完全免费 + 自动构建 + 自动 HTTPS——四个条件同时满足的最佳方案。

选型对比

平台国内访问自动构建备案备注
Cloudflare Pages单选最佳
Vercel⚠️ 需 VPN国际线路好,但国内体验差
Netlify⚠️ 较慢体验中等
GitHub Pages⚠️ 慢/不稳国内体验差
Gitee Pages 免费版---2024 已停
Gitee Pages Pro✅ 最快-✅ 需要付费 + 备案
阿里云 OSS / EdgeOne✅ 最快自己写✅ 需要付费 + 备案 + 配置复杂

💡 不推荐双部署:之前做过 Cloudflare + Vercel 双部署,但发现心智成本高于实际收益——两个平台都要监控构建状态、两套域名要同步说明。单 Cloudflare 已经覆盖国内国外,没必要再加一层。


二、前置:代码必须在 GitHub

Cloudflare Pages 通过连接 Git 仓库自动构建。它支持 GitHub / GitLab,不支持 Gitee —— 所以一定要先把代码推到 GitHub(参考 03-git-and-remote.md)。

Gitee 镜像可保可不保——保留的话仓库链接给国内朋友看代码会快一些;不保的话也没问题。


三、关键配置:vercel.json

⚠️ 这个文件叫 vercel.json 是 Vercel 的命名习惯,但和我们用 Cloudflare Pages 不冲突。Cloudflare 不读这个文件——它的构建配置在网页上设置。

保留这个文件的好处:

  1. 万一以后想试试 Vercel,不用重新写
  2. 文件本身解释了"build 命令"和"输出目录",对后来者友好

仓库根目录:

json
{
  "$schema": "https://openapi.vercel.sh/vercel.json",
  "buildCommand": "npm run build",
  "outputDirectory": ".vitepress/dist",
  "installCommand": "npm install",
  "framework": null,
  "cleanUrls": true,
  "trailingSlash": false
}

每个字段的意义:

字段作用
buildCommand构建命令
outputDirectoryVitePress 输出在 .vitepress/dist不是 dist
installCommand依赖安装
cleanUrls: true/foo 自动映射到 foo.html
trailingSlash: false不强制末尾斜杠

四、Cloudflare Pages 部署流程

Step 1:注册 Cloudflare

https://dash.cloudflare.com/sign-up

填邮箱 + 密码即可,不需要信用卡,不需要域名。

Step 2:进入 Pages

侧边栏 Workers & Pages → 顶部 tab PagesCreate a projectConnect to Git

Step 3:连接 GitHub

授权 Cloudflare 访问 GitHub,选择你的博客仓库。

第一次会跳到 GitHub 让你勾选哪些仓库给 Cloudflare 访问。建议选 "Only select repositories" 只授权当前博客仓库(最小权限原则)。

Step 4:构建配置

字段
Project name<你的项目名>(决定子域名 <name>.pages.dev
Production branchmain
Framework presetVitePress(如果有)或 None
Build commandnpm run build
Build output directory.vitepress/dist
Root directory(留空)
Environment variablesNODE_VERSION = 20(保险起见)

⚠️ Cloudflare 默认 Node 版本可能太老(v18),最好显式指定 NODE_VERSION=20 或更高。否则可能构建失败或 VitePress 警告。

Step 5:Save and Deploy

等 1-2 分钟构建完成,拿到链接:

https://<project>.pages.dev

这就是你要给朋友的链接


五、自动构建工作流

你 push 到 GitHub main 分支

Cloudflare 监听到(10 秒内)

拉代码 + npm install + npm run build

推到全球 CDN

博客更新(30 秒 - 2 分钟)

完全自动化——你不需要再去 Cloudflare 网页点任何按钮。

写新内容并发布

bash
cd ~/notes/我的主题

# 1. 写新内容(编辑 .md 文件)
# ...

# 2. 提交
git add . && git commit -m "feat: 新文章 - XXX"

# 3. 推送
git push

# 4. 30 秒后博客自动更新

六、常见错误

错误 1:Build Failed - No Output Directory

原因:构建配置里 Build output directory 写错(默认是 publicdist)。

修复:必须写成 .vitepress/dist

错误 2:构建报 Node 版本警告

原因:Cloudflare 默认 Node 版本不够新。

修复:环境变量加 NODE_VERSION=20

错误 3:直接访问子页面 404

现象:从首页跳转能进 /guide/intro 没问题,但复制 URL 在新窗口打开就 404

原因:VitePress 的 cleanUrls: true 让链接没 .html 后缀,但默认服务器不知道要加。

修复:项目设置 → SettingsPages → 启用 Always Use HTTPS 和 cleanUrls 兼容(Cloudflare Pages 默认就支持,多数情况下不需要操作)。如果仍 404,可在 _redirects 文件里手动配置(详见 Cloudflare 文档)。

错误 4:中文 URL 在分享时变得很丑

现象:复制 /游戏复盘 到微信变成 /%E6%B8%B8%E6%88%8F%E5%A4%8D%E7%9B%98

修复:用 VitePress 的 rewrites 把中文文件名映射到英文 URL(参见 04-vitepress.md "URL 设计")。


七、域名相关

Cloudflare Pages 子域名

域名何时变化
<project>.pages.dev永不变(指向最新生产部署)
<branch>.<project>.pages.dev跟随分支
<commit>.<project>.pages.dev每次部署都新生成

分享给朋友只用第一个

自定义域名(可选,~50 元/年)

如果想要 blog.mqd.dev 这种:

  1. 买域名(推荐 Cloudflare Registrar —— 域名按成本价卖,没溢价;或 Porkbun
  2. Cloudflare Pages 项目 Custom domainsSet up a domain → 加你的域名
  3. Cloudflare 自动签 HTTPS

💡 域名买在 Cloudflare 的好处:自动绑 DNS、零配置——没什么仪式感但最省事。

域名不需要备案——Cloudflare 服务器在海外。


八、Cloudflare Pages 免费版的限制

资源免费额度个人博客够用吗
请求数无限(!!!)✅ 远远够
自定义域名数100 / 项目✅ 够
构建次数500 次 / 月✅ 够
项目数量100 个✅ 够
商用✅ 允许个人博客也允许商用

💡 Cloudflare Pages 比 Vercel 慷慨——Vercel 限制带宽(100GB/月),Cloudflare 不限制请求数。


九、备选方案

备选 1:Vercel

如果你的博客主要给国外朋友看,或者你恰好有 VPN 习惯,Vercel 也是优秀方案。配置流程几乎一样:

  1. vercel.com/new → Import → 选你的 GitHub 仓库
  2. Framework Preset 选 VitePress
  3. Deploy

⚠️ Vercel 默认开 Deployment Protection(401 Auth),需要去 Settings → Deployment Protection → 关闭 Vercel Authentication

备选 2:迁到国内(更高性能)

如果博客流量真的大、国内访问要极致快,可以考虑:

  • 腾讯云 EdgeOne Pages:支持 GitHub mirror,部分免费额度
  • 阿里云 OSS + 自配 CDN:自由度最高,配置最复杂
  • Gitee Pages Pro:原生支持 Gitee 仓库,但要付费 + 备案

这些方案都需要国内域名备案,不适合"想快速上线"的场景。


下一步

部署完成 → 06-toolchain.md 把流程工具化。

💬 评论与建议

读完有想法?欢迎在下面留言。评论使用 GitHub 账号登录,会同步到本仓库的 Discussions。

基于本 playbook 自身搭建 · 部署于 Cloudflare Pages