SiYuan v3.0.9 更新解析:编辑期盘读优化、数据库(属性视图)排序与虚拟引用能力增强
【免费下载链接】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.0.9 的发布说明展开。该版本以「修复缺陷、降低编辑时磁盘读取用量」为主基调,集中改进了属性视图(数据库)的表格选择列、主键绑定块、空值排序、日期过滤与导入重建,同时对虚拟引用渲染、只读模式标题编辑等交互细节做了打磨。读完本文,你将清楚 v3.0.9 每一项变更背后的实际场景,并能在仓库源码中找到对应的实现证据。变更记录原文见 v3.0.9_zh_CHT.md(另有简体 v3.0.9_zh_CN.md 与英文 v3.0.9.md)。
一、版本概览
v3.0.9 属于 v3.0.x 维护线,其 changelog 明确给出的目标只有两条:修复若干缺陷、降低编辑时的磁盘读取用量。从变更条目构成看,真正占大头的是与「属性视图(Attribute View,即数据库)」相关的改进,其次是编辑器行为与块渲染细节的打磨。
该版本共包含14 项功能改进与4 项缺陷修复,后续章节将按其所属功能域重新组织,逐条展开。
二、属性视图(数据库)批量改进
v3.0.9 有近半数变更集中在属性视图上,覆盖表格选择、单元格编辑、主键、空值排序、搜索排序与块关系重建。属性视图后端实现位于 kernel/av,前端渲染层则与 app/src/protyle 相关。
2.1 表格视图选择列不设置默认选择(#10829)
在数据库表格视图中,新增的「选择(select)」列此前会自动套用默认选项,容易让用户在不经意间写入不符合预期的数据。v3.0.9 取消了这一默认行为,选择列在初始化时不再预先选择选项,将决定权完全交还给用户。这属于前端初始化逻辑的收敛,后端并未新增字段语义。
2.2 编辑单元格时,右键点击输入框外即保存(#10895)
此前在属性视图中编辑单元格文本时,若输入框失焦方式未被正确识别(例如通过右键菜单切换焦点),编辑内容可能不落盘。v3.0.9 增加了「在输入框外点击右键即视为提交保存」的交互路径,减少因失焦判定导致的编辑丢失。从 kernel/av/layout.go 与表格视图相关前端代码的结构看,单元格值统一通过值写入流程(见 kernel/av/value.go)持久化,本条改进实际是规范了触发该流程的 UI 时机。
2.3 改进数据库主键绑定块(#10945)
SiYuan 属性视图允许文档/列表块绑定主键(Primary Key),绑定关系本质上表现为块 IAL(Inline Attribute List)中的关联属性以及镜像/关联(mirror/relation)等底层结构。v3.0.9 对这一绑定逻辑做了改进,重点优化「解除绑定」与「重新绑定」时的关系一致性,相关关系重建逻辑可参考 kernel/av/av_fix.go 与 kernel/av/relation.go。
2.4 列名为空时图标对齐(#10950)
当属性视图的列名留空时,列头左侧的字段类型图标(如文本、日期、关联等标识)此前存在错位。该问题属于 CSS/列头渲染层面的排版瑕疵,v3.0.9 调整了空列名场景下的图标占位,保证列头整体对齐。
2.5 改进空值字段排序(#10951)
属性视图排序是后端主导的能力,核心入口为 kernel/av/sort.go 的Sort,值比较逻辑在该文件的Value.Compare(kernel/av/sort.go)中实现。v3.0.9 完善了空值(null/空字符串)与常规值混排时的次序规则,避免升序/降序下空值位置抖动或比较结果不稳定。这直接影响用户按某列排序时的可预期性,是典型的「看似小改动、底层涉及值类型比较策略」的修复。
2.6 改进「加入数据库」搜索排序(#10952)
「加入数据库(Add to Database)」面板用于搜索并选取要纳入当前数据库的文档/块。此前该搜索结果的排序与用户直觉不符,v3.0.9 对其排序策略做了优化,让用户更可能在靠前位置命中目标块。搜索实现可对照 kernel/search/find.go 与 kernel/av/layout.go 中数据库相关检索入口理解。
2.7 「加入数据库」后设置光标(#10958)
完成「加入数据库」操作后,此前焦点/光标位置可能停留在面板上,v3.0.9 将光标正确放回编辑器中被加入的块,保证操作后可以无缝继续输入。这是编辑器焦点管理的细节修正,涉及 app/src/protyle 编辑器的选区控制。
2.8 导入 .sy.zip 与重建索引时重建数据库块关系(#10959)
这是 v3.0.9 中数据一致性层面最重要的一条。.sy.zip是 SiYuan 文档树(含 .sy 文件与资源)的打包格式。当用户导入.sy.zip或在界面上重建索引后,属性视图与文档块之间的「块绑定关系」(块 -> 数据库、数据库 -> 块、关联字段反向关系等)可能丢失或错位,导致数据库中出现孤立行或无法反查来源块。
对应后端实现位于 kernel/model/import.go 的ImportSY流程:导入时会解析文档树中的属性视图节点,调用av.BatchUpsertBlockRel(kernel/model/import.go)批量重建块关系,并处理数据库存储目录data/storage/av/的迁移与加密写入。可以推断,该版本正是围绕这条导入链路补齐了索引重建路径下的关系回填,确保两类入口得到一致的数据库结构。
2.9 修复:关联字段搜索无法搜索某些值(#10966)
属性视图的「关联(relation)」字段支持在条件过滤中按关联目标搜索。v3.0.9 修复了部分关联值无法被检索命中、从而在过滤结果中缺失的问题。过滤求值核心在 kernel/av/filter.go 的evalNode/ kernel/av/filter.go 的evalLeaf,可结合Value.Filter(kernel/av/filter.go)理解关联值查找如何落到最终布尔判定。
2.10 修复:日期字段「介于」过滤器计算错误(#10967)
属性视图日期列使用「介于(Is between)」操作符做范围过滤时,部分区间计算出现偏差。运算符定义见 kernel/av/filter.go 的FilterOperatorIsBetween;日期类型分支在Value.filter的case KeyTypeDate(kernel/av/filter.go)处处理。v3.0.9 修正了边界时刻与相对日期(relativeDate)在范围判定中的换算,保证开始/结束时间都命中时结果正确。该修复同样属于相对日期换算这一类通用逻辑,对界面时间过滤与 SQL/API 条件均生效。
三、编辑体验与磁盘读取优化
3.1 编辑文档时减少磁盘读取(#10961)
v3.0.9 的另一核心主题即「降低编辑时的磁盘读取用量」。文档树读写相关的核心逻辑在 kernel/treenode/tree.go 与 kernel/model 的数据加载路径中。可以推断,此前文档每次编辑都会触发的若干次整树/整文件读取在 v3.0.9 被合并或延后,从而降低对存储介质的读压力。对机械盘或大文档场景,这一优化带来的编辑流畅度提升更明显。此条与导入重建(#10959)一样属于「数据层吞吐优化」,是少数几项并非直接可见、却直接影响长期使用体验的改动。
3.2 只读模式无法编辑展开标题(#10953,修复)
在只读模式(read-only)下,文档中处于「展开标题(expanded heading)」状态的标题块此前无法被正常编辑。v3.0.9 修复了该限制,使只读视图下仍能对展开的标题进行操作。标题块的读写与渲染逻辑可参考 kernel/treenode/heading.go 与 kernel/model/heading.go。
3.3 动态加载导致列表显示不完整(#10965,修复)
当文档较长时 SiYuan 会采用虚拟/动态加载策略渲染列表块。v3.0.9 修复了动态加载边界下部分列表项未被渲染、出现「内容看起来不完整」的问题,保证滚动加载后列表块内容齐全。相关渲染策略位于 app/src/protyle/wysiwyg 的块渲染层。
3.4 被引用块支持渲染虚拟引用(#10960)
虚拟引用(virtual reference)是 SiYuan 依据关键字自动关联目标块的能力。本版本增强为:被其他块引用的目标块,在其正文中也能正确渲染出指向它的虚拟引用标记,即从「被引用侧」补全可视化反馈。后端维护了块与虚拟引用关键字的关系缓存,相关实现见 kernel/model/virutalref.go 中的getBlockVirtualRefKeywords、CacheVirtualBlockRefJob与processVirtualRef;前端渲染判断可对照 app/src/protyle/wysiwyg/index.ts 中的引用匹配逻辑。此改动对使用虚拟引用做知识关联回看的用户非常实用。
3.5 改进表格块中的「↓」(#10971)
表格块内键入↓的行为得到改进。可以推断该改动涉及表格单元格内快速换行/追加行的快捷语义(↓常被用作在表格中新增下方行的触发字符),改进后交互更符合预期。表格块编辑实现可参考 app/src/protyle 下的块级渲染模块。
四、界面与交互细节打磨
- 标签列默认不显示水平滚动条(#10954):属性视图底部横向排列的默认标签列此前可能触发水平滚动条,v3.0.9 令其在默认状态下不显示横向滚动,仅当内容真正溢出时按需出现。
- 某些情况下出现水平滚动条(#10968):针对个别界面布局中异常冒出水平滚动条的情况做了清理,属于编辑器/面板宽高计算与滚动容器样式修正。
- 改进大纲拖放(#10969):侧边栏大纲(Outline)的拖放体验被改进。大纲通过块树生成,其结构与解析逻辑可见 kernel/model/outline.go 与 kernel/treenode/blocktree.go;本条优化了拖拽大纲条目调整标题/块位置时的命中与落点反馈,降低误操作概率。
五、如何获取该版本
v3.0.9 的正式发布渠道包括 B3log 官网下载页与 GitHub Releases。在仓库内,你可以直接阅读该版本完整的三种语言变更记录:
- 繁体中文:v3.0.9_zh_CHT.md
- 简体中文:v3.0.9_zh_CN.md
- English:v3.0.9.md
若希望理解后续功能演进,可在仓库的 v3.1.x 至 v3.7.2 目录中查看相邻版本的变更记录,作版本间行为差异的对照阅读。
六、小结
v3.0.9 是一个典型的「稳根基」版本:外在是 18 处交互与渲染细节的调整,内在则有两处值得长期关注的改进——属性视图空值排序与「介于」日期过滤的语义修正,以及编辑期磁盘读取用量下降。结合源码来看,多数数据库改动都能在 kernel/av/sort.go、kernel/av/filter.go、kernel/av/relation.go 与导入链路 kernel/model/import.go 中找到对应实现,虚拟引用与块关系能力则沉淀在 kernel/model/virutalref.go 与 kernel/model 层。对于属性视图重度用户与自托管部署者而言,升级到该版本即可直接受益于更稳定的排序过滤结果与更低的数据读取开销。
【免费下载链接】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),仅供参考