旁注式笔记系统的思考(二)

2026 年 01 月 10 日
1 次浏览
6560 字数

之前在 旁注式笔记系统的思考(一) 中,思考过如何将 " 旁注笔记 " 和源博客文本既能关联起来,又能无侵入的方法。今天偶然在看 Handsome 大佬的博客时,他实现了一个 支持 Markdown 行级别评论 功能,其实这个 " 行级别评论 " 功能和 " 旁注笔记 " 非常相似,所以分析了下他的实现方案,提供一种不同的实现思路。

Handsome 博客方案

评论 api 返回数据如下:

{
  "success": true,
  "data": [
    {
      "sid": "4",
      "cid": "1351",
      "line": "2",
      "text": "而当我阅读其他人博客的时候,很少会去评论,有一个原因就是文章",
      "created": "1748342140",
      "count": "0",
      "comments": [
        {
          "author": "若志奕鑫",
          "avatar_url": "",
          "url": "https://rz.sb",
          "author_tag": "",
          "time": "7 个月前",
          "content": "我嘞个豆啊哥,前段时间还跟一个佬哥讨论这个功能来着,起初还是看到一个大佬的博客也是这样搞(cali.so)  ,我是觉得根据所对应内容进行评论,能有效减少一些水评,评论目的性也会强一点",
          "coid": "33917"
        },
        {
          "author": "友人C",
          "avatar_url": "",
          "url": "https://www.ihewro.com/",
          "author_tag": "博主",
          "time": "7 个月前",
          "content": "是的",
          "coid": "33921"
        },
        {
          "author": "Alan",
          "avatar_url": "",
          "url": "https://toalan.com",
          "author_tag": "",
          "time": "6 个月前",
          "content": "好耶!!!很想要的功能!!!",
          "coid": "33978"
        }
      ]
    },
    {
      "sid": "2",
      "cid": "1351",
      "line": "4",
      "text": "这两周业余时间(非工作时间)调研了一下更细粒度的评论的实现,",
      "created": "1748277636",
      "count": "0",
      "comments": [
        {
          "author": "友人C",
          "avatar_url": "",
          "url": "https://www.ihewro.com/",
          "author_tag": "博主",
          "time": "7 个月前",
          "content": "第一条段落评论!",
          "coid": "33908"
        },
        {
          "author": "林风",
          "avatar_url": "",
          "url": null,
          "author_tag": "",
          "time": "7 个月前",
          "content": "哇,好耶,新的功能又上新啦~",
          "coid": "33923"
        }
      ]
    },
    {
      "sid": "27",
      "cid": "1351",
      "line": "6",
      "text": "因为时间关系,有一些细节还没有完善好,且先发帖一下~",
      "created": "1764820102",
      "count": "0",
      "comments": [
        {
          "author": "alan",
          "avatar_url": "",
          "url": "https://toalan.com",
          "author_tag": "",
          "time": "1 个月前",
          "content": "默默催更,很需要这个功能",
          "coid": "34075"
        }
      ]
    },
    {
      "sid": "3",
      "cid": "1351",
      "line": "8",
      "text": "这次开发中,AI 生成的代码估算占据了40%以上,接下来会跟",
      "created": "1748318949",
      "count": "0",
      "comments": [
        {
          "author": "刚下飞机的匿名人士",
          "avatar_url": "",
          "url": null,
          "author_tag": "",
          "time": "7 个月前",
          "content": "坐等",
          "coid": "33915"
        },
        {
          "author": "Xiaoxuya",
          "avatar_url": "",
          "url": "https://www.sicx.top/",
          "author_tag": "",
          "time": "3 星期前",
          "content": "这个可以有 目前不是很专业的使用Ai开发",
          "coid": "34080"
        }
      ]
    }
  ],
  "count": 4
}

可以看到,锚点机制是通过 text 字段——即每段的前 30 个字进行关联的。不过,line 字段目前还不知道有什么作用。

同时,链接至对应行的链接为 /archives/1351/?sid=2,通过 sid => 对应 text => 前端段落正文匹配 的机制进行 " 行级别 " 的文章定位。

cali.so 博客方案

在上述评论中,还发现了这个大佬的博客 Cali Castle,也支持标注评论。它的评论 api 返回数据如下:

{
        "userId": "user_2XRZjF7VuawhVxdbQ4NCPpuqRp4",
        "userInfo": {
            "imageUrl": "",
            "lastName": "川崎",
            "firstName": "川崎"
        },
        "body": {
            "text": "很棒很牛的主题👍🏻。如果能明确对TailwindUI的借鉴来源就好了。应该是前不久Tailwind出售的主题Spotlight。",
            "blockId": "57e40959016c"
        },
        "createdAt": "2023-10-29T15:42:45.000Z",
        "id": "J61",
        "parentId": null
    }

该博客的锚点机制是通过 blockId 字段,虽然目前还不清楚 blockId 的生成机制,但是只要确保每个 block 生成的锚点 id 固定一致。例如,blockId 生成的算法为块内容的 hash 值。之后,只需要在前端页面加载完成后,为每一个 block 添加 id 即可。

两个方案的优劣

前者优点是,无需设计复杂的 blockId 生成机制,也无需为 block 添加 blockId。缺点则是,段落的前 30 个字作为锚点,在数据存储和传输上会稍显冗余。

后者的优缺点则反之。

暂无标签