SiYuan v3.1.5 更新深度解读:表情加载、FSRS-5 升级与新内核 API getPathByID
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
本篇以 SiYuan v3.1.5 官方变更日志(v3.1.5_zh_CHT.md)为主体,逐条梳理该版本的改进、修复与开发者接口变化,并结合当前仓库内核源码(kernel/api/filetree.go、kernel/model/flashcard.go、kernel/model/upload.go 等)解释每条变更背后的实现位置与机制,帮助开发者判断升级收益、理解内核 API 设计,并为插件/MCP 工具作者提供可直接调用的接口细节。
版本概述
v3.1.5 是一个典型的“细节打磨版本”,官方概述原话为:“此版本修复了一些细节缺陷,建议升级。”变更内容分为五个板块:改进功能(8 项)、修复缺陷(4 项)、开发重构(1 项)、开发者接口(2 项)。涉及的面覆盖编辑器输入体验、网页剪藏、历史回滚与索引策略、导出渲染,以及闪卡间隔重复算法(FSRS)的底层升级。下面逐板块展开,所有条目均可在仓库源码中找到对应实现。
改进功能逐条解析
改进编辑器表情符号加载
该改进对应上游问题 #12241。从源码看,编辑器表情面板的核心实现在 表情模块:
- 面板打开时并不一次性渲染全部表情,而是通过
filterEmoji先生成骨架 HTML,非首屏的分类只保留data-index占位符; lazyLoadEmoji使用浏览器IntersectionObserver监听.emojis__content面板滚动,只有当分类真正进入视口时,才由renderEmojiContent把data-index对应的表情批量渲染为<button>并移除占位标记(lazyLoadEmoji 实现);- 动态图标(如日历图标)同样采用
data-src延迟填充的懒加载策略,见lazyLoadEmojiImg(实现)。
这种“视口懒加载 + 占位符回填”的结构,使表情面板在表情库较大时依然保持打开速度。v3.1.5 的改进正是围绕该加载路径的细节优化。此外,putEmojis会把自定义表情注册进 Lute 解析器,注释中明确说明 Lute 为所有编辑器共享单例,PutEmojis只需调用一次(putEmojis 实现),这也是表情加载链路的一部分。
改良 CSDN 剪藏与链滴剪藏
CSDN 剪藏(问题 #12313)与链滴剪藏(问题 #12368)属于网页剪藏解析器的站点适配改进。SiYuan 的剪藏流程是:浏览器剪藏内容提交到内核后,由内核的剪藏解析逻辑按站点特征提取正文,再落盘为块。该版本针对两个中文内容站点的正文抓取规则做了调整,属于规则层面的站点级修复,仓库中对应的能力入口为剪藏导入相关接口,使用者升级后直接重新剪藏受影响页面即可验证效果。
改进代码块行号渲染与空格行行号错误
该版本包含两条与代码块行号相关的记录:
- 改进代码块行号渲染(问题 #12317):优化编辑器中代码块行号 UI 的呈现;
- 修复仅含空格行导致的行号计算错误(问题 #12346):代码块中只包含空白字符的行此前会干扰行号计数,本版本修复了该边界情况。
行号渲染依赖块内容与行结构的逐行解析,空格行属于典型的解析边界用例。对经常引用代码块行号的读者(如文档注释、代码审阅场景),这一修复保证了行号与实际行一一对应。
回滚文档后仅重新索引当前文档
该改进(问题 #12320)针对的是历史版本回滚后的索引刷新范围。内核中历史回滚的入口是 RollbackDocHistory,它会从历史快照目录取回旧的.sy文档、写回工作区文档,再触发索引更新。此前的行为是回滚后触发更大范围的重新索引;v3.1.5 将范围收敛为“仅重新索引当前文档”,显著缩小了索引队列的瞬时压力。
值得注意的是,回滚逻辑对加密笔记本有专门分支:RollbackDocHistory通过getRollbackBox获取目标笔记本,若原笔记本为加密且处于挂载状态,则用原始 boxID 解密后再写回,避免密文被误写入普通回滚笔记本(相关注释)。索引范围的收缩与这条写回路径是配套收益:写回动作变精确,索引动作也相应精确。
改进分隔线输入与列表项编辑
- 分隔线输入改进(问题 #12340):优化
---等分隔线标记的触发时机,减少误触发与漏触发; - 列表项编辑改进(问题 #12066):优化列表块编辑时的行为细节。
两者都属于 Markdown 快捷输入(shortcut)与块编辑的交互修正,体现在编辑器前端对输入序列的判定逻辑中。
不再限制编辑器中动态加载块的数量
问题 #12359:此前编辑器对“动态加载块”(如嵌入块、引用块等按需加载外部内容的块)的数量存在上限保护,v3.1.5 移除了该数量限制。这意味着长文档中密集使用嵌入/动态块时不再受截断影响。从源码结构看,块的动态加载由编辑器渲染管线按块类型分发,移除上限后需要依赖块加载自身的性能控制,这也是官方在同版本中同步优化其它渲染细节的背景之一。
改进数据库关联字段绑定/解绑块
问题 #12372:属性视图(数据库)中“关联”类型字段的块绑定/解绑操作得到改进。关联字段的数据落在属性视图的关系表中,仓库中对应实现位于 kernel/av/relation.go 与 kernel/sql/av.go 一层的属性视图关系处理逻辑。该改进使绑定/解绑块时的状态同步更可靠,减少关联卡片数据与视图展示不一致的情况。
修复缺陷逐条解析
S3/WebDAV 无法获取云端快照列表
问题 #12350:在使用 S3 或 WebDAV 作为同步存储时,云端快照列表拉取失败。快照列表能力服务于本地快照恢复场景,内核同步模块的存储抽象层(S3/WebDAV 适配器)中相应列举接口在本版本修复。对自建云同步(S3 兼容对象存储、WebDAV 服务器)的用户,这是恢复数据链路上的关键修复,升级后建议重新验证一次“查看云端快照列表”操作。
导出为 PDF/图片/HTML 时代码块未语法高亮
问题 #12378:导出产物中的代码块丢失语法高亮。SiYuan 导出链路基于 Lute 将块内容渲染为 HTML 再走 PDF/图片管线,高亮缺失通常源于导出时高亮上下文未随渲染上下文一并传递。该修复保证了导出件与编辑器内所见一致的代码块着色,涉及代码块较多的文档(如技术笔记、讲义)导出质量直接受益。
其余缺陷修复
- 列表项编辑(问题 #12066)的编辑行为修正;
- 代码块空格行行号计算错误(问题 #12346,见上文);
- S3/WebDAV 云端快照列表(问题 #12350,见上文)。
开发重构:升级到 FSRS-5
这是本版本唯一的“开发重构”项(问题 #12344),值得单独展开。SiYuan 内置闪卡(间隔重复复习)系统依赖 FSRS(Free Spaced Repetition Scheduler)算法计算复习间隔,内核通过github.com/open-spaced-repetition/go-fsrs/v3库接入 FSRS,go.mod 中声明了该依赖;闪卡卡包以riff.Deck结构管理,参数来自用户配置:
- 卡包加载入口 LoadFlashcards:遍历数据目录下
*.deck文件,调用riff.LoadDeck时传入Conf.Flashcard.RequestRetention(期望记忆率)、Conf.Flashcard.MaximumInterval(最大间隔)与Conf.Flashcard.Weights(算法权重向量); - 复习动作 ReviewFlashcard:按评价(rating)调用
deck.Review更新卡片状态并落盘复习日志,还维护了reviewCardCache/skipCardCache两个缓存以支持复习过程中的撤销与跳过; - 待复习卡片调度 getDeckDueCards 调用链:按笔记本、文档或卡包维度取卡,受
NewCardLimit(新卡上限)与ReviewCardLimit(复习卡上限)约束,文档级还可通过 IAL 属性custom-riff-new-card-limit/custom-riff-review-card-limit单独覆盖(文档级上限逻辑)。
升级到 FSRS-5 意味着上述复习间隔计算的权重与状态模型换用 FSRS 第五代参数体系。对使用者而言,这是“无感但有效”的重构:既有卡包数据保持可加载,复习计划由新算法权重驱动;对关心闪卡效果的开发者,可通过闪卡配置中的权重参数验证行为变化。
开发者接口变更
新增内核 API/api/filetree/getPathByID
问题/PR #12353。该 API 在当前仓库中的实现与注册均可直接查证:
- 路由注册于 router.go 第 155 行:
POST /api/filetree/getPathByID,挂载了model.CheckAuth鉴权中间件; - 处理函数 getPathByID:接收 JSON 参数
id(块/文档 ID),先用util.InvalidIDPattern校验 ID 合法性,再调用model.GetPathByID(id)取出路径与所在笔记本,响应体为:
{ "code": 0, "data": { "path": "/笔记/子文件夹/文档.sy", "notebook": "笔记本ID" } }与同文件中相邻的getHPathByID(返回 hPath 层级路径,实现)不同,getPathByID返回的是文件系统级完整路径加笔记本 ID,这对插件或 MCP 工具作者非常实用——例如已知一个块 ID,即可定位其物理文件位置而无需遍历文件树。调用示例(需携带有效 token):
curl -X POST http://localhost:6806/api/filetree/getPathByID \ -H "Authorization: Bearer <token>" \ -d '{"id": "20230101000000-abcdefg"}'修复/api/asset/upload响应体succMap字段
PR #12361。上传资源接口/api/asset/upload的响应体中包含succMap字段,用于返回“上传成功文件名 → 资源路径”的映射。该字段的生成逻辑在内核 model/upload.go 的 InsertLocalAssets:对每个本地文件按目标位置生成映射条目(新建时为assets/文件名,已存在时复用既有资源路径),再由 asset API 层 将succMap装入 JSON 响应。本版本修复了该字段在特定分支下取值不正确的问题。所有依赖succMap解析上传结果的一方——包括仓库内的 CLI 命令(cli/cmd/asset.go 直接打印该映射)和 MCP 工具(mcp/tools/asset.go 用它向模型汇报上传清单)——都会因此受益,修复后各入口拿到的路径映射保持一致。
升级与下载建议
v3.1.5 官方结论为“建议升级”:对一般用户,收益集中在编辑器细节体验(表情面板、分隔线、列表编辑、代码块行号)与导出高亮修复;对使用 S3/WebDAV 自建同步的用户,云端快照列表修复具有实际价值;对插件/MCP 开发者,新增的getPathByIDAPI 和succMap修复是直接的接口层收益;对闪卡重度用户,FSRS-5 是底层算法升级。变更日志同时提供 英文版 与 简体中文版,可在官方发布渠道(B3log 下载页、GitHub Releases)获取对应安装包,本文档目录 app/changelogs 下也完整保留了各历史版本的三语变更日志,便于交叉核对功能演进。
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考