SiYuan v3.1.5 更新深度解读:表情加载、FSRS-5 升级与新内核 API getPathByID
2026/9/10 9:27:06 网站建设 项目流程

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面板滚动,只有当分类真正进入视口时,才由renderEmojiContentdata-index对应的表情批量渲染为<button>并移除占位标记(lazyLoadEmoji 实现);
  • 动态图标(如日历图标)同样采用data-src延迟填充的懒加载策略,见lazyLoadEmojiImg(实现)。

这种“视口懒加载 + 占位符回填”的结构,使表情面板在表情库较大时依然保持打开速度。v3.1.5 的改进正是围绕该加载路径的细节优化。此外,putEmojis会把自定义表情注册进 Lute 解析器,注释中明确说明 Lute 为所有编辑器共享单例,PutEmojis只需调用一次(putEmojis 实现),这也是表情加载链路的一部分。

改良 CSDN 剪藏与链滴剪藏

CSDN 剪藏(问题 #12313)与链滴剪藏(问题 #12368)属于网页剪藏解析器的站点适配改进。SiYuan 的剪藏流程是:浏览器剪藏内容提交到内核后,由内核的剪藏解析逻辑按站点特征提取正文,再落盘为块。该版本针对两个中文内容站点的正文抓取规则做了调整,属于规则层面的站点级修复,仓库中对应的能力入口为剪藏导入相关接口,使用者升级后直接重新剪藏受影响页面即可验证效果。

改进代码块行号渲染与空格行行号错误

该版本包含两条与代码块行号相关的记录:

  1. 改进代码块行号渲染(问题 #12317):优化编辑器中代码块行号 UI 的呈现;
  2. 修复仅含空格行导致的行号计算错误(问题 #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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询