用 Hexo + Butterfly 搭建个人博客(完整教程)
这篇文章记录我从零开始,在阿里云轻量服务器上用 Hexo + Butterfly 主题搭建个人博客的完整过程,包括踩过的几个大坑。如果你也想搭一个同款博客,照着做就行。
为什么选 Hexo + Butterfly
- Hexo:基于 Node.js 的静态博客生成器,生成纯静态页面,速度快、安全(无数据库)、可托管在任何静态服务器。
- Butterfly:Hexo 最流行的中文博客主题之一,外观现代、功能齐全(分类、标签、搜索、侧边栏、评论、暗黑模式等)。
我参照的博客 linzyblog.netlify.app 就是 Hexo + Butterfly,效果很专业,所以决定照着搭一个。
一、准备:服务器和环境
- 一台云服务器(我用阿里云轻量应用服务器,系统 Alibaba Cloud Linux 3)
- 一个域名(已解析到服务器 IP)
- 服务器上装有 nginx(我用宝塔面板管理)
二、安装 Node.js
Hexo 需要 Node.js。国内服务器直接从官方源下载很慢,用 npmmirror 国内镜像:
1 | cd /usr/local |
把 npm 源也换成国内镜像,后面装包快很多:
1 | npm config set registry https://registry.npmmirror.com |
三、安装 Hexo 和 Butterfly
1 | mkdir -p /www/wwwroot/hexo-blog/source/_posts |
写一个 package.json,把 Hexo、Butterfly 主题和必要的渲染器都列上:
1 | { |
然后 npm install。注意 GitHub 在国内访问不通,所以主题和插件都走 npm 镜像,而不是 git clone。
四、配置
_config.yml(Hexo 主配置)关键项:
1 | title: 我的博客 |
_config.butterfly.yml(主题配置)覆盖导航、配色、侧边栏:
1 | menu: |
别忘了创建标签页和分类页(否则点进去 403):
1 | hexo new page tags # 在 source/tags/index.md 加 type: tags |
五、一个大坑:hexo generate 不工作
装完直接 hexo generate,结果只打印了一段帮助信息,一个文件都没生成。
排查发现:Hexo 加载配置的源码里有一行
1 | if (!ctx.env.init) return; // env.init 不为 true 就跳过加载配置 |
这个 env.init 标志正常由 hexo-cli 设置,但全局装的 hexo-cli 没设它,导致 Hexo 根本没读 _config.yml(主题还停留在默认的 landscape,文章识别为 0 篇)。
解决办法:写一个生成脚本 build.sh,用 Node 直接调 Hexo API 并手动设 env.init:
1 |
|
之后再执行 ./build.sh,就能正常生成 30 多个静态文件了。
六、部署:nginx 托管静态文件
Hexo 生成的静态文件在 public/ 目录,让 nginx 直接托管:
1 | server { |
nginx -s reload 后,域名访问就是博客了。HTTPS 直接复用之前申请的证书。
七、又一个坑:首页白屏(FontAwesome)
上线后发现首页偶尔一片空白。排查发现:Butterfly 默认从 cdn.jsdelivr.net 加载 FontAwesome 图标的 CSS,而 jsdelivr 在国内访问不稳定,这个 CSS 又是渲染阻塞的——加载超时,浏览器就一直白屏。
解决办法:把 FontAwesome 本地化。下载到 source/lib/font-awesome/,然后改主题模板 head.pug:
1 | - link(rel='stylesheet', href=url_for(theme.asset.fontawesome)) |
从此不再依赖外部 CDN,白屏问题消失。
八、写文章
文章是 source/_posts/ 下的 Markdown 文件,带 frontmatter:
1 | --- |
写完执行 ./build.sh 重新生成,刷新博客就能看到新文章。
后台可以接一个 Markdown 编辑器(带实时预览和工具栏):标题/标签/分类用表单填,正文直接写 Markdown 即可。注意别用纯富文本编辑器——它会存成 HTML、破坏 Markdown 格式。
总结
最终效果:一个外观专业、加载飞快、全站 HTTPS 的个人博客。整个过程踩了两个大坑(hexo 的 env.init、jsdelivr 白屏),但都解决了。
如果你也准备搭,记住两点:
- 国内服务器:Node/Hexo/主题用 npmmirror 镜像,别依赖 GitHub。
- 静态博客的 CDN:图标/字体尽量本地化,别用 jsdelivr 这种国内不稳的 CDN。
祝你也能拥有自己的博客
