给博客写了个主题,以后样式我自己定
第三次被上游主题的更新盖掉改动之后,我就想自己写一套了。
折腾了大半个月,今天换上去了。名字叫 Onlynn,署名 nn在发呆,仓库放在 GitHub 上。你正在看的这篇,算是它的第一篇产出。
旧主题哪儿都好,就是太勤快
之前用的是 Ethereal,清爽,卡片布局我挺喜欢,作者更新也勤快。问题恰好出在勤快上。
我在服务器上改的都是构建产物,模板文件、样式表、几个手写的 JS。上游一发新版,我改的东西就跟着没了。改一次丢一次,改两次丢两次。到第三次我不想再跟了。
还有件一直没解决的小事。旧主题文章底部的授权卡片右侧印着一个大写的 C,是硬编码在模板里的 Creative Commons 图标,十五个 rem,透明度百分之五。我想把它弄掉,翻遍后台设置也没找到开关,只能去动模板代码,然后等着下次更新把它盖回来。
也纠结过要不要干脆换个平台。看中过一款用 Astro 写的静态站主题,界面干净,动效舒服,差点就动手了。真去估工程量才发现代价不小,后台写作、插件、评论、搜索这一整套都得换掉,几年的文章也得搬。为了一套外观推倒重来不划算。
技术栈没什么花活
底层是 Astro 加 Svelte 加 TypeScript,写完构建成 Halo 的主题包。
选 Astro 是因为它出静态页快,组件写法也直白。Svelte 用来做几个需要交互的部件,搜索、显示设置面板、明暗切换这些。文章数据还是存在 Halo 自己的数据库里,主题只负责长什么样,不碰内容。
Halo 主题的结构跟普通前端项目不太一样,源码和主题文件混在一个仓库里。theme.yaml 声明主题名、版本、要求的 Halo 版本,settings.yaml 定义后台能配哪些项,templates 放页面模板,静态资源在 templates/assets 下面,对外映射成 /themes/onlynn/assets/ 这样的地址。第一次看这套结构有点绕,改到现在才算捋顺。
设置项那块体量最大,一百多千字节。加一项要同时改模板和设置定义,两边名字对不上就读不到值,我在这上面来回试过几次。旧主题的模板更夸张,光文章页那个文件就有五千多行。
样式终于按我自己的口味来了
底子留着 Ethereal 那套卡片布局,补的是另一款主题身上的东西,访客能实时换壁纸、切主题色相、调卡片材质,还有朋友圈、心愿墙、追番这些偏个人趣味的小页面。
导航栏右上角现在有个「外观」面板,壁纸模式、页面特效、主题色相、文章布局是列表还是网格、侧栏靠左还是靠右、卡片走悬浮还是磨砂质感,都能自己调。色相那条能拖三百度,配色方案等于无穷。这些原本是主题作者定死的,现在交给访客。
页面也不止文章列表了。主题内置七个模板,后台建页面时直接选,留言板、RSS 订阅页、朋友圈、心愿便签、时间轴、技能展示、打赏支持。文案和数据都在主题设置里配,不用改代码。
所以导航栏现在是文章、拾光、风铃屋、关于。名字自己起的,底下挂什么页面也自己定。

能改,这一条最实在
以前刷到别人博客上有好玩的东西,第一反应是去翻主题设置,看有没有现成开关,找不到就作罢。现在第一反应是打开编辑器,自己加一个。这个区别挺大的。
上游更新也不用再跟了,想参考就挑着合,不想动就不动。主题里那些一直看不顺眼的细节,顺手就能改掉,上面那个 C 就是。
开发和部署比我想的省事。源码放在 src 目录,本地起开发服务预览,构建完把产物丢进服务器的 themes 目录,后台刷新一下就生效,不用重启容器,也不用碰数据库。依赖装在本地,只在构建时吃内存,闲时不占服务器。
博客做到这一步,才算是按我自己的意思长出来的。
要说还有什么没底,是移动端。桌面端我自己看着满意,手机上有几处别扭,侧栏折叠的时机、图片的取景,都还没调到顺手。这块得慢慢来。
主题的事先告一段落。接下来想补的是 README,仓库现在只有两行字,别人打开看不懂这是什么。再往后是抠文章内的排版,代码块、引用、图片说明这些地方想再讲究点。开源也想过,不过得先把文档和示例做起来,否则丢出去也没人能装上。
好在房子盖完了,图纸也是自己的。

