从 Hexo 到 Hugo
文章目录
【注意】最后更新于 March 28, 2021,文中内容可能已过时,请谨慎使用。
该博客的前身是自 2018 年 12 月搭建的 hexo 博客,于 2020 年 2 月搬迁至 hugo。
Motivation
这次搬迁最直接的原因,是我把 hexo 博客从 Windows 搬到 Linux 失败了..
之前魔改太多,主题里各种文件都改过,甚至 node_modules 里面都被我改过很多地方,之前因此都放弃升级 hexo 和 NexT 主题,而最近开始主用 Manjaro,于是博客必须得搬到 Linux 上,但无论是简单复制过来还是重新使用 npm 安装包都未能如愿。
其实说不定还有很多解决方法,但我之前就听说过 hugo,于是就决定干脆搬过来好了。
但为什么是搬到 hugo,而不是升级 hexo 呢?
从 hugo 本身来说,它最显著的优点,就是快:
- 安装快。这在本地安装时倒影响不大,
而且如果你要修改主题还得用 yarn 安装包,得装上几分钟(只在某些主题需要,如果无需压缩/使用 hugo 而非 node 进行压缩就不需要)。最主要的是,安装快使得 CI 快,使用 CI 发布 hugo 博客就会非常容易且快捷。 - 构建快。hugo 比起 hexo 的构建速度不是快了一点点,hexo 需要几十秒才能构建完的博客,hugo 只需不到一秒。这点更加重要,它不仅加速了 CI,而且本地构建几乎没有延时,加上 server 预览使用 websocket,直接分屏当预览写博客体验良好。
但弊端也同样明显:没有插件,导致很多功能得自己写,或者复制别人的代码。只不过对于 hexo 都能改到 node_modules 里面的魔改玩家来说,这都不算什么(
只不过我一直用的是 2018 年 12 月那时的 hexo 和 NexT,这一年来 hexo 可能也有很多改进,所以我的比较不一定准确。
Process
hugo 的配置步骤就不说了,网上很多教程,而且这个博客是 开源 的,可以自己看。
本博客使用 GitHub Actions 进行自动发布,详见 配置文件。PERSONAL_TOKEN
需要在 repo 的 settings 里设置,但如果源码和博客在同一个 repo 里就可以直接用 GITHUB_TOKEN
了。
从 hexo 搬到 hugo 可以参考这篇博客:Hugo 与 Hexo 的异同 | reuixiy 。
我自己使用的脚本(fork 然后稍微改了一点):ouuan/hexo2hugo 。
hugo 还支持 aliases,所以链接改动可以轻松处理。
如果对我博客的配置感兴趣,还可以参考 config.toml 和 even 主题 的历史记录。
几个值得提醒的地方:(大约是我认为“已经完全搞好了!”之后遇到的问题,也就是你按网上的教程搞完之后仍然容易遇到的问题)
站内搜索
可以参考 1d0901f,如果主题不是 even 的话我这个应该就不太能直接用了,得改一下 layout/_default/search.html
还有 static/js/search.js
中的 render
函数。
代码高亮
推荐使用 highlight.js 而不是 chroma。even 主题把 highlight.js 的 CSS 放到了自己的 _code.scss
里,所以光是加上一个 highlight.js 的 CSS 是不够的,还得在 _code.scss
里把 hljs 相关的删掉,如果是 dark theme 还得修改背景颜色。
代码复制按钮
可以参考 8347acf。全靠搜索引擎学来的 CSS 果然不够..就这么点东西我搞了四个小时,主要是滚动条、字体大小、行高、padding 之类杂七杂八的问题。
GitInfo with Unicode
如果路径有中文,想用 GitInfo 的话就得 git config --global core.quotePath false
,参见 gohugoio/hugo#3071 。
Table Of Content with h1
默认情况下右侧目录是从 <h2>
开始的,如果你的文章中含有 <h1>
(也就是 Markdown 中的单个 #
),目录就会挂掉。在文章中使用 <h1>
是 不被推荐 的,但我自己一年前写的一些博客里有 <h1>
,虽然批量修改也不难,但还有一种解决方案:在 config.toml
中加入:
[markup.tableOfContents]
startLevel = 1
endLevel = 4
这样从 <h1>
到 <h4>
都会在目录中显示。
HTML in links
例如:[~~qwq~~](/post/from-hexo-to-hugo)
, [![favicon](/favicon.ico)](/favicon.ico)
。
默认情况下会渲染成这样:
<img src="/favicon.ico" alt=“favicon”>
可以将 /layouts/_default/_markup/render-link.html
设成这样:(这个板子还包含了外链打开新标签页,不被渲染成 HTML 源码的关键在于 safeHTML
)
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank"{{ end }}>{{ safeHTML .Text }}</a>
然后就好了:
Baidu push
大家知道,百度收录个人博客是很慢的。
于是我用了 黑魔法 GitHub Actions 每天自动推送,详见 配置文件。(需要先在 百度搜索资源平台 上进行一些设置,TOKEN 可以在“链接提交”页面找到。)
Comments loading spinner
见 commit。
Issues
因为是用脚本批量改的,改完之后也没有一篇篇去检查,难免会有改错的地方以及一些死链,可以直接在评论区指出,多谢大家了。
如果有原博客链接没有 redirect 而是 404 了,也请务必告诉我。
如果需要原 hexo 博客的,可以看 ouuan.github.io/hexo-archive 。
评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue 。