目标读者:完全没接触过前端/博客的”小白”。
跟着做,你会在 1~2 小时内拥有一个和本博客(Sky Blog)一样的、能在线访问的博客。
本教程所有命令在 Windows + Git Bash 下书写,macOS/Linux 用户只需把git换成同款命令即可。
目录
- 第 0 步:先搞懂 4 个概念
- 第 1 步:准备环境(15 分钟)
- 第 2 步:搭建 Hexo 骨架(10 分钟)
- 第 3 步:安装 Sakura 主题
- 第 4 步:站点配置
_config.yml - 第 5 步:主题配置
_config.sakura.yml - 第 6 步:写第一篇文章
- 第 7 步:搞定标签/分类页(新手必踩的坑)
- 第 8 步:本地预览与排错
- 第 9 步:部署上线到 GitHub Pages
- 第 10 步:其他平台部署(Cloudflare / Vercel / Netlify)
- 第 11 步:GitHub Actions 自动部署
- 第 12 步:移动端适配
- 第 13 步:日常维护(写文章、改壁纸、换封面)
- 附录 A:命令速查
- 附录 B:血泪避坑清单
第 0 步:先搞懂 4 个概念
在动手之前,先花 5 分钟明白”我们到底在做什么”。用大白话解释:
| 概念 | 是什么 | 类比 |
|---|---|---|
| 静态博客 | 所有网页在本地提前做好(纯 HTML/CSS/JS),别人访问时直接”发卡片”给他 | 印刷好的传单,别人来拿现成的 |
| Hexo | 一个”工厂”:输入 Markdown 文章 → 输出一堆 HTML 网页文件 | 你写中文 → 机器帮你翻译成网页 |
| GitHub Pages | GitHub 提供的免费网页托管,绑定到你的仓库 | 免费租了一间房子放你的传单 |
| Markdown | 一种”加了记号”的纯文本,# 是标题、** 是加粗 |
记笔记时用 # 表示大标题 |
整体流程(全程就这一个循环):
写文章(.md) → hexo generate 生成网页(public/) → 推送到 gh-pages 分支 → 访问 https://你的用户名.github.io/仓库名/ |
记住这条线,后面每一步都是围着它转的。
第 1 步:准备环境(15 分钟)
你需要 4 样东西,全部免费:
1.1 安装 Node.js(博客工厂的动力源)
- 打开 https://nodejs.org/zh-cn ,下载 LTS 版(如 20.x)
- 一路 Next 装完(默认即可)
- 验证是否装好(打开 Git Bash,输入):
node -v # 应输出 v18 或更高,如 v20.11.0 |
1.2 安装 Git(版本管理 + 推送到 GitHub)
- 打开 https://git-scm.com/download/win 下载安装
- 安装向导里”默认选择”即可(建议:默认编辑器选 Notepad++ 或 VS Code)
- 安装后右键桌面,会出现 “Git Bash Here” —— 后面所有命令都在这个窗口敲
- 验证:
git --version # 应输出 git version 2.x |
1.3 注册 GitHub 账号
- 打开 https://github.com 注册(用户名决定你的博客地址)
- 登录后,新建一个空仓库:
- 右上角 + → New repository
- Repository name:
myblog(随便起,英文小写) - 不要勾选 “Add a README file”
- 点 Create repository
1.4 安装 VS Code(写文章用的编辑器)
- 打开 https://code.visualstudio.com 下载安装
- 装好后在任意文件夹右键 → “Open with Code”
✅ 环境就绪标志:
node -v、git --version都有输出,GitHub 账号能登录。
第 2 步:搭建 Hexo 骨架(10 分钟)
2.1 安装 Hexo 命令行工具
npm install -g hexo-cli |
2.2 创建博客项目
# 找一个你喜欢的目录(比如 D:\),进入后执行: |
装完你会看到这样一个目录结构(先认识,不用背):
myblog/ |
2.3 第一次预览
npx hexo server |
能看到一个默认博客页面 = 骨架搭好了。按 Ctrl + C 停掉。
如果
hexo init很慢或失败(网络问题),可以手动搭:
mkdir myblog && cd myblog
npm init -y
npm install hexo hexo-server hexo-renderer-marked hexo-renderer-ejs hexo-renderer-stylus hexo-renderer-pug hexo-generator-index hexo-generator-archive hexo-generator-tag hexo-generator-category hexo-generator-feed hexo-generator-search hexo-tag-bili hexo-tag-fancybox_img然后自己建
source/_posts/、scaffolds/、themes/文件夹即可,效果一样。
第 3 步:安装 Sakura 主题
Sakura 是本博客使用的二次元主题(原作者 honjun,MIT 协议)。
3.1 下载主题到 themes 目录
cd myblog |
3.2 启用主题
编辑 myblog/_config.yml,把 theme: 改成:
theme: sakura |
3.3 认识”主题两套配置”(非常重要!)
Sakura 主题有两份配置文件,它们会自动合并:
| 文件 | 角色 | 什么时候改 |
|---|---|---|
themes/sakura/_config.yml |
主题默认配置 | 极少改(它是模板) |
_config.sakura.yml(自己建) |
站点覆盖配置 | ★ 日常改这里 |
⚠️ 大坑预告:两份配置的同名数组(比如
bg:、menus:)会拼接而不是覆盖!
例如两边都写bg:,最终会得到 16 张背景图,前 8 张还可能是失效的。
规则:数组字段只在一处写(本项目统一写在themes/sakura/_config.yml)。
新建 myblog/_config.sakura.yml,先放最小内容:
# 站点名与头像 |
第 4 步:站点配置 _config.yml
打开 myblog/_config.yml,重点改这几处:
4.1 站点信息
title: 我的技术博客 # 浏览器标签栏标题 |
4.2 URL 和 root(★ 子目录部署的关键)
如果你要把博客放在 https://用户名.github.io/仓库名/(项目页),必须:
url: https://你的用户名.github.io/myblog |
如果你要放在 https://用户名.github.io/(个人主页),改成:
url: https://你的用户名.github.io |
root决定所有资源路径的前缀。改错了,图片/样式全 404。
4.3 常用字段对照表
| 字段 | 作用 |
|---|---|
permalink |
文章网址格式,如 :year/:month/:day/:title/ |
theme |
主题名(第 3 步已改) |
deploy |
部署配置(见第 9 步,建议留空不用) |
index_generator.per_page |
首页每页文章数 |
第 5 步:主题配置 _config.sakura.yml
把 _config.sakura.yml 补全(这是”主题如何设置”的核心):
5.1 菜单
menus: |
fa:是 Font Awesome 图标名,想换图标去 https://fontawesome.com/v4/icons/ 查。
5.2 头像与 favicon
favicon: /img/favicon.png |
把你的头像图片放到 source/img/favicon.png(没有 img 文件夹就新建)。
5.3 壁纸(首页背景图)
做法一(推荐,本项目采用):直接改 themes/sakura/_config.yml:
bg: |
把图片放到 source/img/wallpaper/ 下(建议 .webp 格式,体积小加载快)。
⚠️ 绝不要同时在 _config.sakura.yml 里再写 bg: —— 会变成 16 张图(数组拼接的坑)。
5.4 背景音乐(APlayer)
aplayer: |
想换歌单:打开网易云音乐网页版 → 找到一个歌单 → 网址里 /playlist?id=xxxxxx 的 xxxxxx 就是 ID。
⚠️ 网易云外链大量失效,播放器会”卡在”放不了的歌上。
本项目已把播放器改成坏链自动跳下一首(改的是themes/sakura/layout/_partial/aplayer.ejs)。
想要最稳:把自己 mp3 放进source/music/,改成本地播放列表。
5.5 社交链接
# PC 端(左下角) |
social的img:需要准备图标图片放进source/img/social/;msocial用字体图标不需要图片,更省事。
5.6 首页 START:DASH 三张卡片
startdash: |
第 6 步:写第一篇文章
6.1 创建
cd myblog |
生成的文件:source/_posts/我的第一篇博客.md。用 VS Code 打开,front-matter(--- 之间的部分)写成:
--- |
--- 下面就是正文,用 Markdown 语法写:
# 一级标题 |
正文里需要代码块时,单独用三个反引号包裹即可(不要和上面的示例嵌套):
console.log("代码块"); |
6.2 Front-matter 字段速查
--- 之间的内容叫 front-matter(文章”身份证”):
| 字段 | 必填 | 说明 | 示例 |
|---|---|---|---|
title |
✅ | 标题 | title: 我的博客 |
date |
✅ | 发布时间 | date: 2026-08-27 18:00:00 |
updated |
– | 更新时间 | updated: 2026-08-28 09:00:00 |
tags |
– | 标签(可多个) | tags: [技术, github] |
categories |
– | 分类(可多个) | categories: [技术] |
photos |
– | 封面图(数组,第一张是封面) | photos: [/img/cover/a.jpg] |
description |
– | 列表页摘要 | description: 一句话介绍 |
mathjax |
– | 数学公式 | mathjax: true |
6.3 封面图怎么设置?(重点)
Sakura 主题的封面字段是 photos 数组(不是 cover!用 cover 不生效):
photos: |
步骤:
- 建目录
source/img/cover/,把图放进去 - front-matter 写
photos: [/img/cover/my-cover.jpg] - 重新生成 → 文章页顶部就有封面大图,列表页缩略图也用它
以
/开头的路径 = “资源根”,Hexo 会自动加上root(如/myblog/),最终访问https://用户名.github.io/myblog/img/cover/my-cover.jpg。
6.4 正文里插图片
把图片放 source/img/post/,正文里写:
 |
