
Hugo 博客主题 Somnia
Without further ado
最近也是更新了主题,Somnia。
缘起
最近也是更新了新主题。这原本是一个 Astro 主题,迁移过来了。样式现代,优雅而美观。
虽然很久没写博客了,但是零零碎碎的嘟嘟也不算少。而写在日记里的,随手记得笔记更多一些。不过没什么动力把这些东西写成博文。尤其是 AI 参与到我学习生活之中之后,我之前写的很多笔记,AI 随便一总结,比我记得都好。又详细又全面。还省事。那些零零碎碎的想法,AI 可以很轻松展开成一篇篇文章。
不过我还是换了主题。未来想写什么再说吧。先说说主题相关。
这次,我没有使用 Astro 而是搞成 Hugo 主题。
首先,Hugo 速度很快。以前我测试过上千篇文章,大概三秒就能构建完成了。
然后就是单二进制文件,没有额外依赖。我在 npm 生态踩过一些坑,比如以前使用 gitbook 的时候,比如想修改 Docute 但是没构建成功,以及前端项目层层依赖的或新或旧,或 beta 或 Deprecated 的库。在踩过这些坑之后,单独的二进制文件,几个布局文件,就显得十分可贵了。Hugo 让我有自信随便放几个月甚至几年后也可以轻松地捡起来运行博客。至少 Github Action 能跑通。
再就是 Astro 这个项目,某种程度看上去更偏向于商业建站。Astro 的主题,更像是模板。WordPress 可以一键更换主题,一键更新。Hexo Hugo 麻烦些,需要重新写配置,更新可以直接 git pull。而 Astro 更换一个主题也可以说是,把 content 文件夹移动到了新主题里。想实现什么功能,都可以自己写,或者 AI 写。
Astro 的优势,在于前端生态。用库很爽。各种优化工具,兼容工具用起来非常方便。组件化,模板化工程管理也很完善。这些都是非常加分的体验。这方面 Hugo 最近才更新了 css 打包功能,由此可以窥得一二。
Data has shown that 99% of use cases for all developer tooling are building unnecessarily complex personal blogs. Just kidding. But seriously, if you are trying to build a blog for personal or small business use, consider just using normal html and css. You definitely do not need to be using a heavy full-stack javascript framework to make a simple blog. You’ll thank yourself later when you return to make an update in a couple years and there haven’t been 10 breaking releases to all of your dependencies. 1
总的来说是一个权衡问题,我的需求是快递,简单,自然就是 Hugo 了。
Somnia
这个 Hugo 主题 Somnia 用的几个框架我之前就用过。原本项目是 UnoCSS 加上原生 js 写的。我加上了 Alpine.js 和 Swup.js 实现了页面平滑过渡。去年我试了 Alpine.js + HTMX 搞个主题,本来样式都写好了,但后来测试发现 HTMX 实在是不太符合预期。这次 Alpine.js 和 Swup.js 总算配合的不错。
Swup.js 是一个页面平滑过渡库。我自建站伊始,就关注过 pjax 。后来选择使用 DoIt 也有因为这个主题使用 pjax 的原因(虽然后来删除了这个依赖)。随着时代的变化,现在更流行的做法应该是 Vue 写的 SPA 这样。比如说 Vitepress,不是一般的流畅。但是那就是 npm 生态的事了。
Swup.js 盯上有段时间了,才用到博客上是因为 Swup.js 要求对全局 js 有比较统一的管理。改一个主题适配 Swup.js 还是有点费劲,容易出 bug。不过用上 Alpine.js 就方便多了。可以实现一个组件化效果。例如:
<div x-data="counter()" class="counter">
<h3>计数器</h3>
<p>数值: <span x-text="count"></span></p>
<button @click="add">+1</button>
<button @click="sub">-1</button>
</div>
<script>
function counter() {
return {
count: 0,
add() {this.count++},
sub() {this.count--}
}
}
</script>
<style>
</style>html
这种组件在 Alpine.js 的帮助下可以实现轻松复制为多份使用互不干扰,自动初始化,页面切换后自动销毁。正适合和 Swup.js 打 combo 。
总之,在这俩 js 库的帮助下也算实现了类似 SPA 的效果。此外,UnoCSS + Alpine.js 的组合也让 Hugo shortcode 的编写复用变的轻松。就像内联 js 和 css 写的 shortcode 那样,不过工程管理上更现代一些,不容易发生各种冲突。
说到样式,得提一句。这个主题目测对浏览器要求大概是 115 以上。2023 往后的版本吧。用了些 CSS 嵌套。嗯哼,写法也现代。为此我还将我手机的 WebView 从 92 升级到了 146 。(一开始想兼容来着,发现 Postcss 会拖慢 build,放弃了)
总结
其他的没啥可以说的。主题已经开源。致谢 cworld1/astro-theme-pure 。
原主题