news 2026/10/15 1:35:44

Hexo静态博客搭建与GitHub Pages部署实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hexo静态博客搭建与GitHub Pages部署实战指南

1. 为什么我最终选了 Hexo 而不是其他静态博客方案

1.1 从一次博客迁移说起

三年前我把自己写了两年多的博客从动态系统迁到了静态站点,当时对比过 Hexo、Hugo、Jekyll 这几个主流方案。最后选 Hexo 的原因很朴素:它是我试过的方案里,对前端基础一般的人最友好的一个。Hugo 构建速度确实快得离谱,几千篇文章几秒就编译完,但它的模板语法对没写过 Go template 的人来说上手曲线偏陡;Jekyll 是 GitHub Pages 原生支持的,省事,但本地预览依赖 Ruby 环境,在 Windows 上装依赖经常出各种莫名其妙的编译错误,我身边至少有三个朋友卡在native extension报错那一步就放弃了。

Hexo 基于 Node.js,只要你机器上有 Node 环境,npm install一把梭基本就能跑起来。它的主题生态也成熟,主流的几套主题文档齐全、配置项清晰,改起来不用啃源码。对于“我就想安安静静写文章,不想折腾构建工具”的人来说,这个平衡点找得很准。

1.2 静态博客到底解决了什么问题

先说清楚静态博客和动态博客的本质区别,不然后面很多设计选择你会看不懂。

动态博客(比如各种带后台的 CMS)每次有人访问,服务器都要查数据库、渲染页面、拼 HTML 再返回。好处是发文章点几下后台就行,坏处是服务器得一直开着,有数据库就有被拖库的风险,访问量一上来还得考虑缓存、负载均衡这些破事。

静态博客反过来:文章在本地写成 Markdown,构建工具一次性把所有页面渲染成纯 HTML 文件,部署上去之后服务器只管发文件,不查库、不渲染。带来的直接好处是:

  • 快:纯静态文件,CDN 一挂,全球访问都是毫秒级。
  • 安全:没有数据库、没有后台登录入口,攻击面几乎为零。
  • 便宜甚至免费:托管在 GitHub Pages 这类服务上,一分钱不花。
  • 版本可控:文章就是本地的一堆 Markdown 文件,配合 Git 管理,改错了随时回滚。

代价也很明确:没有在线编辑器,发文章得在本地写完再构建部署;评论、搜索这些动态功能需要借助第三方服务。对我来说这些代价完全可以接受,写作本来就是我一个人在本地完成的事。

1.3 Hexo 的工作流长什么样

理解 Hexo 的工作流,后面所有操作你都能对上号。它大概分这么几步:

  1. 你在source/_posts/目录下写 Markdown 文章,文件头部带上 front-matter(标题、日期、标签这些元信息)。
  2. 执行hexo generate,Hexo 读取所有文章和配置,套用主题模板,在public/目录生成完整的静态站点。
  3. 执行hexo deploy,把public/里的内容推送到你配置的托管平台,比如 GitHub Pages。
  4. 访客访问你的域名,拿到的是托管平台上的静态 HTML。

整个链路里,Hexo 只负责“本地生成”这一段,托管是 GitHub Pages 的事,两者通过 deploy 配置衔接。搞清楚这个分工,后面遇到“为什么部署上去没更新”“为什么样式丢了”这类问题,排查方向就清晰了。

2. 环境准备与 Hexo 初始化实操

2.1 Node.js 与 Git 的安装要点

Hexo 跑在 Node.js 上,所以第一步是装 Node。去 Node 官网下 LTS(长期支持)版本就行,别追最新的 Current 版,LTS 稳定,第三方依赖兼容性也更好。装完之后在终端敲:

node -v npm -v

两条命令都能正常输出版本号,说明环境没问题。这里有个坑要提醒:Windows 用户如果之前装过旧版本 Node,最好先卸载干净再装新的,否则可能出现npm命令找不到或者版本错乱的情况。

Git 也是必须的,因为部署环节要靠它把文件推到 GitHub。装完 Git 后配置一下全局身份:

git config --global user.name "你的用户名" git config --global user.email "你的邮箱"

这个身份信息会记录在每次提交里,建议和后面 GitHub 账号用的邮箱保持一致,不然提交记录里显示的作者会对不上。

提示:国内网络环境下npm install有时会很慢,可以临时切换到国内镜像源加速,装完再切回来。命令是npm config set registry https://registry.npmmirror.com,恢复默认用npm config set registry https://registry.npmjs.org。

2.2 安装 Hexo 脚手架并建站

Hexo 的命令行工具建议全局安装:

npm install -g hexo-cli

装完之后找个你想放博客的目录,执行初始化:

hexo init my-blog cd my-blog npm install

hexo init会拉取一套默认的站点骨架,包括配置文件_config.yml、文章目录source/_posts、默认主题landscape等等。紧接着的npm install是安装站点运行所需的依赖,这一步千万别跳过,很多人初始化完直接hexo s报错,就是因为依赖没装。

