为博客添加 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,公开展示时会附加于昵称之上。

页首