前情提要
相信你已经按照网络上主流的方法,把自己的Hexo博客部署在GitHub Pages上了。可当你满怀期待地把网站分享给朋友时,往往会迎来一句:
你这网站访问怎么这么慢啊
聪明如你立刻意识到,GitHub毕竟是国外的服务器,而且你平常不挂加速器访问GitHub还要加载老半天,更何况你的博客呢?
于是问题就出现了:我们既想要提高网站的运行速度,又想要节约成本当白嫖党,这似乎是矛盾的。
如果你也有这样的困惑,那么这篇文章一定适合你
这篇文章就来帮你解决这个“速度与成本”的悖论。我将讲述我自己仅花费域名的费用利用Cloudflare Pages提高博客访问速度的经历
注:我不想在国内备案,于是我用了Cloudflare。能接受在国内备案流程的可使用国内大厂部署
基础知识预备
如果这一部分你已经很熟悉了,或者你没兴趣听我胡扯,你可以直接跳转到“操作流程”
Hexo的本质
Hexo本身不是服务器。
它只是一个用 Markdown 写文章,自动生成 HTML/CSS/JS,帮你整理目录,套主题模板的工具。
例如你写
# My first page
114514
Hexo会帮你生成
<html>
<h1>My first page</h1>
<p>114514</p>
</html>
并放到public目录里,这个目录本质就是:index.html、css/、js/、images/。你执行Hexo deploy时,Hexo只是自动帮你将目录里的静态文件上传到GitHub
GitHub Pages的本质
用户访问静态网站时,实际经过了以下过程:
- DNS 解析到 GitHub 的服务器
- GitHub 检查你的仓库
- 找到:index.html、css、js
直接返回文件
用户访问网站时GitHub会检查:username.github.io这个仓库,里面如果有index.html就把它当网站
迁移必要性及优缺点对比
GitHub Pages和Cloudflare Pages都是免费静态站点托管服务,但Cloudflare Pages功能更强大。Cloudflare依托全球CDN网络,将静态资源快速分发到全球节点,大幅提升访问速度,自定义域名支持完全免费的SSL证书并自动续期,提供灵活的环境变量和重定向规则配置。此外,Cloudflare Pages支持多分支部署和PR预览(每次提交或 Pull Request 都自动生成预览站点)。相比之下,GitHub Pages对构建速度、全球加速、分支预览等支持较弱,且仅能单分支发布(通常使用主分支或 docs 目录)。
下表列出两者在性能、功能、成本等维度的主要区别
| 对比项目 | GitHub Pages | Cloudflare Pages |
|---|---|---|
| 网络性能 | 依赖 GitHub 网络 | 全球 300+ CDN 节点加速 |
| 访问控制 | 无 | 支持自定义访问策略 |
| 构建速度 | 2-3 分钟 | 1-2 分钟 |
| 部署方式 | GitHub Actions或手动构建 | Git集成自动部署 |
| 免费配额 | 无限 | 免费计划:500 次/月构建 |
| 分支部署 | 仅主分支 | 支持任意分支部署,分支预览环境 |
| 预览部署 | 无内置预览 | Pull Request 自动预览 |
| 域名管理 | 手动 | 集成 |
语言组织能力不太行部分地方用了ai
操作流程
原博客的准备工作
现在你应该已经有了一个GitHub Pages用户主页仓库,名为xxxxx.github.io。我把这个仓库删掉了,换成了另一个名字强迫症,假设就叫blogsource吧
注意新建仓库后需要初始化Git
为节约空间,最好创建一个.gitignore,内容如下
node_modules/
public/
.deploy*/
db.json
.DS_Store
Cloudflare部署
准备工作
目前Cloudflare没有被墙废话,于是我们可以直接去https://www.cloudflare.com 注册一个账号
账号创建成功后来到“账户主页”,页面中间偏右位置有一个“Workers 和 Pages”,点击右边的“+”,进入Workers创建页面
注意:下面有一行字想要部署 Pages?开始使用,点击开始使用后才进入创建Pages页面
点击导入现有 Git 存储库右方的开始使用
在“从您的帐户部署站点”页面,先添加自己的Github账户并选中,选择自己的源码库blogsource,进入设置页面
设置页面相关参数
项目名称
与自动生成的二级域名有关,二级域名一般为 项目名称.pages.dev
生产分支
选择main即可
框架预设
有Hexo选择Hexo,没有Hexo选择无
构建命令
即生成静态网站时Bash输入的命令,填 npm install && npx hexo generate
构建输出目录
填 public
环境变量
添加变量名称 NODE_VERSION,值为20
注:这里的环境变量为node.js的版本,如有其他要求可填其他值或不填环境变量
所有步骤完成后点击开始构建即可
报错及处理
构建时出错
我在构建时出现了如下错误:
17:19:00.759 Executing user command: npm install && npx hexo generate
17:19:01.282 npm error code ENOENT
17:19:01.282 npm error syscall open
17:19:01.282 npm error path /opt/buildhome/repo/package.json
17:19:01.283 npm error errno -2 17:19:01.283 npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open '/opt/buildhome/repo/package.json'
17:19:01.283 npm error enoent This is related to npm not being able to find a file.
17:19:01.283 npm error enoent 17:19:01.283 npm error A complete log of this run can be found in: /opt/buildhome/.npm/_logs/2026-05-11T09_19_00_989Z-debug-0.log
17:19:01.292 Failed: Error while executing user command. Exited with error code: 254
17:19:01.298 Failed: build command exited with code: 1 17:19:02.031 Failed: error occurred while running build command
翻译一下就是Cloudflare在仓库根目录中未找到package.json,这说明我上传到Github上的是hexo generate后的静态文件。
Github Pages只需要HTML,而Cloudflare Pages需要源码自动构建出public。
解决方法也很简单,上传完整的Hexo工程即可
git push时出错
$ git push -u origin main fatal: unable to access 'https://github.com/mingyiaz/mingyiaz-blog-source.git/': Recv failure: Connection was reset
这是GitHub HTTPS连接被重置,建议改SSH
在经过以上步骤后,Cloudflare Pages就部署成功了。今后再上传源码,仅需在Git Bush中输入
git add .
git commit -m "update"
git push
添加域名
购买域名
寻找主流域名购买平台即可。我这里用的是国外的Spaceship好像Cloudflare能直接买域名来着
将域名接入Cloudflare
进入Cloudflare账户主页,在“Workers 和 Pages”左侧有一个“域”,点击添加,点击“连接域名”Cloudflare会给你两个NS,例如:
xxx.ns.cloudflare.com
yyy.ns.cloudflare.com
回到的Spaceship Lauchpad,点击域名管理器,点击刚注册的域名,右侧窗口中点击“自定义名称服务器”,将上文中的NS填入
再回到Cloudflare中,按照提示进行操作,等待几分钟到几小时后会显示“Active”或“活跃”,则证明接入成功
将域名绑定至博客
回到账户主页,点击“Workers 和 Pages”刚刚部署的Pages名称进入详细页,点击上方“自定义域”-“设置自定义域”,按照提示添加即可