初始化完成后目录结构大致是这样:

目录/文件作用
_config.yml站点全局配置,标题、作者、部署方式都在这
source/_posts存放 Markdown 文章
source除文章外的静态资源,如图片、关于页
themes主题目录
public构建产物,部署时推送的就是它
scaffolds新建文章的模板

2.3 本地预览与第一篇测试文章

先跑起来看看效果:

hexo server

默认监听http://localhost:4000,浏览器打开就能看到默认主题的首页。这个命令支持热更新,你改了文章或配置,刷新页面基本就能看到变化,写文章时开着它很方便。

新建一篇文章:

hexo new "我的第一篇博客"

Hexo 会在source/_posts下生成一个同名 Markdown 文件,打开它你会看到顶部的 front-matter:

--- title: 我的第一篇博客 date: 2024-01-01 10:00:00 tags: ---

title和date是自动填的,tags可以自己加。正文就用 Markdown 写,写完保存,hexo server那边刷新就能看到。

注意:文章文件名建议用英文或拼音,中文文件名在某些主题和部署环境下可能出现 URL 编码问题,导致链接打不开。标题写在 front-matter 里用中文完全没问题。

3. 站点配置与主题定制

3.1_config.yml里必须改的几个地方

默认配置能用,但有几项不改会显得很“模板化”。打开根目录的_config.yml,重点看这几项:

title: 我的博客 subtitle: 记录与分享 description: 一个普通人的技术笔记 author: 你的名字 language: zh-CN timezone: Asia/Shanghai

language一定要设成zh-CN,否则主题里的“”“上一篇”这些文案会显示成英文。timezone设成你所在时区,不然文章日期可能差几个小时。

还有一项容易被忽略的是url:

url: https://你的用户名.github.io

这个地址要和你最终部署的地址一致,因为 Hexo 生成页面时会用它来拼绝对路径。如果这里填错,部署后可能出现 CSS、图片加载不出来的情况——因为浏览器去错误的域名找资源了。

3.2 换一套顺眼的主题

默认的 landscape 主题比较朴素,大多数人会换。Hexo 主题的安装方式通常是进themes目录克隆:

cd themes git clone <主题仓库地址>

然后在根目录_config.yml里把theme字段改成主题文件夹的名字:

theme: 主题文件夹名

这里有个关键点:主题的配置和站点的配置是分开的。站点配置在根目录_config.yml,主题配置在themes/主题名/_config.yml。很多人改主题配置时改错了文件,改半天没反应,就是这个问题。改主题配置前,建议先把主题自带的_config.yml复制一份备份,或者按主题文档的说明创建一份独立的配置文件,这样以后升级主题不会把你的配置覆盖掉。

3.3 主题配置里值得花时间调的项

以主流主题的通用配置为例,这几项调完博客的观感会提升一大截:

  • 导航菜单:把“首页、归档、标签、关于”这些入口配好,读者能快速找到内容。
  • 社交链接:填上你的 GitHub、邮箱等,方便别人联系你。
  • 代码高亮:选一个配色舒服的高亮方案,技术博客里代码块的可读性很重要。
  • 字数统计与阅读时长:开启后文章顶部会显示“本文共 X 字,预计阅读 X 分钟”,对读者很友好。
  • 评论系统:静态博客本身没有评论,需要接第三方。选之前先确认该服务在你目标读者所在地区能正常加载。

实操心得:主题配置项很多,别想着一次全调完。我的做法是先只改导航和社交链接,把博客跑通部署上线,之后再慢慢按需调。一次性改太多,出了问题很难定位是哪个配置项引起的。

4. 部署到 GitHub Pages 的完整流程

4.1 创建仓库与命名规则

登录 GitHub,新建一个仓库。这里有个必须遵守的命名规则:如果你想用用户名.github.io这个免费域名,仓库名必须严格是你的用户名.github.io,一个字都不能差。比如用户名是zhangsan,仓库名就得是zhangsan.github.io。

如果你不打算用这个默认域名,而是想用自定义域名,那仓库名可以随便起,比如blog。但为了省事,我建议直接用用户名.github.io这个方案,零配置就能访问。

仓库创建时选 Public(公开),因为 GitHub Pages 的免费托管对私有仓库的支持有限制。博客本来就是给人看的,公开也无所谓。

4.2 安装部署插件

Hexo 默认不带 Git 部署能力,需要装一个插件:

npm install hexo-deployer-git --save

这个插件的作用是让hexo deploy命令能把public目录的内容通过 Git 推送到指定仓库。装完之后,在根目录_config.yml末尾配置部署信息:

deploy: type: git repo: https://github.com/你的用户名/你的用户名.github.io.git branch: main

branch这一项要注意:GitHub 现在默认分支是main,但有些老教程写的是master。你得去仓库页面确认一下你的默认分支到底叫什么,填错了会推送失败或者推上去不生效。

