基于 Hexo 和 NexT 主题搭建博客
Hexo
Hexo 是一个博客框架,它使用 Markdown 解析文章并生成静态网页。
通过 Hexo 官方网站进行安装与配置。安装完 Node.js 后,使用命令行完成 Hexo 的安装。
NexT
NexT 是一个主题,可以运行在 Hexo 搭建的博客上。
通过 NexT 官方网站 进行与 Hexo 的配置。
推荐使用 node_modules 方式安装,而非下载至 theme 文件夹中。
写作
使用图床
选择 Imgur 进行图片托管。Imgur 内置支持六种不同尺寸的图片。例如,若原图地址为 https://i.imgur.com/test.jpg,则六种尺寸的对应地址为:
- Huge Thumbnail 1024x1024:
https://i.imgur.com/testh.jpg - Large Thumbnail 640x640:
https://i.imgur.com/testl.jpg - Medium Thumbnail 320x320:
https://i.imgur.com/testm.jpg - Small Thumbnail 160x160:
https://i.imgur.com/testt.jpg - Big Square 160x160:
https://i.imgur.com/testb.jpg - Small Square 90x90:
https://i.imgur.com/tests.jpg
⚠️ 注意:后两个方形选项会对图片进行裁剪以符合尺寸,而非保持原始比例。
使用 Note、Tabs、Label 等标签
具体用法参见 NexT 主题的标签插件文档。
各种标签的全局配置位于 _config.next.yml 文件中。
功能添加
文章字数统计与阅读时长
安装插件 hexo-symbols-count-time,并根据其文档修改 _config.yml 和 _config.next.yml 文件。
站内搜索
安装插件 hexo-generator-searchdb,并根据其文档修改 _config.yml 和 _config.next.yml 文件。
Emoji 支持
安装插件 hexo-filter-github-emojis,并根据其文档修改 _config.yml 文件。
使用语法为 :smile:
RSS 订阅支持
安装插件 hexo-generator-feed,修改 _config.yml 文件,并在 NexT 主题设置中开启 RSS 图标。
外链优化
为所有外部链接自动添加 rel="nofollow" 属性,有助于 SEO。
安装插件 hexo-filter-nofollow,并修改 _config.yml 文件。
死链检查
安装插件 hexo-broken-links-checker,并修改 _config.yml 文件。
网页压缩
压缩 HTML、CSS、JS 和图片文件,以提升网页加载速度。
安装插件 hexo-neat,并修改 _config.yml 文件。
评论功能
集成 Utterances 评论系统(基于 GitHub Issues)。在 _config.next.yml 文件中进行配置。
打赏
在 next/source/images 目录下添加 alipay.png 和 wechatpay.png 二维码图片,并修改 _config.next.yml 文件:
| |
也可以添加自定义打赏方式,例如:
| |
集成搜索引擎与 Sitemap
登录 Google Search Console,添加博客网站。
在验证方法中选择
HTML 标签,复制验证代码中的content字符串,如下所示:1<meta name="google-site-verification" content="XXXXXXXXXXXXXXXXXXXXXXX" />将复制的
content字符串粘贴到_config.next.yml文件的google_site_verification字段。安装 Sitemap 生成插件 hexo-generator-sitemap 并修改
_config.yml。重新生成并部署网站,新的
sitemap.xml文件将会生成。将
sitemap.xml的路径提交至 Google Search Console。
备份与自动部署
安装 Git 部署插件:安装 hexo-deployer-git。使用 HTTPS 和 Personal Access Token 进行部署。
创建备份仓库:在 GitHub 上新建一个私有仓库,用于存放博客的源文件和配置文件(配置文件中包含私密信息)。
初始化本地仓库:在 Hexo 主目录下执行
git init,并创建.gitignore文件以排除无需版本控制的文件:1 2 3 4 5 6db.json *.log package-lock.json node_modules/ public/ .deploy*/生成 Personal Access Token:在 GitHub
Settings -> Developer settings -> Personal access tokens页面生成一个新的 Token。配置仓库 Secret:在用于部署的公开仓库中,导航至
Settings -> Secrets and variables -> Actions,添加上一步生成的 Token,并命名为HEXO_PUBLISH。创建 GitHub Action:在用于备份的私有仓库中,创建
.github/workflows/deploy.yml文件,内容如下:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38name: Hexo Deploy on: push: branches: master # 主分支名 jobs: build: runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2.1.5 with: node-version: '15.12.0' # 建议使用 LTS 版本 - name: Setup Environment run: | git config --global user.email "<Email>" git config --global user.name "<Username>" sudo apt-get install -y pandoc npm install -g hexo-cli npm install - name: Custom file copy run: | # 如果 NexT 主题通过 node_modules 安装,此步骤可用于覆盖默认模板文件 cp source/_data/post.njk_custom node_modules/hexo-theme-next/layout/_macro/post.njk - name: Hexo Deploy env: GITHUB_TOKEN: ${{ secrets.HEXO_PUBLISH }} run: | hexo clean hexo g -d触发部署:之后,只需将本地的源文件
push到 GitHub 的私有备份仓库,即可自动触发部署。
定期在本地更新 Hexo 插件及相关配置,并同步到备份仓库。
CSS 样式自定义
在 _config.next.yml 文件中启用自定义样式文件:custom_file_path.style: source/_data/styles.styl。
修改标题格式
| |
更改列表嵌套序号样式
| |
更改列表与段落间距
| |
更改图片与图注间距
| |
修改引用块样式
| |
常见问题解决
MathJax 渲染问题
更换 Hexo 渲染器为 Pandoc。首先根据官网指引安装 Pandoc,然后更换 Hexo 渲染器:
| |
MathJax 3 换行问题
MathJax 3. x 版本不再默认支持使用 \\ 进行自动换行(参见此 GitHub Issue)。
应遵守 LaTeX 规范的数学公式写法。请参考 AMS (American Mathematical Society) 的标准规范 来书写多行公式,例如使用 align 或 gather 环境。
仅在文章摘要中显示封面图片
若希望封面图片仅显示在摘要,而非文章开头,可进行如下配置:
修改
_config.next.yml:1excerpt_description: false修改主题模板文件
/[themes_folder]/next/layout/_macro/post.njk,q在{% if post.description and theme.excerpt_description %}与{% elif post.excerpt %}这两行之间,添加以下代码块:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22{% elif post.image %} <div class="out-img-topic"> <img src={{ post.image }} class="img-topic" /> </div> {% if post.excerpt %} {{ post.excerpt }} <!--noindex--> <div class="post-button text-center"> <a class="btn" href="{{ url_for(post.path) }}{% if theme.scroll_to_more %}#more{% endif %}" rel="contents"> {{ __('post.read_more') }} » </a> </div> <!--/noindex--> {% else %} <!--noindex--> <div class="post-button text-center"> <a class="btn" href="{{ url_for(post.path) }}"> {{ __('post.read_more') }} » </a> </div> <!--/noindex--> {% endif %}使用方法:在 Markdown 文章的 front matter 中增加
image: [image_path]。此时,摘要将显示这张图片,无需再手动添加截断符<!-- more -->。对于
node_modules安装方式:为避免更新主题时修改被覆盖,可将修改后的post.njk文件保存至source/_data/post.njk_custom。然后在 GitHub Action 的工作流中增加一个步骤,在部署时将此自定义文件复制到node_modules/hexo-theme-next/layout/_macro/目录下以覆盖原文件。
图注显示问题
在 _config.next.yml 中启用 fancybox 插件。插入图片时,使用 Markdown 的 alt 文本来指定图注:
| |
fancybox 会自动解析 alt 文本作为图注,并且有良好的渲染效果。图注在图片在放大后也会在下方显示。
关于图注与图片可能发生的重叠问题,参见更改图片与图注间距
iframe 或 PDF 无法加载
此问题通常是由于内嵌资源的 URL 使用了 http:// 协议。请确保所有内嵌资源的链接都使用安全的 https:// 协议。
避免 Nunjucks 语法冲突
Hexo 使用 Nunjucks 作为模板引擎,它会解析双大括号 {{ }}。如果在文章(尤其是在数学公式中)需要使用此语法,请使用模板标签将其包裹起来,以避免被错误解析。
其他可选插件
- 思维导图: hexo-markmap
- 时间线: hexo-tag-mdline
- 图表绘制 (Chart.js): hexo-tag-chart