为博客添加Bangumi页面

目录

另辟蹊径

最近参观别人的博客,发现有些博客有Bangumi的页面,可以显示个人的动画、漫画的进度,很有趣,于是我也想为我的博客添加一个类似的页面。

很可惜的是,这些插件都是Node.js生态下的产物,更精确地说,我所见的插件都是基于Hexo的。对于Hugo这样的非Node.js站点生成器,想要直接使用这类插件,应该是不可能的。

我灵机一动,想到了Serverless Functions。各种云服务商的Serverless Functions都提供了Node.js环境,以运行函数,既然Hugo站点不能使用Node.js,我们就借用云端的运行环境。

最开始,我打算使用大模型辅助我完成插件的开发,幸亏我提前搜索了有没有类似的项目,要不然就白白浪费了时间。事实证明,我并不是第一个想出这种玩法的人,前人的智慧更胜于我。最后我采用的是bilibili-bangumi-component1,类似的项目还有BangumiTV2

理论上,其他非Node.js生态的静态站点生成器也可以采用这个方案,例如Zola和Pelican。使用Node.js的站点同样可以使用,但是并无必要。

快速实战

bilibili-bangumi-component给出的后端部署教程极其详细,按步骤操作即可。

前端的设置上,我们需要到layouts/shortcodes路径下创建一个供Hugo使用的shortcodes。使用CDN引入,并在HTML中使用组件,就能完成最基础的使用。

<bilibili-bangumi
  api="https://xeonzilla.top/api/bangumi"
  bilibili-enabled="false"
></bilibili-bangumi>

<style>
  bilibili-bangumi {
    --bbc-text-base-color: rgb(51, 65, 85);
    --bbc-label-color: rgb(96, 165, 250);
    --bbc-primary-color: rgb(96, 165, 250);
  }

  bilibili-bangumi[dark] {
    --bbc-text-base-color: rgb(203, 213, 225);
    --bbc-label-color: rgb(37, 99, 235);
    --bbc-primary-color: rgb(37, 99, 235);
  }
</style>

<script
  type="module"
  src="https://fastly.jsdelivr.net/npm/bilibili-bangumi-component@latest/dist/bilibili-bangumi-component/bilibili-bangumi-component.esm.js"
></script>

<script>
  const bangumi = document.querySelector("bilibili-bangumi");

  function applyBangumiTheme() {
    const isDark = document.documentElement.classList.contains("dark");
    if (isDark) {
      bangumi.setAttribute("dark", "");
    } else {
      bangumi.removeAttribute("dark");
    }
  }

  applyBangumiTheme();

  const observer = new MutationObserver(applyBangumiTheme);
  observer.observe(document.documentElement, {
    attributes: true,
    attributeFilter: ["class"],
  });
</script>

我创建的组件中,除了基础调用,还调整了主题色以适配Blowfish、适配了Blowfish的黑暗模式逻辑,各位可以根据需求修改。

创建shortcodes后,我们就可以在需要的页面中通过调用shortcodes的方法调用组件。

实际上,完全可以为此创建一个全新的模板,但是这对Go template熟悉程度的要求较高,并不适合我这样的初阶用户。使用shortcodes快速创建并插入现有模板,实现难度就要低上许多。

bilibili-bangumi-component的不足之处,就是可定制之处不多,可能这就是WebComponent的特性。同时,作者的代码也看得我一头雾水,大概率是经过混淆,所有的变量与函数都难以辨认,直接修改源代码这条路也行不通了。

至少它在完成本职工作的方面完成得出色,基本的功能都实现了,甚至还有按页码跳转,算是勉强让我满意。

生态的力量

在完成了本次添加Bangumi页面的工作后,我深刻感受到了Node.js生态的力量,不仅有大量的npm包,还有繁荣的社区。相比之下,非Node.js的站点生成器们只能完成最基本的站点生成功能,确实可以称作生态贫瘠了。如果追求极简化,那么Hugo与Zola之流就很合适;但是对于我这样的“玩家”,与Node.js的臃肿一体两面的丰富生态,或许是更适合的去处。

正值博客动工的一周年之际,我打算为站点进行一次彻底、完全的重构,从生成器、到主题、再到托管方式。在这次的迁徙中,我就可以慢慢接触Node.js,让它向我展示无与伦比的可玩性与可扩展性。

脚注

  1. yixiaojiu/bilibili-bangumi-component: 展示bilibili与Bangumi追番列表的WebComponent组件

  2. GeeKaven/BangumiTV: 一个基于Vercel Severless Function的Bangumi.tv追番进度展示页面

评论

有新的想法?欢迎向我发送邮件,或使用下方留言板进行留言。

留言板
留言可见性

公开留言会整理后展示,私人消息仅站长可见。

必填。最多2000字。支持Markdown语法,但不支持预览。

必填。公开展示时将使用这个昵称。

如需回复某条评论,请填写其序号。

可填写个人站点URL,公开展示时会附加于昵称之上。

页首