Urodele,我心中最完美的博客系统

urodele-home.png

每个程序猿最想做却又最不容易做下去的事,莫过于写博客了。

很多时候心血来潮,想写一篇文章来描述当下的新点子,却总是有着这样那样的掣肘:

写在哪呢?备忘录?不行,没法分享,怎么能算是博客呢?

Notion这样的在线文档服务又严重依赖线上,而且没办法随心所欲地自定义。

发到论坛吧,又担心遇到这样那样的审核黑盒,耗费心神。

自己搭个博客系统?服务器的钱从哪里来,域名也是个大问题,建个站费时费力。

当然,可以用万能GitHub Pages,实在不行还要Vercel,CloudFlare,Netlify这些白嫖党网站呢,随便fork一个仓库就可以实现个人站点自由。

没错,可是,它们都有一个最大的问题:

不支持在线编辑

想要写一篇博客,你不得不clone整个仓库,用vscode或者什么其他编辑器写好,然后push上去才能发布,即使使用GitHub来管理文件,自带的web端编辑器也实在说不上好用。没办法,既然选择了白嫖,也不得不接受一些瑕疵。

但是事实真的如此吗?

当有人说这世界上没有一个完美的博客系统时,

我:请看 Urodele

Urodele是一个基于Github Pages的纯静态博客站点,只需要一个最简单的静态网站托管服务就可以发布,最重要的是,它完全支持在线编辑,你可以通过它在线编辑和管理你的博客,然后一键发布。

Urodele支持包括添加、编辑、草稿这样的基础博客管理功能,并且后续还会增加更多的新功能,如果你熟悉一点javascript,那自定义自己的博客站点更是易如反掌。

那么,Urodele是怎么做到的呢?

基于Astro

先来说说Urodele的静态站点系统,它基于Astro.js搭建而成,做到了首屏零JS(误)。虽然不是完全没有JS,但是相比于使用Vue、React之类的框架搭建的SPA项目,整个站点的首页加载几乎完全不需要任何JS,只有在涉及到页面交互、api处理的时候,才会下载到所需的JS,这对依赖SEO的博客站点来说,是非常重要的。在使用Chrome Lighthouse跑分时,也跑出了接近满分的成绩。

除了使用Astro来做到首屏零JS外,为了尽可能减少JS的体积,Urodele内部也没有使用第三方框架,减少框架运行时带来的代码体积增加。对于一个博客系统来说,复杂的响应式系统显得太过笨重,取而代之的是一套基于用jsx-dom作为语法引擎驱动的命令式UI,简而言之,JSX版的JQuery,虽然缺少响应式,但是胜在体积小,没有什么心智负担,能与任何第三方库轻松结合,指哪打哪,简单轻快。

另外,基于Astro也有另一个好处,那就是可以方便地动态化,如果你有自己的服务器可以用来部署,那么只需要简单的修改就可以将Urodele部署为动态化的博客(TODO)。Urodele的内部实现将页面生成和博客编辑做了解耦,你可以自定义任何方案来完成博客从保存->生成的过程,Github Pages的部署也是基于这一部分实现的。

在线编辑

Urodele的另一个重要的部分就是它的在线编辑器,基于Tiptap打造,能够支持比Markdown更丰富的富文本编辑体验。Tiptap背后基于ProseMirror,也为其提供了更强的拓展能力,任何人都可以制定属于自己的编辑器,添加各种新的特性和能力。

传统静态博客站点的一大痛点就是必须依赖第三方图床,想要展示图片必须要把图片先在线上传,再复制链接到博客内,十分打断写作体验,而Urodele支持像所有传统的本地编辑器一样直接插入图片内容,无论是本地上传,亦或是复制粘贴,Urodele会自动处理图片路径,再也不需要去找各种随时可能跑路的图床了。

目前Urodele提供的基础的编辑能力,已经能够满足大部分的编辑体验,后续也会不断添加更多的新能力。

已经支持的在线编辑功能:

  1. 基础文本样式(标题,粗体,引用等)

  2. 无需外链插入图片

  3. 代码高亮

  4. 基于代码高亮的实时HTML预览(CSS Tricks

博客管理

那么,Urodele到底是如何做到将静态站点转换为动态博客管理系统的呢?

隆重介绍Github Actions,一个充满无穷想象力的工具。

通过Github Actions,它能自动检测到分支的改动,并重新触发站点的生成和部署,而这正是Urodele的魔力所在,在你登录之后,你的每次发布、编辑,其实都是Urodele替你对Github仓库文件进行了改动,触发了Github Actions的运行,然后,你的文章便会如预期的那样更新,化静为动,这就是Urodele的奥秘。

最后

自从使用Github Pages搭建个人站点以来,我就一直在探索如何最大化利(bai)用(piao)这些大公司资源,Urodele是这些探索的集大成者,它充分利用了Github提供给广大开发者的能力,让搭建属于自己的博客系统变得不那么费时费力费钱,只需要轻松fork到自己的仓库,再修改一点小小的配置,就能轻松拥有一个完美的博客。

Urodele的完美之处在于,它的所有功能都是有机结合的,相比于其他传统的静态博客站点,它实现了在线编辑+动态更新;而比起WordExpress之类的一站式管理系统,Urodele又无需一整个服务器的开销。跟重要的是,Urodele里的所有东西都属于你自己,无论是图片还是文章,它都不依赖其他在线服务,静态生成的页面意味着你甚至不需要服务器,不需要连接到网络,在本地构建之后即可预览,也随时可以迁移到任何其他服务。

目前为止,Urodele已经满足了我自己对博客系统的所有需求,但它依然还在持续更新,包括但不限于:

  1. (目前已支持)使用Github App登录。目前Urodele只支持使用Token登录,这样会有传输token带来的泄漏风险,这并不是说使用token会有安全问题,而是指在将token从Github网站粘贴到站点输入框这一段过程,例如使用了IM工具或者剪贴板等,会有泄漏的风险。因此,使用Github App登录会是更易用,也更安全的认证方式。然而这种方式会带来其他的依赖(后端服务器等),因此目前依然会继续提供使用token登录的途径。

  2. 构建速度优化。Urodele尚未为超大型博客进行验证,因此可能在文章较多时出现构建速度较慢的问题,这类场景也许可以通过Github构建缓存来解决。

欢迎fork或者为Urodele提供新的PR,让Urodele成为一个更好的博客解决方案。