计算机技术学习札记

用 Scala 写了个伪 CMS:建站碎碎念

这个月的某一天,因为 一些事情 心情低落,百无聊赖之下决定给自己找点事做,决定将自己的网站从 GitHub Pages 搬运回内地的腾讯云 VPS。考虑到内地服务器开办网站需要进行备案,想着也正好趁暑假没有上课来做这事——待开学之后,人家管局突然在上课时打我电话就不方便接了。顺着这股念头,8 月 17 日,我在腾讯云提交了备案审请。最终在 9 天后的 8 月 25 日,我收到了工信部的 ICP 备案通过通知。

有了服务器,网站自然不再局限于原来的静态页面了。本来我计划是转用 Typecho 或 Wordpress 这样的 PHP CMS 作为网站系统的,但在开始着手寻找相应的主题时犹豫了:「要不自己写一个吧,」大概心里是这样想的。就这样,我决定用 Scala 来写自己的网站 CMS。至于为什么是 Scala,那是另一个故事了。

理想和现实是有差距的,我面临的最大问题是我对网络开发一窍不通——我只是笼统地知道一些诸如 HTTP、Tomcat 之类的名字和它们的含义,只是大概了解一些网站的工作流程(前后端分离),但对具体的开发没有任何头绪。因此,前端部分,我选择照抄参考一些现成网站的 CSS 和 HTML 布局,并且没有使用 Vue 或者 React 这样的前端框架。由于缺乏 JavaScript 知识,前端也没有使用任何 JS 来实现功能(\(\KaTeX\) 除外)。整个前端的开发过程都是处于一个「抄作业—魔改—上 菜鸟教程 看文字教程」的循环之中。

而后端则是一个简陋的「文档解析器」。在构思系统结构时,因为我浅薄的知识水平,使得我目前难以做出有独立后台管理系统的网站——即像 Wordpress 那样有一个在线后台界面的完整 CMS。为了「我会做」和「便捷」之间取得的权衡,我选择将「思源笔记」作为「实际的后端」——在服务器上部署一个思源笔记,实现便捷的在线编辑功能;而网站的后端,则只要将思源笔记保存的文章进行渲染就可以了。思源笔记的文章是以 JSON 格式存放在 sy 文件里的,故后端的本质就是一个集成了 Web 服务器的 JSON 转 DOM 转换器。

具体来说,后端使用 Scalatra 作为 Web 服务框架。当访问一个特定的文章页面(比如 https://criwits.top/page/20220826222259-fvy2uva)时,后端将 URL 中的文章 ID(即 20220826222259-fvy2uva)解析出来,然后前往思源笔记的工作空间寻找相应的 sy 文件,将其解析为 DOM,合成为 HTML 并返回。在这个思路之上,我又借助 Nginx 进行反代,将思源笔记和后端接入统一的网站入口,实现了一个「伪」的 CMS。整个网站的技术框架如下:

+----------+                                             +---+
|  SiYuan  | <=============[internal port]============== |   |
+----------+                                             | N |
   |                        +---- Written in Scala       | G |
   | [Read & Write]         |     Using Scalatra as      | I | <==[HTTPS]==> WEB
   V                        V     web framework          | N |
+----------+           +---------+                       | X |
|.sy  files| <-[Read]- | Backend | <==[internal port]=== |   |
+----------+           +---------+                       +---+

这套系统我暂命名为 Scalog——Scala + Blog,即是「用 Scala 写成的 Blog 系统」。尽管它现在很简陋,鲁棒性基本没有(任何一个未预期的操作都可能让它崩溃!),但这也算是一个尝试。希望之后它能变得更好——用自己写的网站系统做 Blog,还是能让人自豪一下的嘛。

Scalog 目前的代码还是一团乱麻,因此在它变得适合拿出来给大家欣赏之前,暂时不会进行开源。