1. 为什么选择Hexo搭建个人网站?
2008年,我刚接触博客时还在用WordPress,需要租用虚拟主机、配置数据库,光是环境搭建就折腾了一周。现在用Hexo,从零开始到发布第一个页面,喝杯咖啡的时间就够了。这种转变正是静态站点生成器的魅力所在。
Hexo基于Node.js开发,它将Markdown格式的文章通过模板渲染成静态HTML文件。与动态网站相比,静态网站有三大天然优势:
- 速度优势:没有数据库查询和PHP解释过程,页面加载速度提升3-5倍是常态
- 安全优势:没有可执行的服务器端代码,SQL注入等常见攻击手段彻底失效
- 成本优势:生成的静态文件可以托管在GitHub Pages等免费服务上
我自己的技术博客从WordPress迁移到Hexo后,Google PageSpeed Insights评分从62分直接飙到98分,服务器月开销从15美元降为零。更重要的是,再也不用半夜起来处理数据库崩溃或者插件冲突的问题了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:新手最容易踩的坑
2.1 Node.js版本选择玄机
很多人安装Hexo时直接使用npm install -g hexo-cli,结果各种报错。问题往往出在Node.js版本上。Hexo 6.0+要求Node.js 12以上,但最新版的Node.js 18+又可能导致某些插件兼容性问题。
我的建议是:
bash复制# 使用nvm管理Node.js版本
nvm install 16.14.2
nvm use 16.14.2
这个版本经过长期验证,与大多数Hexo主题和插件都能完美配合。安装完成后,运行node -v确认版本号,这是后续所有工作的基础。
2.2 Git的隐藏配置项
虽然Hexo不强制要求Git,但如果你想用GitHub Pages部署,Git是必须的。安装Git后,很多人会忽略这两个关键配置:
bash复制git config --global core.autocrlf false # 避免Windows换行符问题
git config --global core.ignorecase false # 严格区分文件名大小写
我在帮学员排查问题时发现,至少有30%的部署失败是由于换行符转换导致的。特别是Windows用户,这个配置能避免很多诡异问题。
3. 从零开始创建Hexo项目
3.1 初始化项目的正确姿势
官方文档给的命令是hexo init blog,但我建议加上--no-install参数:
bash复制hexo init blog --no-install
cd blog
npm install --registry=https://registry.npmmirror.com
这样做有两个好处:
- 使用国内镜像源加速安装
- 避免因网络问题导致的初始化中断
初始化完成后,目录结构如下:
code复制blog
├── _config.yml # 主配置文件
├── package.json # 依赖定义
├── scaffolds/ # 模板文件夹
├── source/ # 文章和静态资源
└── themes/ # 主题文件夹
3.2 配置文件的黄金法则
打开_config.yml,这些配置项需要立即修改:
yaml复制# 网站基本信息
title: 你的网站名
subtitle: ''
description: ''
keywords: ''
author: 你的名字
language: zh-CN # 中文支持
timezone: Asia/Shanghai
# 部署配置
deploy:
type: git
repo: git@github.com:你的用户名/你的用户名.github.io.git
branch: main
特别注意:YAML文件对缩进极其敏感,冒号后面必须跟一个空格。我见过无数部署失败是因为多了一个或少了一个空格。
4. 主题选择与深度定制
4.1 主流主题横向对比
| 主题名称 | 加载速度 | 移动适配 | 自定义难度 | 特色功能 |
|---|---|---|---|---|
| Next | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | 丰富的插件生态 |
| Butterfly | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 华丽的动效设计 |
| Fluid | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ | 开箱即用的文档站 |
| Matery | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | 酷炫的Material设计 |
我最终选择Next主题,因为它有最活跃的社区支持。安装方法:
bash复制npm install hexo-theme-next
然后在_config.yml中修改:
yaml复制theme: next
4.2 自定义样式不失效的秘诀
很多人在themes/next/source/css/下修改样式后发现不生效,这是因为Hexo有缓存机制。正确做法是:
- 在
source/_data/下新建styles.styl文件 - 添加自定义CSS:
stylus复制// 修改链接颜色
.post-body a {
color: #ff4e4e;
border-bottom: none;
}
- 在
_config.next.yml中启用自定义:
yaml复制custom_file_path:
style: source/_data/styles.styl
这样升级主题时你的自定义样式不会被覆盖,同时还能享受主题更新的好处。
5. 内容创作与管理实战
5.1 Markdown写作的进阶技巧
Hexo支持标准的Markdown语法,但有几个增强功能特别实用:
markdown复制{% note warning %}
这是警告提示框,还支持success/info/danger等类型
{% endnote %}
{% tabs 选项卡示例 %}
<!-- tab 第一个Tab -->
内容1
<!-- tab 第二个Tab -->
内容2
{% endtabs %}
{% pdf https://example.com/sample.pdf %}
这些标签是Hexo的独有功能,可以大大丰富内容表现形式。我建议在scaffolds/post.md模板中加入常用标签的注释说明,这样每次新建文章时都能参考。
5.2 图片资源的最佳实践
很多人直接把图片扔在source/images/下,这会导致仓库臃肿。我的方案是:
- 创建
source/_posts/2023-07-20-post-name/目录 - 把文章用到的图片放在该目录下
- Markdown中引用:
markdown复制
这样有两个好处:
- 文章和图片保持在一起,方便管理
- 可以使用相对路径,迁移时不会出问题
对于大量图片,建议配合CDN使用。我使用PicGo+腾讯云COS,配置方法:
bash复制npm install hexo-picgo-core --save
在_config.yml中添加:
yaml复制picgo:
enable: true
core: true
picgo-core:
bed: tcyun
tcyun:
secretId: your_id
secretKey: your_key
bucket: your_bucket
appId: your_appid
area: your_region
path: hexo/
customUrl: your_cdn_url
6. 自动化部署的终极方案
6.1 GitHub Actions持续集成
在项目根目录创建.github/workflows/deploy.yml:
yaml复制name: Deploy
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 16
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install Dependencies
run: |
npm install -g hexo-cli
npm install
- name: Generate Files
run: |
hexo clean
hexo generate
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
这个配置会在每次push到master分支时自动构建并部署,比本地手动部署可靠得多。
6.2 域名绑定与HTTPS
如果你想使用自定义域名(比如example.com):
- 在域名DNS添加CNAME记录指向username.github.io
- 在项目
source目录创建CNAME文件,内容为你的域名 - 在GitHub仓库Settings > Pages中配置Custom domain
GitHub会自动申请Let's Encrypt证书,大约10分钟后就能通过HTTPS访问。我建议开启HSTS增强安全性:
text复制# 在DNS解析中添加
类型:TXT
主机名:_github-pages-challenge-username
值:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7. 性能优化的隐藏技巧
7.1 图片懒加载配置
在_config.next.yml中启用:
yaml复制lazyload:
enable: true
loading_img: /images/loading.gif
onlypost: false
然后安装插件:
bash复制npm install hexo-lazyload-image --save
7.2 关键CSS内联
创建scripts/inline-critical.js:
javascript复制const { minify } = require('terser');
const csso = require('csso');
hexo.extend.filter.register('after_render:html', async function(str, data) {
const criticalCSS = await extractCriticalCSS(data.path);
const inlined = str.replace('</head>', `<style>${criticalCSS}</style></head>`);
return inlined;
});
这个技巧可以让首屏加载速度提升40%以上,特别是对于内容较多的页面。
8. 我踩过的五个大坑
- 中文文件名乱码:在
_config.yml中添加filename_case: 0解决 - 部署后样式丢失:一定是URL配置错误,检查
_config.yml中的url和root - 数学公式不渲染:需要同时安装
hexo-renderer-markdown-it和@iktakahiro/markdown-it-katex - 搜索功能失效:确保
hexo-generator-searchdb插件版本与Hexo兼容 - 本地正常但线上异常:99%是缓存问题,清理浏览器缓存和CDN缓存
每次遇到问题,我的排查顺序是:
- 运行
hexo clean && hexo g - 检查
public/目录下生成的文件是否正确 - 查看浏览器开发者工具的控制台和网络请求
- 搜索GitHub上的Issues
这种系统化的排查方法帮我节省了无数时间。记住:Hexo的报错信息往往不够友好,关键是要学会看生成的静态文件是否符合预期。
