从零搭建 Hexo + Butterfly(Cloudflare + GitHub + localhost +免费域名 + PicGo 图床)
适合谁看:完全没接触过建站、没写过后端代码的新手。
看完能得到什么:一个属于自己的博客网站,可以用自己的域名访问,写作只用写 Markdown,图片粘贴即上传。
预计耗时:认真的话 2~4 小时(大部分时间在下载和注册上)。
本文所有命令都一步一步给全,你只要照着敲就行。遇到没见过的名词别慌,我都在旁边解释了。
0. 写在前面
0.1 这套方案长什么样
1 | 你的电脑(写作 + 本地预览) |
用人话解释每个零件是干嘛的:
| 零件 | 作用 | 花钱吗 |
|---|---|---|
| Hexo | 把 Markdown 文章「编译」成网页的工具 | 免费 |
| Butterfly | 博客的「皮肤」,决定长什么样 | 免费 |
| Node.js | Hexo 的运行环境,必须装 | 免费 |
| Git | 把代码传到 GitHub 的工具 | 免费 |
| GitHub | 存放博客源码的仓库 | 免费 |
| Cloudflare Pages | 自动构建 + 全球托管你的网页 | 免费 |
| localhost.cc | 提供免费二级域名,让网址好看 | 免费 |
| PicGo | 图片一键上床到图床,自动复制链接 | 免费 |
0.2 开始前请确认
- 有一台能上网的电脑(本文以 Windows 为例,Mac / Linux 会额外标注差异)
- 有一个能收邮件的邮箱(建议用 163 / QQ / Gmail)
- 能正常访问 GitHub(如果打不开,见第十四节的网络排查)
- 电脑有约 2 GB 空闲磁盘
0.3 本文使用的版本(2026 年 11 月)
| 软件 | 版本 | 备注 |
|---|---|---|
| Node.js | 24 LTS 或 26 LTS | Hexo 8 要求 Node ≥ 20.19.0,别装太老的版本 |
| Git | 2.5x | 安装最新版即可 |
| Hexo | 8.1.2 | |
| hexo-theme-butterfly | 5.7.2 | |
| PicGo | 3.0.3 |
💡 提示:软件版本会更新,命令基本不变。如果看到比我写的更新的版本号,直接装新的就好。
一、注册 GitHub 账号
GitHub 既是账号系统,也是仓库(存代码的地方)。后面 Cloudflare 需要读你的 GitHub 仓库。
- 打开 https://github.com/signup
- 输入邮箱 → 设置密码(建议 12 位以上,大小写+数字)→ 起一个用户名
- 用户名会出现在网址里,例如
zhangsan,建议用英文小写 + 数字,别用奇怪符号
- 用户名会出现在网址里,例如
- 完成滑块验证 → 输入邮箱收到的 8 位验证码
- 进入 GitHub 后,点右上角头像 → Settings → 左侧 Emails,确认邮箱状态是 Verified
- (强烈建议)同页面左侧 Password and authentication → 开启 Two-factor authentication (2FA)
用手机上的验证器 App(如 Microsoft Authenticator / Google Authenticator)扫码即可⚠️ 开启 2FA 后会给你一组恢复码,请抄到纸上或存进密码管理器。丢了恢复码 = 账号救不回来。
二、安装 Git
2.1 下载安装
- 打开 https://git-scm.com/download/win,下载 64-bit Git for Windows Setup
- 双击安装,一路 Next 即可。中途有几个选项值得注意:
| 安装页面 | 建议选择 | 为什么 |
|---|---|---|
| Default editor | 选 Use Visual Studio Code 或保持 Vim | 弹出编辑说明文字时用得上 |
| Adjusting your PATH | Git from the command line and also from 3rd-party software(默认) | 这样命令行才能用 git |
| HTTPS transport | Use the native Windows Secure Channel library(默认) | 走系统证书,国内更稳 |
| Line ending conversions | Checkout Windows-style, commit Unix-style(默认) | 避免换行符导致的诡异 diff |
| Credential helper | Git Credential Manager(默认) | 以后 push 会自动弹窗登录,不用每次输密码 |
- 安装完成后,关掉所有已经打开的命令行窗口(重要!PATH 才会生效)
2.2 验证安装
按 Win + R,输入 cmd 回车,然后输入:
1 | git --version |
看到类似 git version 2.5x.x.windows.1 就成功了。
2.3 配置身份(必做)
Git 需要知道「这次提交是谁干的」,把下面两行里的内容换成你自己的:
1 | git config --global user.name "zhangsan" |
顺手再加两条,能让中文文件名不乱码、命令行更好看:
1 | git config --global core.quotepath false |
检查配置:
1 | git config --global --list |
⚠️ 注意:
user.email最好填 GitHub 上验证过的邮箱,否则 GitHub 里提交记录不会显示你的头像(不影响推送)。
三、安装 Node.js
Hexo 是跑在 Node.js 上的,所以 Node.js 必须先装好。
3.1 选版本
打开 https://nodejs.org/zh-cn/download,下载 LTS(长期支持版),推荐:
- Node.js 24 LTS(最稳,推荐新手)
- 或 Node.js 26 LTS(更新)
⚠️ 不要去装 Node 18 / 20。Hexo 8 要求 Node ≥ 20.19.0,装旧版会报
Unsupported engine之类的错误。
不要下载 Current(奇数版本,如 25/27),那是给尝鲜的人用的。
3.2 安装(Windows)
- 下载
.msi安装包(如node-v24.x.x-x64.msi) - 双击 → 一路 Next → 勾选 Add to PATH(默认就是勾上的)→ Install
- 装完重新打开 cmd,验证:
1 | node -v |
分别输出 v24.x.x 和 11.x.x 之类的版本号就 OK。
3.3 (可选但推荐)换个国内镜像,快很多
1 | npm config set registry https://registry.npmmirror.com |
想换回官方源:
1 | npm config set registry https://registry.npmjs.org |
3.4 Mac / Linux 用户
Mac 用 Homebrew 最省事:
1 | brew install node |
Linux(Ubuntu/Debian)用 NodeSource 或发行版自带包都可以,只要能保证 node -v ≥ 20.19。
💡 多版本管理:如果以后要在多个 Node 版本间切换,Windows 用 nvm-windows,Mac/Linux 用 nvm。新手可以先不折腾。
四、安装 Hexo 并创建本地博客
4.1 安装 Hexo 命令行工具
在 cmd(或 PowerShell)里执行:
1 | npm install -g hexo-cli |
验证:
1 | hexo -v |
如果提示
'hexo' 不是内部或外部命令,说明 npm 的全局目录不在 PATH 里。
先执行npm config get prefix看看路径,再把它加到系统的环境变量 Path 中,然后重开命令行。
实在搞不定就用npx hexo代替hexo,效果一样。
4.2 创建博客文件夹
先进入你想放博客的位置。建议路径里不要有中文和空格,例如 D:\blog:
1 | d: |
然后初始化(myblog 是文件夹名,可以改成你喜欢的):
1 | hexo init myblog |
⚠️ 注意:
hexo init需要从 GitHub 下载初始模板,国内可能失败。
失败的话多试几次,或者先设好 3.3 的镜像 + 给 git 挂代理:
1 git config --global http.proxy http://127.0.0.1:7890(端口换成你自己代理的端口,用完记得
--unset)
4.3 认识一下目录结构
1 | myblog/ |
4.4 本地先跑起来看看
1 | hexo clean |
浏览器打开 http://localhost:4000,能看到 Hexo 默认主题的首页,说明环境全通了。
Ctrl + C 可以停掉服务。
💡 调试时建议一直开着
hexo server,改了文章它会自动刷新。如果 4000 端口被占用,换端口:hexo server -p 5000。
五、安装 Butterfly 主题
5.1 装主题(重要:用 npm 装,不要 git clone)
在博客根目录 myblog 下执行:
1 | npm install hexo-theme-butterfly |
为什么强烈建议用 npm 而不是 git clone 到 themes/?
themes/butterfly目录如果没被 git 跟踪(或被.gitignore忽略),Cloudflare 云端构建时会找不到主题,直接报错;- 用 npm 安装后,主题名字会写进
package.json,云端执行npm install时能自动装好,彻底避免「本地正常、线上构建失败」这个新手头号大坑。
如果你已经在用
git clone方式,也不用重来:只要确认主题文件已经提交到 GitHub 仓库(或用 submodule)即可。
5.2 应用主题
用记事本或 VS Code 打开根目录的 _config.yml,找到 theme: 那一行,改成:
1 | theme: butterfly |
⚠️ YAML 格式很挑:冒号后面必须有一个空格,不要用 Tab 缩进。
5.3 安装渲染器插件(保险起见)
Butterfly 的页面用 pug 和 stylus 写的,正常情况 npm 会自动带上。为防报错,手动装一遍:
1 | npm install hexo-renderer-pug hexo-renderer-stylus --save |
5.4 建立主题专属配置文件(关键一步)
不要直接改 node_modules 里的配置,主题一升级你的心血就没了。正确姿势是在博客根目录建一个 _config.butterfly.yml:
Windows(PowerShell):
1 | Copy-Item node_modules\hexo-theme-butterfly\_config.yml _config.butterfly.yml |
Mac / Linux:
1 | cp node_modules/hexo-theme-butterfly/_config.yml _config.butterfly.yml |
以后所有主题相关的配置只改根目录的 _config.butterfly.yml。Hexo 会自动把它和主题自带的 _config.yml 合并,同名项以你的文件为准。
5.5 看看效果
1 | hexo clean |
刷新 http://localhost:4000,应该已经变成 Butterfly 的卡片风界面了。
❗ 如果页面上出现一堆
extends includes/layout.pug之类的源代码文字,说明渲染器没装好,回到 5.3 重装一次再hexo clean。
六、主题基础配置:让它变成「你的」博客
配置文件有点长,新手只需要改下面这几处,其他保持默认。
6.1 站点配置 _config.yml
1 | # 网站标题 |
6.2 主题配置 _config.butterfly.yml
① 导航菜单
1 | menu: |
② 头像和首页大图
1 | avatar: |
③ 打字机副标题
1 | subtitle: |
④ 暗色模式 & 目录
1 | darkmode: |
⑤ 本地搜索(不用外部服务,推荐开)
1 | local_search: |
⑥ 页脚
1 | footer: |
⑦ 想加自己的 CSS / JS
1 | inject: |
⚠️ 提醒:
_config.butterfly.yml里enable这类开关只认true/false(小写),写True或yes有时会不生效。
6.3 创建「标签 / 分类 / 关于」页面
菜单里链接的页面默认是不存在的,需要手动建。在博客根目录依次执行:
1 | hexo new page tags |
然后分别打开 source/tags/index.md、source/categories/index.md,把开头的 type 改成对应类型。以标签页为例:
1 |
|
分类页写 type: categories,关于页写 type: about(或直接当普通页面写自我介绍)。
再执行一次:
1 | hexo clean |
点菜单里的「标签 / 分类」,不再 404 就对了。
七、写第一篇文章
7.1 新建文章
1 | hexo new "我的第一篇文章" |
会在 source/_posts/ 下生成 我的第一篇文章.md,打开它,顶部是这样的:
1 |
|
下面是正文,用 Markdown 写就行。
7.2 常用 Front-matter 字段
| 字段 | 作用 | 示例 |
|---|---|---|
title |
文章标题 | 我的第一篇博客 |
date |
发布时间 | 2026-11-08 09:00:00 |
updated |
更新时间(可省) | 同上 |
tags |
标签,可多个 | [Hexo, 教程] |
categories |
分类,可多个层级 | [建站教程] |
cover |
文章封面图 | /img/cover.png |
top_img |
文章顶部大图 | /img/top.png |
description |
摘要(首页显示) | 这篇文章讲…… |
toc |
是否显示目录 | true / false |
comments |
是否开评论 | true / false |
7.3 常用命令速查
| 命令 | 作用 |
|---|---|
hexo new "标题" |
新建文章 |
hexo new page 名字 |
新建页面 |
hexo clean |
清缓存(改配置没生效时先来一发) |
hexo generate(简写 hexo g) |
生成静态网页 |
hexo server(简写 hexo s) |
本地预览 http://localhost:4000 |
hexo deploy(简写 hexo d) |
部署(本方案用不到,见第十一节附注) |
💡 小技巧:Markdown 插入图片的语法是
。图片链接怎么来?往下看第十二节的 PicGo。
八、注册免费域名(localhost.cc)
⚠️ 先说明:免费二级域名服务的前端界面经常改版,而且我这里无法登录它的控制台,所以下面是这类服务的通用流程,具体按钮名字以你看到的页面为准。核心逻辑一定是:注册账号 → 申请一个好记的子域名 → 在它的 DNS 面板里添加记录。
8.1 为什么需要它
Cloudflare Pages 会免费送你一个 xxx.pages.dev 的网址,能直接用。但 https://myblog.pages.dev 不够好记,用免费二级域名就能变成 https://myblog.localhost.cc。
8.2 通用注册步骤
- 打开 https://localhost.cc/,点 注册 / Sign up
- 填邮箱 + 密码,去邮箱点验证链接激活账号
- 登录后找到 注册域名 / 申请域名 / New Domain 之类的入口
- 输入你想要的前缀,比如
myblog,系统会检查是否被占用 - 提交后进「我的域名 / DNS 管理」页面,你会看到两个东西:
- 域名本身:
myblog.localhost.cc - DNS 记录管理区:可以添加
A/CNAME/TXT等记录
- 域名本身:
- 先记下这个域名,第十一节要用
8.3 注意事项(一定看)
- ⚠️ 免费域名随时可能失效。服务商倒闭、政策调整、长期不登录都可能收回。建议只当过渡用,认真做站的话迟早买个自己的域名(
.com一年几十块)。 - ⚠️ 不要在免费域名上做涉及金钱、登录的正式业务,搜索引擎信任度低,也容易被墙。
- ⚠️ 记录保存好:域名、注册邮箱、DNS 面板地址。
- ✅ 这类服务通常只能改 DNS 记录,不能改 NS(名称服务器)。这没关系——Cloudflare Pages 支持「子域名用 CNAME 接入」,不需要把域名托管到 Cloudflare(见 11.5)。
- ✅ 如果注册页面打不开或一直失败,可以直接跳过这一节,先用
xxx.pages.dev把流程跑通,之后再换域名。
九、注册并配置 Cloudflare
Cloudflare 负责三件事:免费 CDN 加速、自动 HTTPS 证书、以及自动构建部署我们的博客。
9.1 注册
- 打开 https://dash.cloudflare.com/sign-up
- 填邮箱 + 密码(密码强度要求高,建议直接用密码管理器生成)
- 去邮箱点验证链接
- 登录后如果提示选择套餐,选 Free(免费版)
9.2 要不要把域名「接入」Cloudflare?
看你想要哪种玩法:
| 方式 | 适用场景 | 要做的事 |
|---|---|---|
| 方式 A:只做子域 CNAME(推荐给免费域名用户) | myblog.localhost.cc 指向 Pages |
不用把域名加进 Cloudflare,直接去域名商的 DNS 面板加一条 CNAME |
| 方式 B:整站托管到 Cloudflare(NS 接入) | 你自己买的域名,想用 Cloudflare 的全套功能 | 在 Cloudflare 添加站点 → 拿到两个 NS → 改到域名商 → 等生效 |
方式 B 的操作(如果你以后买了自己的域名):
- Cloudflare 控制台 → 添加域 / Add a domain
- 输入你的域名 → 选 Free 套餐
- Cloudflare 会给你两个名称服务器,形如:
xxx.ns.cloudflare.comyyy.ns.cloudflare.com
- 到域名商(阿里云/腾讯云/Namesilo 等)的域名管理里,把 NS 换成这两个
- 回 Cloudflare 点「我已更新名称服务器」,等几分钟到 24 小时生效
💡 免费二级域名(如 localhost.cc)基本不支持改 NS,所以走方式 A 就好,完全不影响 Pages 部署。
十、把博客源码推送到 GitHub
10.1 新建仓库
- 登录 GitHub → 右上角 + → New repository
- Repository name 填
myblog(随便起,但建议和文件夹一致) - Description 可留空
- 可见性选 Public 或 Private 都行
- Public:免费、构建速度快,但你的文章源码公开
- Private:Cloudflare Pages 同样支持,但需要授权 Cloudflare 访问私有仓库
- 不要勾选
Add a README file、.gitignore、license(我们要用本地的文件) - 点 Create repository,复制它给你的仓库地址,形如
https://github.com/zhangsan/myblog.git
10.2 确认 .gitignore 没问题
hexo init 已经生成好 .gitignore,打开确认里面有这些(没有就补上):
1 | .DS_Store |
⚠️ 千万别把
node_modules/提交上去(几万个文件,推送到一半必然失败)。
但package.json和package-lock.json必须提交,云端靠它们安装依赖。
10.3 推送
在博客根目录 myblog 下依次执行:
1 | git init |
第一次 push 会弹出 GitHub 登录窗口(Git for Windows 自带的 Git Credential Manager),
选 Sign in with your browser,浏览器里点授权即可。
⚠️ 如果提示
remote origin already exists,说明之前加过,改用:
1 git remote set-url origin https://github.com/你的用户名/myblog.git⚠️ 如果卡在输入用户名密码并且怎么都不对:GitHub 早就不支持账号密码推送了,得用 Personal Access Token(见 12.3)当密码,或者走上面的浏览器授权。
推送成功后刷新 GitHub 页面,应该能看到你的文件列表(但看不到 node_modules 和 public,这是对的)。
十一、Cloudflare Pages 部署 + 绑定域名
这是最爽的一步:以后你只管 git push,网页自动更新。
11.1 创建 Pages 项目
- Cloudflare 控制台 → 左侧 Workers 和 Pages(Workers & Pages)
- 点 Create application(创建应用) → 切到 Pages 选项卡
- 点 Import an existing Git repository(导入现有 Git 仓库)
- 首次使用要授权:选 GitHub → 同意授权 → 可以选择「只授权某个仓库」更安全
- 在列表里选中你的
myblog仓库 → Begin setup
11.2 填构建设置(照抄)
| 配置项 | 填什么 |
|---|---|
| Production branch(生产分支) | main |
| Build command(构建命令) | npm run build |
| Build output directory(输出目录) | public |
💡
npm run build是hexo init生成的脚本,等价于hexo generate。写hexo generate也行,但npm run build更稳。
11.3 设置 Node 版本(必做,否则可能构建失败)
在同一个页面往下拉,展开 Environment variables(环境变量),添加:
| 变量名 | 值 |
|---|---|
NODE_VERSION |
24 |
⚠️ 不加这一条,云端可能用旧版 Node 构建,报
Unsupported engine或直接失败。Hexo 8 要求 Node ≥ 20.19.0,写24最稳。
11.4 开始部署
点 Save and Deploy(保存并部署),然后就是等。第一次大概 1~3 分钟,你会看到日志里依次出现:
1 | Cloning repository... |
点开 https://myblog-xxx.pages.dev,你的博客就上线了!🎉
以后怎么更新? 本地改完文章后:
1 | git add . |
Cloudflare 检测到推送 → 自动重新构建 → 一分钟左右网站更新。完全不用手动上传文件。
11.5 绑定你的免费域名
按 Cloudflare 官方说明,子域名不需要把域名托管到 Cloudflare,加 CNAME 就行:
- Cloudflare → 你的 Pages 项目 → 自定义域 / Custom domains → Set up a domain
- 输入
myblog.localhost.cc→ Continue - 会提示需要添加 DNS 记录,记录内容是你的
myblog-xxx.pages.dev - 去 localhost.cc 的 DNS 管理面板,添加一条记录:
| 类型 | 主机记录 / Name | 记录值 / Content | TTL |
|---|---|---|---|
CNAME |
myblog |
myblog-xxx.pages.dev |
自动 / 600 |
- 回 Cloudflare 点 Check DNS records(检查 DNS) / 激活
- 等几分钟(DNS 生效),访问
https://myblog.localhost.cc就能打开了
⚠️ 顺序很重要:必须先在 Pages 里添加自定义域,再去 DNS 加 CNAME。反过来做会报 522 错误(因为 Cloudflare 不知道该域名归哪个 Pages 项目)。
⚠️ HTTPS 证书需要几分钟到几小时自动签发。刚绑定时提示「不安全」是正常的,耐心等。
⚠️ 如果一直提示「等待 DNS 生效」,检查 CNAME 值有没有多打空格、有没有漏掉
.pages.dev。
11.6 (可选)关闭 pages.dev 访问 / 强制 HTTPS
- 想让访客只能用你的域名:Pages → 自定义域 里可以设置重定向策略,或用账户级的 Bulk Redirect 把
*.pages.dev跳到你的域名。 - 强制 HTTPS:Cloudflare → 你的域名 → SSL/TLS → Edge Certificates → 打开 Always Use HTTPS。
💡 免费额度:Pages 免费版每月约 500 次构建、静态资源请求和带宽不限量(以官方为准)。个人博客完全够用。
11.7 附:不想用 Cloudflare Pages 的话(GitHub Pages 备选方案)
如果你只想部署到 GitHub Pages:
1 | npm install hexo-deployer-git --save |
然后在 _config.yml 里加:
1 | deploy: |
之后每次写完文章执行:
1 | hexo clean && hexo generate && hexo deploy |
再在仓库 Settings → Pages 里把 Source 选到对应分支。
但我推荐 Cloudflare Pages:构建在云端、不占用你本地网络、自带全球 CDN 和自动 HTTPS,图片挂 GitHub 也不会把博客拖慢。
十二、PicGo 图床:让图片粘贴即上传
12.1 为什么需要图床
Hexo 默认把图片放在本地文件夹里,问题是:图片会跟代码一起提交,仓库越来越胖,而且 Cloudflare Pages 每次构建都要传一遍,速度慢。
用「图床」的思路是:图片单独存到一个仓库(或对象存储),通过 CDN 链接引用。文章里只留一行链接,又轻又快。
12.2 下载安装 PicGo
- 官网:https://picgo.app/
- 国内下载直链(v3.0.3,Windows 64 位):https://release.picgo.app/3.0.3/PicGo-3.0.3-x64.exe
一路 Next 装完,打开 PicGo,你会看到左侧是图床列表,右侧是上传区。
12.3 创建一个专门存图片的 GitHub 仓库 + Token
① 建仓库
GitHub → + → New repository → 名字填 blog-images → Public(重要,私有仓库的图外链会 403)→ Create。
可以勾选 Add a README file,这样仓库不是空的。
❓ 为什么一共要建两个仓库?
到这一步你会有两个 GitHub 仓库,各干各的活:
仓库 存什么 谁在用 myblog博客源码(文章 Markdown、配置、主题设置) Cloudflare Pages 每次构建时拉取 blog-images只存图片 PicGo 上传图片,jsDelivr 提供 CDN 加速 分开的好处:博客仓库永远只有几十 KB 的文本,构建又快又不容易失败;图片走 CDN,不占博客仓库、也不拖慢网页。
如果混在一个仓库里,每次发文章都要把一堆图片一起提交,仓库会迅速膨胀到几百 MB,Cloudflare 每次构建都得重新下载一遍——这就是图片要单独放的原因。
嫌麻烦的替代方案(也完全可以,只是体验差一点):
- 方案一:只用一个仓库。PicGo 的「设定仓库名」也填
myblog,存储路径填source/img/。这样图片会跟着博客一起发布,链接写作/img/xxx.png。缺点是仓库变大、PicGo 上传会频繁产生 commit,且和文章提交容易撞车。- 方案二:图片放本地。干脆不用 PicGo,图片直接丢进
source/img/文件夹,文章里写。最简单,但博客源码里会堆满图片。
② 生成 Token(访问令牌)
- GitHub → 右上角头像 → Settings
- 左侧拉到最下 → Developer settings
- Personal access tokens → 选 Tokens (classic) → Generate new token (classic)
- 填写:
| 项目 | 填什么 |
|---|---|
| Note | picgo-blog-images |
| Expiration | No expiration(或 90 天,到期要重新生成) |
| Scopes | 只勾 repo(它包含读写仓库内容的权限) |
- 点 Generate token,页面上会出现一串
ghp_xxxxxxxxxxxx - 立刻复制保存!离开页面后就再也看不到这串字符了
⚠️ Token 等于你仓库的钥匙,泄露了别人就能改你的仓库。不要发到群里、不要写进文章、不要提交到 Git。
⚠️ 如果你用的是 Fine-grained token,权限要设为 Contents: Read and write,并且仓库范围选中blog-images。
12.4 在 PicGo 里配置 GitHub 图床
PicGo 左侧点 图床设置 / PicGo Settings → GitHub,按下表填写:
| 字段 | 填写内容 | 说明 |
|---|---|---|
| 图床配置名 | github |
随便起,方便区分 |
| 设定仓库名 | zhangsan/blog-images |
格式必须是 用户名/仓库名 |
| 设定分支名 | main |
新仓库默认是 main,老仓库可能是 master |
| 设定Token | ghp_xxxxxxxx |
粘贴 12.3 生成的那串 |
| 指定存储路径 | images/ |
图片会存进 images 文件夹,结尾的斜杠别丢 |
| 设定自定义域名 | https://cdn.jsdelivr.net/gh/zhangsan/blog-images@main |
见下方说明 |
点 确定,再点 设为默认图床。
关于自定义域名:
- 不用 CDN 直接填
https://raw.githubusercontent.com/zhangsan/blog-images/main
→ 但 raw.githubusercontent.com 在国内基本打不开,你的访客看不到图。 - 推荐用 jsDelivr 免费 CDN:注意结尾不要加斜杠,PicGo 会自动拼上
1
https://cdn.jsdelivr.net/gh/用户名/仓库名@分支名
images/xxx.png。
⚠️ jsDelivr 在国内偶尔抽风。如果图片加载不出来,可以换:
- 自己的 Cloudflare R2 / 对象存储 + 自定义域名(最稳,见 12.7)
- 其他 GitHub 加速域名(稳定性参差不齐,自己测试)
⚠️ jsDelivr 有缓存。同名图片覆盖上传后可能还是旧图,改个文件名,或者在链接里加
?v=2。
12.5 测试上传
- 随便截个图(
Win + Shift + S)复制到剪贴板 - PicGo 里点 剪贴板图片 或按快捷键
Ctrl + Shift + P - 上传成功后 PicGo 会自动把链接复制到剪贴板(默认就是 Markdown 格式)
- 到 GitHub 的
blog-images仓库看看,应该有images/xxxx.png了
💡 如果想把复制格式固定成 Markdown,去 PicGo 设置 → 上传后复制的格式 里选 Markdown。
12.6 写文章时怎么用
直接在 Markdown 里粘贴:
1 |  |
Butterfly 会自动渲染。想让图片支持点击放大(灯箱效果),Butterfly 默认已开启,不用额外配置。
💡 进阶:PicGo 还能和 Typora、VS Code 联动。
- Typora:文件 → 偏好设置 → 图像 → 插入图片时选「上传图片」→ 上传服务选 PicGo(app) → 填 PicGo 的安装路径。
- VS Code:装
PicGo插件,配置里把picgo.path指向 PicGo 可执行文件。
这样截图后直接粘贴,图片自动上传并插入链接,写作体验起飞。
12.7 (可选)更稳的图床:Cloudflare R2
如果 jsDelivr 经常挂,可以考虑 Cloudflare 自家的对象存储 R2(有免费额度,约 10 GB 存储 + 免费出网):
- Cloudflare 控制台 → R2 → 创建存储桶(Bucket),例如
blog-img - 给存储桶绑定一个自定义域名(如
img.localhost.cc) - 生成 R2 的 Access Key / Secret Key
- PicGo 里安装插件
picgo-plugin-s3,用 S3 兼容方式填写 R2 的 endpoint、桶名、密钥 - 自定义域名填
https://img.localhost.cc
这样上传完的链接形如 https://img.localhost.cc/images/xxx.png,全程走 Cloudflare,速度和稳定性都更好。
十三、日常写作与发布流程
13.1 标准流程(记住这五步就够)
1 | 1. hexo new "文章标题" → 生成 Markdown 文件 |
13.2 一键发布脚本
在博客根目录新建文件 发布.bat(Windows),内容:
1 | @echo off |
以后写完文章,双击这个文件就发布完了。
Mac / Linux 用 publish.sh:
1 |
|
给执行权限:chmod +x publish.sh
13.3 几个效率小技巧
- 草稿模式:
hexo new draft "想法"存草稿,预览用hexo server --draft,写好后hexo publish "想法"转正。 - 本地图床备份:PicGo 的图床仓库建议定期
git clone一份到本地,防止哪天误删。 - 文章备份:博客仓库本身就是备份,别忘了
git push。 - 想换电脑写作:新电脑装好 Git + Node →
git clone博客仓库 →npm install→ 继续写。
十四、常见问题 FAQ
| 现象 | 原因 | 解决 |
|---|---|---|
页面显示一堆 extends includes/layout.pug |
pug/stylus 渲染器没装 | npm install hexo-renderer-pug hexo-renderer-stylus --save,再 hexo clean |
'hexo' 不是内部或外部命令 |
npm 全局路径没进 PATH | 把 npm config get prefix 的路径加进环境变量,或用 npx hexo |
Cloudflare 构建报 hexo: not found |
构建命令写成了裸 hexo |
改成 npm run build |
构建报 Cannot find module 'hexo-theme-butterfly' |
主题是 git clone 到 themes/ 的,但也装在 node_modules 或没提交 |
改用 npm install hexo-theme-butterfly 并把 package.json 提交 |
| 构建报 Node 版本错误 | 云端 Node 太旧 | 环境变量加 NODE_VERSION = 24 |
| 构建成功但页面是默认主题 | _config.yml 里 theme: 没改或拼错 |
改成 theme: butterfly(注意空格) |
| 本地正常,线上样式全乱 | url 没改成真实域名 / CDN 被墙 |
改 _config.yml 的 url,主题配置里换 CDN 源 |
| 图片不显示 | 仓库是 Private / 链接错 / jsDelivr 抽风 | 图床仓库设为 Public,检查链接,换 CDN |
| 改了配置线上没变化 | 浏览器缓存或没推送 | Ctrl + F5 强刷、hexo clean、确认 git push 成功 |
推送报 403 或认证失败 |
Token 过期 / 权限不足 | 重新生成 repo 权限的 Token |
推送报 failed to push some refs |
远程有你本地没有的提交 | 先 git pull --rebase origin main 再 push |
中文文件名显示成 \344\275\240 |
Git 转义中文 | git config --global core.quotepath false |
| 4000 端口被占用 | 有其他程序在用 | hexo server -p 5000 |
| 文章日期差 8 小时 | 时区没设 | _config.yml 里加 timezone: 'Asia/Shanghai' |
| 免费域名突然打不开 | 域名被回收 / DNS 变了 | 换域名或买正式域名,回 11.5 重新绑定 |
| 访问报 522 | 先加 CNAME 后加自定义域 | 顺序反了,删掉 DNS 记录,先在 Pages 加自定义域再配 DNS |
| 评论功能没显示 | 没配置评论系统 | 新手可先 comments: false 关掉;要开推荐 Twikoo / Waline,需另行部署 |
十五、注意事项汇总(重要程度从高到低)
🔴 必须注意
- 主题用 npm 安装,不要
git clone。这是新手线上构建失败的第一大原因。 - Cloudflare Pages 的环境变量
NODE_VERSION一定要设(写24),并且构建命令用npm run build、输出目录填public。 _config.yml的url上线后必须改成真实域名,否则分享卡片、RSS、sitemap 全是错的。- Token / 密码 / 恢复码不要提交到 GitHub,也不要写进文章。PicGo 的 Token 只存在你本机。
- 绑定域名的顺序:先在 Pages 添加自定义域 → 再去 DNS 加 CNAME。反了必 522。
🟡 建议注意
- 只改根目录的
_config.butterfly.yml,不要改node_modules里的配置,否则主题一升级全部丢失。 node_modules/和public/不要提交,但package.json+package-lock.json必须提交。- YAML 格式:冒号后有空格、不用 Tab、
true/false小写。 - 路径别带中文和空格(
D:\blog比D:\我的东西\博客 项目省一百个麻烦)。 - 免费域名有失效风险,重要内容记得留本地备份,条件成熟就换正式域名。
- 图片仓库设 Public,私有仓库的图片外链会 403。
- jsDelivr 有缓存,换图记得改文件名或加
?v=2。
🟢 体验优化
- 开启 GitHub 2FA,保护好账号。
- 本地
hexo server常开,改完立刻看效果。 - 用 Typora / VS Code + PicGo 联动,写作效率翻倍。
- 文章写好后检查一遍 Front-matter,
tags和categories写对了才能正常归类。 - 定期
git pull同步仓库,换电脑无缝衔接。 - 关于备案:Cloudflare Pages 服务器在境外,不需要 ICP 备案;但国内访问速度一般,介意的话可以之后再考虑国内服务器 + 备案。
十六、上线检查清单
全部打勾,你的博客就是完全体了 ✅
- GitHub 账号注册完成,邮箱已验证,2FA 已开启
- Git 安装完成,
user.name/user.email已配置 - Node.js 安装完成(≥ 20.19),
node -v正常 -
hexo init成功,hexo server能打开 localhost:4000 - Butterfly 主题已用 npm 安装,
theme: butterfly已设置 - 已创建根目录
_config.butterfly.yml - 站点标题、作者、
url、timezone已改 - 导航菜单、头像、副标题已配好
- 标签 / 分类 / 关于页面已创建且不 404
- 至少发了一篇文章
- 代码已
git push到 GitHub,node_modules没被提交 - Cloudflare Pages 项目创建成功,
NODE_VERSION=24已设置 -
xxx.pages.dev能正常访问 - 自定义域名已在 Pages 添加,DNS 的 CNAME 已配置并生效
- HTTPS 证书已签发,
https://正常访问 - PicGo 安装并配置好 GitHub 图床,上传测试成功
- 文章中插入的图片能正常显示
- 写好了发布脚本,知道以后怎么更新博客
最后一句:搭博客最难的是第一次,跑通一次之后你会发现——以后发博客就只剩「写文章 + 双击发布脚本」两件事了。
祝你写得开心,也别忘了:内容才是博客的主角,皮肤只是衣服。 🎈