4.3 一键部署与验证

配置好之后,标准的三连命令是:

hexo clean hexo generate hexo deploy

hexo clean清掉之前的构建缓存,hexo generate重新生成静态文件,hexo deploy推送。这三步可以合并成一条:

hexo clean && hexo g && hexo d

g是generate的缩写,d是deploy的缩写,Hexo 的命令都支持简写。

推送过程中会要求你输入 GitHub 的用户名和密码。注意:GitHub 早就不能用账号密码做 Git 操作了,这里密码要填Personal Access Token(个人访问令牌),不是你的登录密码。令牌在 GitHub 设置的开发者选项里生成,生成时勾选repo权限即可。

部署成功后,等一两分钟,访问https://你的用户名.github.io,应该就能看到你的博客了。第一次部署后 GitHub 需要一点时间构建 Pages,如果立刻访问是 404,别慌,等几分钟再刷新。

4.4 部署流程的自动化思路

每次发文章都要手动敲三条命令,时间长了会烦。有两个优化方向:

一是把命令写成一个脚本文件,比如deploy.sh,内容就是那三行,以后双击或执行脚本就行。Windows 用户可以写个.bat文件。

二是用 GitHub Actions 做持续集成:你把 Hexo 源码推到一个仓库,Actions 自动构建并把public推到 Pages 仓库。这样你只需要git push源码,剩下的全自动。不过这套配置对新手来说有点绕,建议先把手动部署跑熟,理解每个环节在干什么,再上自动化。

5. 常见问题排查与避坑经验

5.1 部署后页面 404 或样式丢失

这是最高频的问题,原因通常集中在两处。

页面 404:先确认仓库名是不是严格等于用户名.github.io,再确认_config.yml里的url和实际访问地址一致。如果仓库名是blog这种非默认名,访问地址会变成用户名.github.io/blog,此时url和root配置都要相应调整,否则路径全错。

样式丢失:八成是url配置和实际域名对不上,导致 CSS 的绝对路径指向了错误的地方。改完url后记得hexo clean再重新构建,因为旧的路径信息可能被缓存了。

5.2 部署报错与推送失败

报错现象可能原因解决方向
Permission denied令牌权限不足或过期重新生成令牌,勾选 repo 权限
failed to push远程仓库有本地没有的提交先git pull合并再推
deployer not found部署插件没装重装hexo-deployer-git
推送成功但页面没变分支填错或缓存确认分支名,清浏览器缓存

避坑技巧:部署前养成hexo clean的习惯。我有一次改了主题配置,部署上去死活不生效,折腾半小时才发现是构建缓存没清,旧文件被推上去了。从那以后clean就成了我的肌肉记忆。

5.3 图片显示不出来

Markdown 里插图片,路径写法很关键。Hexo 默认的资源处理方式下,图片放在source/images/目录,文章里用/images/图片名.jpg这种以斜杠开头的绝对路径引用最稳。用相对路径容易因为文章 URL 结构变化而失效。

如果你想让每篇文章的图片和文章放一起管理,可以在站点配置里开启post_asset_folder: true,这样hexo new时会同时生成一个同名文件夹,图片放进去用相对路径引用即可。但这个功能需要配合特定语法或插件,用之前先看主题文档是否支持。

5.4 写作与维护的长期习惯

最后分享几个我坚持了很久的习惯,能让博客长期维护下去不那么累。

用 Git 管理源码:Hexo 的源码(不含public和node_modules)建议单独建一个仓库管理。这样换电脑时git clone下来npm install就能继续写,文章历史也有完整记录。记得写个.gitignore把node_modules、public、.deploy_git排除掉。

文章命名规范化:文件名用日期加英文短标题,比如2024-01-01-hexo-deploy.md,排序清晰,URL 也干净。

定期备份主题配置:主题升级时配置文件容易被覆盖,把改过的主题配置单独存一份,升级后对照着恢复,能省很多事。

别追求完美再发布:我见过太多人卡在“主题还没调好”“域名还没买”上,结果一篇文章都没发出去。先把内容写出来、部署上线,样式和域名这些都可以后面慢慢优化。博客的核心价值永远是内容,不是主题有多花哨。

这套流程我从第一次搭建到现在,帮朋友复现过不下十次,每次卡壳的地方基本都在上面列的这些点里。把环境装对、配置改准、部署命令跑通,剩下的就是持续写。工具只是载体,真正让博客活起来的是你愿意往里放的东西。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 1:35:15

基于51单片机的GSM智能快递柜设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 1:35:12

FT245BL USB FIFO驱动安装与高速通信实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 1:35:10

Verilog Task与Function全解析:语法差异、系统任务与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 1:35:05

深度学习主机配置指南:从负载画像到硬件选型与避坑实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 1:34:34

Java ArrayList详解:动态数组原理、扩容机制与学生管理系统实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/15 1:33:59

Java生日祝福程序实战:从控制台到可交互命令行工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华