6.5 标签和分类有什么用
- 标签:一篇文章可以贴多个,如”教程””Hexo””GitHub”
- 分类:类似文件夹,一篇最好只归一个
它们会自动生成聚合页(如 /tags/GitHub/ 列出所有 GitHub 标签文章),
前提是你按第 7 步建了标签/分类根页。
第 7 步:搞定标签/分类页(新手必踩的坑)
症状:菜单点”标签”/“分类”,页面 404 或空白。
原因:Hexo 会自动生成”单个标签页”(/tags/GitHub/),
但不会自动生成”标签总览页”(/tags/)——除非你手动建了页面文件。
解决:在 source/ 下新建两个文件:
source/tags/index.md:
--- |
source/categories/index.md:
--- |
为什么不是
type: tags? Sakura 主题只提供了tag.ejs(单数)这一个模板。type: tags会让 Hexo 去找tags.ejs(复数),找不到就退回通用模板,
页面变成”空壳”。用layout: tag才能命中正确模板。
进一步美化(可选):Sakura 自带的 tag.ejs 在”总览页”上只显示最新文章,不显示标签列表。
本项目改成了”总览页显示全部标签+文章数”(themes/sakura/layout/tag.ejs 里判断!page.tag 时渲染 site.tags 列表),单标签页行为不变。想抄的看本项目源码。
第 8 步:本地预览与排错
8.1 常用命令
npx hexo server # 启动本地预览 http://localhost:4000 |
8.2 常见报错速查
| 报错 | 原因 | 解决 |
|---|---|---|
Port 4000 is already in use |
端口被占 | npx hexo server -p 4001 |
| 图片/样式 404 | root 配置错 |
检查 _config.yml 的 root: |
| 修改后页面没变 | 缓存 | npx hexo clean && npx hexo generate |
| 壁纸显示 CDN 默认图 | 数组 concat | 见 §5.3,bg: 只写一处 |
| 标签页空白 | 没建 index.md | 见第 7 步 |
第 9 步:部署上线到 GitHub Pages
这是最容易”翻车”的一步,按下面的推荐姿势做,稳。
9.1 把源码推到 GitHub
cd myblog |
如果你仓库默认分支叫
master,就把main换成master。
推送要账号密码/Token:GitHub 现在要求用 Personal Access Token(Settings → Developer settings → Personal access tokens),或先跑gh auth login登录 CLI。
9.2 在 GitHub 上启用 Pages
仓库页面 → Settings → Pages:
- Source 选 Deploy from a branch
- Branch 选
gh-pages,目录/ (root) - 点 Save
注意:这里选的是
gh-pages(产物分支),不是main(源码分支)!
9.3 部署姿势一:独立目录法(★ 推荐,本项目用这个)
原理:把构建产物复制到一个独立的 git 仓库目录,只往 gh-pages 分支推。
# 1. 生成产物 |
为什么不能直接
npx hexo d?
当你把myblog文件夹本身变成 git 仓库后,hexo-deployer-git的.deploy_git
会”蹭用”根目录的.git,结果git add -A把整个源码推上了gh-pages,
GitHub Pages 找不到根index.html→ 404。这是本项目踩过的真事故,详见附录 B。
.nojekyll是什么? 一个空文件,告诉 GitHub Pages”不要用 Jekyll 重新构建,
我给你的就是最终网页”。没有它,Jekyll 可能静默失败并沿用旧版,
表现为”明明推了新代码,线上还是老样子”。
9.4 部署姿势二:GitHub Actions 自动部署(推荐长期用)
见第 11 步,配一次之后每次 git push 就自动发布,本地不用装 Node。
9.5 首次访问
部署成功后等 1~2 分钟(GitHub Pages 构建需要时间),打开:
https://你的用户名.github.io/myblog/ |
看到自己的博客上线了 🎉 这就是全程的目标。
第 10 步:其他平台部署(Cloudflare / Vercel / Netlify)
这三个平台原理一样:连接你的 GitHub 仓库 → 填构建命令 → 平台帮你跑 → 发布。
共同配置:
| 配置项 | 值 |
|---|---|
| 构建命令(Build command) | npm run build(package.json 里已定义 hexo generate) |
| 输出目录(Output directory) | public |
| Node 版本 | 20(在环境变量里设 NODE_VERSION=20) |
| 环境变量 | PUBLIC_URL=https://你的域名 |
注意:在这些平台部署时,
_config.yml的url/root要按平台给的域名改,
比如 Vercel 是https://xxx.vercel.app,root通常是/。
10.1 Cloudflare Pages
- https://dash.cloudflare.com → Pages → Create a project → Connect to Git
- 选仓库 → Framework preset 选 Hexo
- 填上表的 Build command / Output directory
- Save and Deploy,等 1~2 分钟
- 自定义域名:项目 → Custom domains → 填域名,Cloudflare 自动配 CNAME + HTTPS
10.2 Vercel
- https://vercel.com → New Project → Import Git Repository → 选仓库
- Framework Preset 选 Other,Build Command 填
npm run build,Output 填public - Deploy,30 秒拿到
xxx.vercel.app - 域名:Project → Settings → Domains
10.3 Netlify
- https://app.netlify.com → Add new site → Import an existing project → 选 GitHub 仓库
- Build command:
npm run build;Publish directory:public - Deploy site
- 域名:Site settings → Domain management → Add custom domain
第 11 步:GitHub Actions 自动部署
配好后,以后只做一件事:改完文章 git push,剩下全自动。
11.1 创建工作流文件
在 myblog/.github/workflows/deploy.yml 新建:
name: Deploy Hexo to gh-pages |
11.2 提交并验证
git add .github/workflows/deploy.yml |
去仓库 Actions 标签页能看到工作流在跑。绿勾 = 成功,之后每次 push 都自动发布。
第 12 步:移动端适配
12.1 主题自带能力
Sakura 自带响应式:手机访问自动隐藏侧栏、汉堡菜单、压缩字体。一般不用动。
12.2 本项目做过的微调(可参考)
在 themes/sakura/source/css/style.css 追加:
/* 菜单强制一行,防止换行挤到第二行 */ |
12.3 测试不同设备
浏览器按 F12 → 左上角切换设备图标(Ctrl+Shift+M)→ 试 375px(iPhone SE)/ 768px(iPad)/ 1280px(桌面)。
优化建议:
- 图片转
.webp(体积小一半) - 首页壁纸单张 ≤ 200KB
- 文字大小在
@media (max-width: 768px)里适当放大
第 13 步:日常维护(写文章、改壁纸、换封面)
13.1 发新文章的标准流程
cd myblog |
13.2 换壁纸
- 新图放
source/img/wallpaper/ - 改
themes/sakura/_config.yml的bg:数组 - 重新生成 + 部署
13.3 换封面图
- 新图放
source/img/cover/ - 改文章 front-matter 的
photos: - 重新生成 + 部署
13.4 备份
源码推到 main 就是最好的备份。定期:
git push origin main |
附录 A:命令速查
| 用途 | 命令 |
|---|---|
| 装依赖 | npm install |
| 本地预览 | npx hexo server |
| 创建文章 | npx hexo new "标题" |
| 创建独立页 | npx hexo new page 路径 |
| 生成静态文件 | npx hexo generate(简写 hexo g) |
| 清缓存 | npx hexo clean |
| 查看 git 状态 | git status |
| 提交 | git add . && git commit -m "说明" |
| 推源码 | git push origin main |
| 推产物(独立目录法) | git -c http.version=HTTP/1.1 push -f origin HEAD:gh-pages |
| 杀 node(Windows) | PowerShell: Stop-Process -Name node -Force;CMD: taskkill /F /IM node.exe |
附录 B:血泪避坑清单
🚨 1. 禁用 hexo d(本项目最大事故)
站点根目录本身是 git 仓库时,hexo deploy 会把整个源码 force push 到 gh-pages,
导致线上 404(找不到根 index.html)。
只用独立目录法(§9.3)或 GitHub Actions(§11)。
🚨 2. 主题配置数组是”拼接”不是”覆盖”
_config.sakura.yml 和 themes/sakura/_config.yml 的同名数组会 concat。bg、menus、startdash 都中招。数组只写一处。
🚨 3. 子目录部署必须用 url_for()
主题里如果直接”字符串拼接”出路径(如 theme.cdn + '/img/xx'),子目录部署会 404。
Sakura 的 head.ejs(背景图)、startdash.ejs、headertop.ejs(头像)都踩过,
本项目已改为 url_for() 处理。改主题时遇到路径拼接,优先用 url_for()。
🚨 4. type: tags 会 404,要用 layout: tag
Sakura 只有 tag.ejs 单数模板。见第 7 步。
🚨 5. GitHub Pages 必须放 .nojekyll
否则 Jekyll 可能静默失败并沿用旧版。每次部署 touch .nojekyll。
🚨 6. 推送失败先试三板斧
git push origin main # ① 默认 |
🚨 7. 网易云歌单外链大量失效
播放器会卡在放不了的歌。换歌单 ID 治标,本地 mp3 治本。
恭喜读到这里! 现在你已经能从零搭起并上线一个 Hexo + Sakura 博客了。
剩下就是多写、多改、多看 npx hexo server 的实时预览。
有问题就回看本教程的排错表,或者到 Hexo 文档 查。

