它解决什么问题
“这个站写过哪些东西、彼此怎么关联”是传统博客回答不了的问题。知识星图把文章、项目、踩坑、笔记、标签、系列编译成一张可探索的关系网——读者可以从任何一颗星出发,顺着引力找到相关的一切。
数据链路
内容集合(frontmatter 关系字段)
→ scripts/generate-graph-data.mjs(构建期,仅非草稿)
→ public/graph-data.json(当前构建:172 节点 / 253 边)
→ /graph SSR 页面读取(磁盘直读,见文章《SSR 页面为什么不该向自己发 HTTP 请求》)
边类型:文章↔标签、文章↔系列、项目↔相关文章、踩坑↔标签——全部来自已校验的 frontmatter 引用(引用完整性由内容门禁保证,图里不会出现悬空边)。
渲染层的四个工程决策
- 力导向自研而非引库:确定性初始布局(同一输入同一画面,可回归)、O(n²) 斥力 + 弹簧 + 向心力、alpha 衰减自动停帧——当前规模几百毫秒收敛,浏览器里算得起,无需 Web Worker。
- 性能自律:
requestAnimationFrame只在有能量时运行;IntersectionObserver离开视口即停帧,后台标签页暂停;拖拽/缩放/平移/双击复位全在 Canvas 坐标系内完成,不触发布局。 - 降级是设计的一部分:
prefers-reduced-motion下同步结算 240 次迭代输出静态星图——信息量不变,只是不“飘”;移动端粒子/光效降级的同一原则在这里复用。 - 无鼠标等价操作:星图是可发现性增强,不是唯一入口——节点列表(可过滤、键盘可达、Enter 聚焦星图对应节点)、类型筛选、路径查询(起点/终点下拉 + 本地 BFS 最短路径,含“无可达路径”空态)全部可纯键盘完成。
交互模型
点击节点 → 邻域高亮(相连边标记 source/target、非相关弱化)+ 邻接面板列出关系;类型筛选与关键词过滤联动重排;BFS 路径提示展示“节点 A → B → C”与跳数。数据在页面内联一份公开 payload(构建期直读生成物),过滤/路径全部内存态——不持久化、不上传任何输入。
当前状态与边界
星图模式已成为探索地图默认视图(节点阈值达标后从二级入口升级)。边界:图规模到千级节点时 O(n²) 斥力需要换成 Barnes-Hut 或分块布局,页面结构已为此预留(渲染器与数据层解耦,输入只是那份 JSON)。
下一步
方向筛选(只看“文章→标签”类边)、跨类型路径高亮动画(尊重 reduced-motion)、以及基于入度的“枢纽文章”榜单接入首页。