前言:
Hexo是一个快速、简洁且高效的静态站点生成器,基于Node.js开发。与WordPress这种开箱即用的动态网站框架不同,Hexo是将Markdown文档转换为静态网站,极其轻量化,非常适合技术博客和个人网站。结合GitHub Pages的免费托管服务,可以零成本搭建一个很唬人的个人博客。
本教程将带你从零开始搭建一个Hexo博客并部署到GitHub Pages。
一、环境准备
在开始之前,需要安装以下软件:
Node.js
Hexo基于Node.js开发,首先需要安装Node.js。访问Node.js官网下载LTS版本。
安装完成后,在命令行验证:
1 | node --version |
Git
用于版本控制和部署到GitHub。访问Git官网下载安装。各种流行IDE的内置图形化Git工具,一般也需要你先自行安装Git。
安装完成后配置用户信息:
1 | git config --global user.name "你的用户名" |
二、安装Hexo
使用npm全局安装Hexo:
1 | npm install -g hexo-cli |
验证安装:
1 | hexo version |
三、创建博客项目
在合适的位置创建博客目录:
1 | hexo init my-blog |
项目结构大致如下:
1 | my-blog/ |
项目结构详解
根目录文件:
_config.yml:站点主配置文件,控制网站的基本信息、URL、插件等package.json:Node.js项目配置文件,记录依赖包和脚本命令package-lock.json:锁定依赖版本,确保环境一致性
scaffolds/ 目录:
- 存放文章模板文件
post.md:新文章的默认模板page.md:新页面的默认模板draft.md:草稿文章的模板
source/ 目录:
- 存放网站的源文件,除了
_posts/外的文件会直接复制到网站根目录 _posts/:存放所有文章(Markdown格式)images/:存放图片资源css/:存放自定义样式文件js/:存放自定义JavaScript文件- 其他
.md文件:会生成对应的页面
themes/ 目录:
- 存放主题文件
- 每个主题都有自己的配置文件和模板
- 主题修改后需要重新生成网站
public/ 目录(生成后出现):
- 存放构建后的静态文件
- 这个目录会被部署到GitHub Pages
- 不要手动修改,每次
hexo generate会重新生成
四、配置站点
编辑_config.yml文件,修改基本信息:
1 | # Site |
五、选择主题
Hexo有丰富的主题选择,这里以Ayer主题为例:
安装主题
1 | git clone https://github.com/Shen-Yu/hexo-theme-ayer.git themes/ayer |
启用主题
在_config.yml中启用主题:
1 | theme: ayer |
主题配置
大多数主题都有自己的配置文件,通常位于themes/主题名/_config.yml。你可以:
- 复制主题配置文件到根目录:
cp themes/ayer/_config.yml _config.ayer.yml - 在根目录的
_config.ayer.yml中修改主题设置 - 这样修改不会在主题更新时丢失
主题修改后的操作
主题修改分为两种情况,操作流程不同:
情况一:仅修改主题配置文件
如果只修改了主题配置文件(如_config.ayer.yml或themes/ayer/_config.yml),操作如下:
1 | hexo clean # 清理缓存 |
情况二:修改主题源文件
如果修改了主题的源文件(如CSS、JavaScript、模板文件等),需要先构建主题,然后再构建网站。
为什么需要先构建主题?
现代Hexo主题通常使用预处理器和构建工具:
- CSS预处理器:Stylus、SCSS、Less等
- JavaScript打包:Webpack、Rollup等
- 代码优化:压缩、合并、Tree-shaking等
以Ayer主题为例,它的目录结构包括:
1 | themes/ayer/ |
关键理解:Hexo在生成网站时,使用的是source/dist/中的编译后文件,而不是source-src/中的源文件。因此,修改源文件后必须先编译。
完整操作流程:
1 | # 步骤1:进入主题目录 |
简化命令(在站点根目录执行):
1 | # Windows PowerShell |
常见主题文件修改场景
| 修改内容 | 是否需要构建主题 | 示例 |
|---|---|---|
| 主题配置文件 | ❌ 不需要 | _config.ayer.yml |
| 模板文件(EJS等) | ❌ 不需要 | layout/_partial/footer.ejs |
| 预处理CSS(Stylus/SCSS) | ✅ 需要 | source-src/css/_partial/categories.styl |
| 源码JavaScript | ✅ 需要 | source-src/js/ayer.js |
| 已编译的CSS | ⚠️ 不推荐直接修改 | source/dist/main.css |
| 已编译的JS | ⚠️ 不推荐直接修改 | source/dist/main.js |
注意:直接修改source/dist/中的编译后文件会在下次构建时被覆盖,应该修改source-src/中的源文件。
开发模式:实时监听修改
如果需要频繁修改主题样式,可以使用开发模式:
终端1(主题开发服务器):
1 | cd themes/ayer |
终端2(Hexo服务器):
1 | hexo server # 启动网站预览 |
这样修改source-src/中的文件后:
- Rollup自动重新构建到
source/dist/ - 刷新浏览器即可看到效果(某些修改可能需要重启Hexo服务器)
主题构建工具对照表
不同主题使用不同的构建工具,常见命令:
| 主题 | 构建工具 | 构建命令 |
|---|---|---|
| Ayer | Rollup | npm run build |
| Butterfly | Gulp | npm run build |
| Next | 无需构建 | 直接修改即可 |
| Fluid | Webpack | npm run build |
如何判断主题是否需要构建?
- 查看主题目录是否有
package.json文件 - 检查是否有
source-src/、src/等源码目录 - 查看
package.json中是否有build脚本
如果以上都没有,说明主题不需要构建,直接修改后运行hexo clean && hexo generate即可。
主题修改调试技巧
-
使用浏览器开发者工具:
- 按F12打开开发者工具
- 在Elements面板中实时修改CSS样式
- 找到满意的样式后,再修改源文件
-
查看构建日志:
1
npm run build --verbose # 查看详细构建信息
-
清理缓存:
如果修改未生效,尝试清理所有缓存:1
2hexo clean # 清理Hexo缓存
rm -rf themes/ayer/node_modules/.cache # 清理主题构建缓存(如果存在) -
强制刷新浏览器:
- Windows/Linux:
Ctrl + F5 - Mac:
Cmd + Shift + R
- Windows/Linux:
主题修改最佳实践
-
版本控制:
- 使用Git跟踪主题修改
- 修改前创建分支:
git checkout -b theme-custom
-
备份原文件:
1
cp source-src/css/_partial/categories.styl source-src/css/_partial/categories.styl.bak
-
文档记录:
在项目中创建THEME_MODIFICATIONS.md记录修改内容 -
避免直接修改主题:
如果可能,通过主题配置或自定义CSS实现,避免修改主题核心文件 -
主题更新策略:
- 不要直接在主题目录使用
git pull更新 - 先备份你的修改,更新后再手动合并
- 不要直接在主题目录使用
常用主题推荐
- Ayer:简洁现代,支持数学公式
- Next:功能丰富,文档完善
- Butterfly:美观实用,动画效果丰富
- Fluid:响应式设计,适合移动端
主题工作原理详解
很多人对主题的作用有误解,以为主题只是为网站添加一些额外功能或美化样式。实际上,主题是Hexo构建过程中的核心组成部分,它深度参与整个网站生成流程,决定了网站的呈现方式。
主题在构建过程中的作用
Hexo的构建过程可以简化为:源文件(Markdown等) → 渲染引擎处理 → 主题模板渲染 → 最终HTML
主题并不是在网站生成后才"装饰"网站,而是在构建阶段就全程干预网站的生成:
- 模板渲染阶段:主题提供模板文件(如EJS、Pug等),Hexo会将处理后的数据注入这些模板,生成最终的HTML
- 样式和脚本注入:主题决定了CSS和JavaScript的加载方式和内容
- 页面布局控制:主题决定了首页、文章页、标签页等各类页面的结构和布局
- 功能实现:主题可以实现评论系统、搜索功能、目录生成等各种功能
关键理解:主题不是可有可无的"皮肤",而是必需的构建组件。没有主题,Hexo无法生成完整的网站。
主题的目录结构
一个典型的主题目录结构如下:
1 | themes/主题名/ |
主题如何控制网站生成
1. 模板系统(最核心)
主题通过模板文件控制HTML的生成。以文章页为例,layout/post.ejs可能是这样的:
1 | <!DOCTYPE html> |
当你执行hexo generate时:
- Hexo读取
source/_posts/中的Markdown文件 - Markdown渲染器将Markdown转换为HTML片段
- Hexo将数据(标题、日期、内容等)传递给主题的
post.ejs模板 - 模板引擎处理
<%=和<%-标记,生成最终的HTML - 生成的HTML保存到
public/目录
如果没有主题,Hexo就缺少了模板,无法生成完整的HTML页面。
2. 样式和布局
主题的CSS文件完全控制网站的视觉呈现:
- 页面布局:单栏、双栏、三栏布局
- 颜色方案:背景色、文字颜色、链接颜色
- 响应式设计:移动端适配
- 动画效果:过渡、悬停效果
同一个Markdown文件,使用不同主题生成的网站可能完全不同。
3. 功能集成
主题可以集成各种功能:
- 评论系统:通过在模板中插入第三方评论代码(Gitalk、Valine等)
- 搜索功能:生成搜索索引,提供搜索界面
- 数学公式:加载KaTeX或MathJax库
- 代码高亮:集成Prism或Highlight.js
- 目录生成:自动生成文章目录(TOC)
- 阅读统计:集成访问量统计代码
这些功能不是Hexo核心提供的,而是主题开发者在主题中实现的。
4. 数据处理和过滤
主题可以通过scripts/目录中的JavaScript文件扩展Hexo功能:
1 | // themes/主题名/scripts/custom.js |
这些脚本在构建过程中运行,可以:
- 修改页面数据
- 添加自定义标签
- 处理文件
- 生成额外内容
主题配置与站点配置的关系
Hexo有两个配置文件系统:
| 配置文件 | 作用范围 | 典型内容 |
|---|---|---|
根目录_config.yml |
站点全局配置 | 网站标题、URL、部署设置、渲染器配置 |
_config.主题名.yml |
主题配置 | 主题样式、功能开关、菜单设置、评论配置 |
themes/主题名/_config.yml |
主题默认配置 | 主题的默认设置(不建议直接修改) |
配置优先级:根目录的_config.主题名.yml > 主题目录的_config.yml
建议将主题配置复制到根目录:
1 | cp themes/ayer/_config.yml _config.ayer.yml |
这样做的好处:
- 主题更新时不会覆盖你的配置
- 配置集中管理,便于版本控制
- 可以同时维护多个主题配置
更换主题的影响
更换主题 = 重新定义网站的生成规则,会导致:
- 页面结构完全改变:不同主题的HTML结构可能完全不同
- 样式重置:颜色、字体、布局全部改变
- 功能变化:某些功能可能消失或新增(取决于新主题是否支持)
- 配置需要重新设置:每个主题的配置选项不同
- 兼容性问题:某些插件可能与新主题不兼容
主题开发进阶
如果你想深度定制主题,需要了解:
1. 模板引擎
- EJS(类似HTML,易学)
- Pug(简洁语法,学习曲线稍高)
- Nunjucks(功能强大)
2. Hexo变量和辅助函数
1 | <%= config.title %> <!-- 站点标题 --> |
3. 主题继承
可以基于现有主题进行修改:
1 | # 复制主题 |
主题性能优化
主题会影响网站性能:
- 减少HTTP请求:合并CSS和JS文件
- 代码压缩:压缩CSS、JS、HTML
- 延迟加载:图片懒加载、按需加载JS
- CDN加速:将静态资源托管到CDN
- 缓存策略:设置合理的浏览器缓存
总结:主题的本质
主题不是网站的"外衣",而是网站的"骨架和血肉"。
- 骨架:主题的模板文件定义了网站的结构
- 血肉:主题的样式和脚本赋予网站生命和交互
- 灵魂:你的Markdown内容填充到主题提供的框架中
Hexo的工作流程:
1 | Markdown文件(内容) |
如果把Hexo比作一个汽车工厂:
- Markdown文件是原材料
- 渲染器是加工车间
- 主题是组装生产线和最终设计
- public/目录是成品仓库
没有主题,整个生产线就无法运转!
六、创建文章
创建新文章
使用命令创建新文章:
1 | hexo new "文章标题" |
文章会生成在source/_posts/目录下,文件名格式为年-月-日-文章标题.md。
文章头部信息(Front Matter)
每篇文章开头都有YAML格式的配置信息:
1 |
|
常用字段说明:
title:文章标题date:发布日期categories:分类(支持多级分类)tags:标签(支持多个标签)description:文章描述permalink:自定义链接comments:是否启用评论toc:是否显示目录
文章内容编写
使用Markdown语法编写文章内容,支持:
- 标题、段落、列表
- 代码块、引用
- 链接、图片
- 表格、数学公式
- HTML标签
文章管理
- 草稿:
hexo new draft "标题"创建草稿 - 发布草稿:
hexo publish "标题"将草稿转为正式文章 - 删除文章:直接删除
source/_posts/中的文件 - 修改文章:编辑对应的
.md文件
七、本地预览
启动本地服务器
1 | hexo server |
访问http://localhost:4000查看效果。
预览选项
1 | # 指定端口 |
预览时的注意事项
- 修改文章后,浏览器会自动刷新
- 修改配置文件后,需要重启服务器
- 修改主题文件后,需要重启服务器
- 使用
Ctrl+C停止服务器
生成静态文件
1 | hexo generate |
生成的文件在public/目录中,可以直接部署到任何静态网站托管服务。
八、部署到GitHub Pages
有两种主要的部署方式,推荐使用方案一(GitHub Actions自动化部署):
方案一:GitHub Actions自动化部署(推荐)
这种方案将整个项目推送到GitHub,通过GitHub Actions自动构建和部署,适合需要随时随地修改文章的场景。
1. 创建GitHub仓库
在GitHub上创建一个名为你的用户名.github.io的仓库。
2. 推送整个项目到GitHub
1 | # 初始化Git仓库(如果还没有) |
3. 配置GitHub Actions
在项目根目录创建.github/workflows/pages.yml文件:
1 | name: Pages |
4. 配置package.json构建脚本
确保package.json中有构建脚本:
1 | { |
5. 启用GitHub Pages
- 进入GitHub仓库的Settings页面
- 找到Pages设置
- 选择Source为"GitHub Actions"
- 保存设置
6. 日常使用
以后只需要:
1 | # 修改文章后 |
GitHub Actions会自动构建和部署,几分钟后网站就会更新。
方案二:仅部署构建产物(传统方式)
这种方案只将构建后的静态文件推送到GitHub,适合不需要频繁修改的场景。
1. 创建GitHub仓库
在GitHub上创建一个名为你的用户名.github.io的仓库。
2. 安装部署插件
1 | npm install hexo-deployer-git --save |
3. 配置部署
在_config.yml中添加:
1 | deploy: |
4. 部署
1 | hexo clean |
两种方案对比
| 特性 | GitHub Actions方案 | 传统方案 |
|---|---|---|
| 部署复杂度 | 一次配置,后续简单 | 每次需要手动执行命令 |
| 版本控制 | 完整项目历史 | 只有构建产物 |
| 多设备协作 | 支持,可随时拉取修改 | 不支持,需要本地环境 |
| 自动化程度 | 完全自动化 | 需要手动操作 |
| 学习成本 | 稍高(需要了解GitHub Actions) | 较低 |
| 适用场景 | 需要随时随地修改文章 | 偶尔更新,固定环境使用 |
推荐使用方案一,特别是对于需要随时随地修改文章的用户。
九、图片管理
添加图片
- 将图片文件放入
source/images/目录 - 在文章中使用相对路径引用:
1 |  |
图片优化建议
- 使用WebP格式减少文件大小
- 压缩图片提高加载速度
- 为图片添加alt属性提高可访问性
- 考虑使用CDN加速图片加载
图片引用方式
1 | <!-- 相对路径 --> |
十、创建页面
创建新页面
1 | hexo new page "页面名称" |
页面会生成在source/页面名称/index.md。
常用页面类型
- 关于页面:
hexo new page "about" - 友链页面:
hexo new page "friends" - 标签页面:
hexo new page "tags" - 分类页面:
hexo new page "categories" - 归档页面:
hexo new page "archives"
页面配置
在页面文件中添加配置:
1 |
|
添加导航菜单
在主题配置文件中添加菜单项:
1 | menu: |
十一、插件和功能扩展
常用插件
1 | # 搜索功能 |
插件配置
在_config.yml中添加插件配置:
1 | # 搜索 |
自定义功能
- 在
source/js/中添加自定义JavaScript - 在
source/css/中添加自定义样式 - 修改主题模板文件(需要了解EJS语法)
十二、常用命令
文章和页面管理
1 | # 创建新文章 |
构建和预览
1 | # 生成静态文件 |
部署相关
1 | # 部署到远程仓库 |
调试和帮助
1 | # 显示帮助信息 |
常用组合命令
1 | # 开发环境:清理、生成、启动服务器 |
十、更换Markdown渲染器
Hexo支持多种Markdown渲染器,不同的渲染器有不同的功能和特性。以下是常用渲染器对比:
| 渲染器 | 特点 | 适用场景 |
|---|---|---|
hexo-renderer-marked |
默认渲染器,轻量快速 | 一般博客写作 |
hexo-renderer-markdown-it |
功能丰富,插件支持多 | 需要扩展功能 |
hexo-renderer-markdown-it-katex |
支持数学公式渲染 | 学术写作、技术文档 |
hexo-renderer-kramed |
基于marked的增强版 | 兼容性要求高 |
更换到KaTeX渲染器(支持数学公式)
如果你需要在博客中写数学公式,可以更换到支持KaTeX的渲染器:
步骤1:卸载默认渲染器
1 | npm uninstall hexo-renderer-marked --save |
步骤2:安装KaTeX渲染器
1 | npm install hexo-renderer-markdown-it-katex --save |
步骤3:配置渲染器
在_config.yml中添加:
1 | # Markdown-it configuration |
步骤4:配置KaTeX支持
在主题配置文件中启用KaTeX:
1 | katex: |
步骤5:清理并重新生成
1 | hexo clean |
换回默认渲染器
如果不需要数学公式支持,可以换回默认渲染器:
1 | npm uninstall hexo-renderer-markdown-it-katex --save |
然后从_config.yml中删除或注释掉markdown_it配置,在主题配置中禁用KaTeX:
1 | katex: |
验证渲染器更换
检查当前渲染器:
1 | npm list | grep renderer |
测试数学公式(如果使用KaTeX渲染器):
1 | $$E = mc^2$$ |
十一、Q&A
Q:如何更换主题?
A:下载主题到themes文件夹,在_config.yml中修改theme字段,然后执行hexo clean && hexo generate重新生成。
Q:如何添加评论系统?
A:可以使用Gitalk、Valine等评论系统,在主题配置文件中添加相关配置即可。
Q:如何自定义域名?
A:在仓库根目录创建CNAME文件,写入你的域名,然后在域名服务商处添加CNAME记录指向你的用户名.github.io。
Q:文章如何分类和标签?
A:在文章头部添加:
1 |
|
Q:数学公式不显示怎么办?
A:确保已安装KaTeX渲染器,检查主题配置中KaTeX是否启用,确认数学公式使用正确的分隔符($$或$)。
Q:渲染器更换后出现问题?
A:确保只安装一个Markdown渲染器,检查package.json中的依赖项,尝试清理缓存:hexo clean。
Q:GitHub Actions部署失败怎么办?
A:检查GitHub Actions日志,常见问题包括:Node.js版本不兼容、依赖安装失败、构建脚本错误。确保.github/workflows/pages.yml配置正确,package.json中有正确的构建脚本。
Q:如何从传统部署方式迁移到GitHub Actions?
A:1. 创建.github/workflows/pages.yml文件;2. 确保package.json有构建脚本;3. 在GitHub仓库设置中启用GitHub Actions作为Pages源;4. 删除_config.yml中的deploy配置;5. 推送代码触发自动部署。
Q:GitHub Actions方案需要本地安装Hexo吗?
A:不需要。GitHub Actions会在云端自动安装依赖并构建,你只需要推送Markdown文件即可。但建议本地安装用于预览和测试。
Q:如何添加图片到文章中?
A:1. 将图片放入source/images/目录;2. 在文章中使用引用;3. 确保路径正确,建议使用相对路径。
Q:修改主题后网站没有变化怎么办?
A:这取决于你修改了什么:
- 修改主题配置文件:执行
hexo clean && hexo generate && hexo server - 修改主题源文件(如Stylus、SCSS等):需要先构建主题。对于Ayer主题,执行:
1
cd themes/ayer && npm run build && cd ../.. && hexo clean && hexo generate && hexo server
- 仍然无效:尝试强制刷新浏览器(Ctrl+F5)或清理主题构建缓存。详见"主题修改后的操作"章节。
Q:如何创建关于页面、友链页面等?
A:使用hexo new page "页面名"创建,然后在主题配置中添加菜单项。页面文件位于source/页面名/index.md。
Q:如何添加搜索功能?
A:安装搜索插件:npm install hexo-generator-search --save,然后在_config.yml中配置搜索选项。
Q:文章中的代码高亮不显示怎么办?
A:1. 确保代码块使用正确的语法:```语言名;2. 安装代码高亮插件;3. 检查主题是否支持代码高亮;4. 清理缓存重新生成。
Q:如何备份博客内容?
A:如果使用GitHub Actions方案,整个项目都在GitHub上,天然有版本控制。也可以定期导出source/_posts/目录备份文章。
Q:如何更换博客主题?
A:1. 下载新主题到themes/目录;2. 修改_config.yml中的theme字段;3. 配置新主题的配置文件;4. 执行hexo clean && hexo generate。
Q:本地预览正常但部署后有问题怎么办?
A:1. 检查GitHub Actions日志;2. 确保所有依赖都正确安装;3. 检查文件路径是否正确;4. 清理缓存重新部署。
Q:如何添加评论系统?
A:根据主题选择评论系统(如Gitalk、Valine、Disqus等),在主题配置文件中添加相关配置。大多数主题都支持多种评论系统。