news 2026/9/10 20:24:40

思源笔记 v3.3.2 变更深度解析:数据库筛选与分组、剪藏优化及内核 API 改进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
思源笔记 v3.3.2 变更深度解析:数据库筛选与分组、剪藏优化及内核 API 改进

思源笔记 v3.3.2 变更深度解析:数据库筛选与分组、剪藏优化及内核 API 改进

【免费下载链接】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.3.2 版本的官方变更记录(v3.3.2_zh_CHT.md)为骨架,逐项拆解该版本在数据库字段编辑与筛选、分组视图性能、折叠标题复制、闪卡、剪藏扩展以及面向开发者的内核 API 增强等关键改进,并结合 kernel 与 app/src 的源码实现,说明各项变更背后的工作原理与实际应用场景。读完本文,你将完整掌握 v3.3.2 的功能增量、对应的问题背景,以及如何利用新增的disabledInPublish字段与改进后的appendBlock/insertBlock/prependBlock内核 API 进行插件开发与发布运维。

版本定位与概览

v3.3.2 是一个以“改进细节”为主的维护型版本。官方概述仅一句话——“該版本改進了一些細節”,但细看变更清单,可以发现该版本存在两条清晰的主线:

  1. 数据库(属性视图/Attribute View)体验集中优化:字段编辑菜单、汇总字段筛选、日期字段筛选、新增选项交互、跨分组拖拽同步、分组视图性能等 8 项以上改动,是本次版本的核心投入方向;
  2. 剪藏与编辑器输入链路的细节修复:HTML 表格剪藏改进、浏览器剪藏支持剪藏到数据库、拖入多个文件不再被默认程序打开、输入法粘贴链接标点重复等问题修复。

此外,面向开发者的变更包括:集市插件包元数据新增disabledInPublish字段、新增expandDocTree插件 API、改进内核 APIappendBlock/insertBlock/prependBlock

数据库(属性视图)体验集中改进

字段编辑菜单与选项交互改进

本版本对数据库字段的编辑交互做了三处针对性调整:

  • 改进数据库字段编辑菜单(对应 issue 15185):重构了字段编辑入口的菜单组织,使字段类型、属性配置等操作更清晰;
  • 数据库中新建数据如果在折叠分组内,不再弹出编辑框(issue 15728):此前在折叠的分组内新建数据会强制弹出编辑框,打断操作流,本版本改为直接创建,保持原有折叠状态;
  • 数据库新增选项时禁止编辑(issue 15751):新建选项的瞬间锁定编辑状态,避免在选项尚未落库时被误改导致数据不一致。

这些交互调整对应的是 kernel/av 下属性视图相关模块与 app/src/av 前端渲染层的配合逻辑。从源码结构看,属性视图的字段、选项、行数据均通过内核事务(transaction)机制落库,前端交互层在 v3.3.2 中收紧了选项新建与分组内新建的触发条件,属于典型的“减少误操作”型改进。

汇总字段筛选支持「任一」「所有」和「没有」

这是本版本数据库筛选能力的重要增强。此前汇总字段(rollup)的筛选只支持单一量词,v3.3.2 起支持三种量词:

  • 任一(Any):满足任意一个关联条件的行即命中;
  • 所有(All):必须满足全部关联条件的行才命中;
  • 没有(None):不满足任何关联条件的行命中。

内核侧的量词定义位于 kernel/av/filter.go:

FilterQuantifierUndefined FilterQuantifier = "" // 等同于 Any FilterQuantifierAny FilterQuantifier = "Any" FilterQuantifierAll FilterQuantifier = "All" FilterQuantifierNone FilterQuantifier = "None"

从源码可以看出:

  • 未显式指定量词(FilterQuantifierUndefined)时,行为等同于Any,保证旧数据的筛选语义兼容;
  • 三种量词在 filter.go 中分别由独立的分支处理(如case FilterQuantifierAny:case FilterQuantifierAll:case FilterQuantifierNone:),逻辑清晰可扩展。

配套的还有“改进数据库汇总字段筛选”(issue 15740)与“改进数据库日期字段筛选”(issue 15744)。日期字段筛选的改进包含一项重要修复:数据库日期字段无法粘贴 0 点时间(issue 15742)——此前粘贴形如00:00的时间会被判为无效,本版本修正了该解析路径。

跨分组拖拽同步与分组视图性能

  • 数据库条目跨分组拖拽后,同步更新其他视图中的分组(issue 15755):此前在表格/看板/画廊等多个视图并存时,条目从一个分组拖到另一个分组,其他视图的分组归属可能不刷新,v3.3.2 修复了该同步问题。这与 kernel/av/layout_table.go、kernel/av/layout_kanban.go、kernel/av/layout_gallery.go 等多个布局实现之间的数据一致性机制相关;
  • 提升数据库分组视图性能(issue 15764):针对分组(Group)视图在大数据量下的卡顿做了性能优化,涉及 kernel/av/group.go 中分组聚合逻辑的调用频次与缓存策略调整。

编辑器交互改进与剪藏增强

折叠标题的复制/剪切语义调整

v3.3.2 将折叠标题的复制/剪切改为复制/剪切「标题及其下方块」,并支持多标题复制/剪切(issue 8019)。这是一次语义修正:

  • 旧行为:折叠状态下复制标题,仅复制标题本身;
  • 新行为:复制/剪切操作作用于标题及其折叠区域内的全部内容块,且支持同时选中多个折叠标题批量操作。

该行为在编辑器层实现,涉及 app/src/protyle 中标题块(heading)与选区(range)处理逻辑的配合,用户在使用大纲折叠长文档后,可以更直觉地整段搬运内容。

代码块复制与语言选择细节

  • 代码块选择复制时仅复制纯文本(issue 15733):此前从代码块中框选复制会夹带编辑器内部 DOM 结构,粘贴到外部程序时格式异常;本版本改为仅复制纯文本内容;
  • 代码块语言提示搜索内容为空时使用默认排序(issue 15737):在代码块语言下拉框中输入关键字清空后,语言列表恢复默认排序,而非停留在上次过滤状态。

剪藏功能增强

  • 浏览器剪藏扩展支持剪藏页面到数据库(issue 15758):剪藏结果不再仅限于插入文档,还可以直接作为数据库(属性视图)的行数据写入,打通了“网页信息 → 结构化数据库”的采集链路;
  • 改进 HTML 表格剪藏(issue 15781):针对网页中复杂 HTML 表格(合并单元格、嵌套表格等)的剪藏转换质量做了优化,剪藏后表格结构与内容更接近原网页。

其他编辑器与输入修复

  • 拖入多个文件到编辑器不再被默认程序打开(issue/pull 15773):此前批量拖入文件时部分文件会触发系统默认程序打开,本版本修正为全部作为附件/嵌入内容插入编辑器;
  • 部分输入法在块末尾粘贴链接后标点符号重复插入(issue 15801):修复了中文输入法(如拼音类)在块末尾粘贴链接后出现标点重复的问题,属于输入法合成事件与编辑器粘贴处理冲突的边界修复;
  • 批量插入文件到编辑器时异常(issue 15768):修复批量插入场景下的崩溃或部分文件丢失问题;
  • 预览模式下无法设置只读模式(issue 15756):修复了预览(preview)场景下只读模式开关失效的问题。

其他体验改进

  • Android 隐藏底部手势导航栏(issue 15763):在 Android 端隐藏系统底部手势导航条,为编辑区腾出更多可视空间,涉及 kernel/mobile 与移动端界面的协同;
  • 点击无文档的笔记本时自动新建文件(issue 15782):当用户点击一个尚无任何文档的笔记本(notebook)时,自动新建一个默认文档,避免“空笔记本无法直接开始编辑”的困惑;
  • PDF 文件名过长无法生成标注图片(issue 15739,缺陷修复):PDF 标注(annotation)功能在文件名超长时无法生成标注图片,本版本修复了该路径下的文件名截断与图片生成问题;
  • 视频块网络网址不正确(issue 15741,缺陷修复):修正了视频块中网络视频地址解析异常的问题。

面向开发者:元数据字段与插件 API

代码片段与集市插件新增disabledInPublish字段

v3.3.2 为两类资源引入了disabledInPublish字段,用于在发布服务(Publish)中禁用特定代码片段/插件

  1. 代码片段(Snippets):新增字段disabledInPublish(issue 15806),用于识别发布服务中是否已停用;
  2. 集市插件包元数据:同步新增字段disabledInPublish(issue 11730),用于识别插件在发布服务中是否已停用。

内核侧的数据结构定义:

  • 代码片段配置结构体位于 kernel/conf/snippet.go:
type Snippet struct { ... DisabledInPublish bool `json:"disabledInPublish"` }
  • 插件元数据结构体位于 kernel/model/plugin.go,注释明确为 “Whether disabled in publish mode”;
  • 集市解析逻辑位于 kernel/bazaar/package.go 与 kernel/bazaar/plugin.go,安装插件时会将disabledInPublish一并解析出来。

在接口层,kernel/api/snippet.go 的代码片段读取接口会先判断当前上下文是否为发布环境:

isPublish := model.IsReadOnlyRoleContext(c) var snippets []*conf.Snippet for _, s := range confSnippets { if isPublish && s.DisabledInPublish { continue } ... }

也就是说,当请求来自发布服务(只读角色上下文)时,标记了disabledInPublish的代码片段会被直接跳过,不会注入发布页面。而在写入接口 setSnippet 中,disabledInPublish是可选的布尔字段(if nil != m["disabledInPublish"]),因此旧版客户端不传该字段也能正常保存,保证了向前兼容。

插件开发者的实用建议:如果你的插件或自定义 CSS/JS 代码片段依赖本地文件、仅限桌面端使用,或包含与发布场景冲突的逻辑,可在集市插件package.json元数据或代码片段配置中设置disabledInPublish: true,避免发布站点加载后出现样式错乱或脚本报错。

新增插件 APIexpandDocTree

v3.3.2 为插件系统新增了expandDocTree接口(issue 15639),用于在文档树中定位并展开指定文档或笔记本。

前端插件 API 定义位于 app/src/plugin/API.ts:

export const expandDocTree = async (options: { id: string, isSetCurrent?: boolean }) => { ... };

其核心逻辑:

  1. 先判断传入的id是笔记本还是文档:若在window.siyuan.notebooks中找到匹配,则视为笔记本;否则调用/api/block/getBlockInfo查询该文档所属的笔记本(box)与路径;
  2. 在文件树(文件侧边栏)中选中对应条目,isSetCurrent默认为true,即展开的同时将该条目设为当前选中项;
  3. 若条目的折叠箭头已处于展开状态(b3-list-item__arrow--open),则直接返回,避免重复加载子树;否则调用file.getLeaf(liElement, notebookId)懒加载子节点并展开。

该 API 对自动化插件(例如:导入文档后自动定位到新文档、跳转到指定笔记本下的某个文档)非常实用,无需再自行模拟点击文件树节点。

内核 APIappendBlock/insertBlock/prependBlock改进

v3.3.2 改进了内核 APIappendBlockinsertBlockprependBlock(issue 15798)。这三个 API 的底层实现位于 kernel/api/block_op.go:

  • appendBlock(kernel/api/block_op.go):向指定容器块末尾追加内容。仅使用parentID定位目标,且目标必须是容器块(treenode.CheckContainerParent校验),否则视为非法嵌套直接报错;支持dataType: "markdown",此时会通过dataBlockDOM将 Markdown 转换为块 DOM 后再写入;
  • prependBlock(kernel/api/block_op.go):向指定容器块开头插入内容,参数与校验逻辑与appendBlock对称,使用prependInsert动作;
  • insertBlock(kernel/api/block_op.go):在指定位置中间插入内容,支持通过parentIDpreviousIDnextID三个定位参数组合确定插入点(三者均为可选),灵活度最高。

三个 API 的共同点是:最终都会构造事务(model.Transaction)并调用model.PerformTransactionsmodel.FlushTxQueue落库,随后通过broadcastTransactions将变更广播给前端实时刷新。v3.3.2 的改进主要在于定位参数容错、非法嵌套校验提示以及 Markdown 转换链路的健壮性,插件开发者在使用这三个 API 时应注意:

  • 目标块必须是容器块(文档、列表、引用块等),否则接口返回错误;
  • dataType支持"markdown"与块 DOM(dataBlockDOM格式)两种;
  • insertBlock的定位参数可同时省略多个,但需至少提供一种有效定位方式,否则无法确定插入点。

下载与升级方式

v3.3.2 的官方分发渠道为:

  • B3log 官网下载页;
  • GitHub Releases 页面。

用户可直接覆盖安装对应平台的安装包,工作区数据(data目录)无需迁移,升级后首次启动会自动执行内核与索引的一致性检查。本仓库中的完整变更历史可参阅 app/changelogs 目录,其中 v3.3.x 系列更新记录位于 app/changelogs/v3.3.x,当前版本的中文(简体)变更说明见 v3.3.2.zh-CN.md,繁体中文见 v3.3.2.zh-TW.md,英文见 v3.3.2.md。

小结

v3.3.2 作为思源笔记 v3.3.x 周期中的一次细节改进版本,其技术增量可归纳为三条主线:

  1. 数据库体验:汇总字段筛选量词扩展(任一/所有/没有)、字段编辑与选项交互收紧、跨视图分组同步与分组视图性能提升;
  2. 编辑器与剪藏:折叠标题整段复制/剪切、代码块纯文本复制、HTML 表格与数据库剪藏增强、若干输入与文件拖拽缺陷修复;
  3. 开发者能力disabledInPublish发布禁用机制(代码片段 + 插件元数据)、expandDocTree插件 API、三个块插入内核 API 的健壮性改进。

对于日常用户,升级后可重点关注数据库筛选量词与折叠标题复制这两项高频操作的变化;对于插件开发者,disabledInPublishexpandDocTree则是可直接投入使用的增量能力。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 20:24:33

真空粉末分散器技术解析与应用实践

1. 项目概述:真空粉末分散器的多场景革命实验室里那堆结块的纳米材料又让我头疼了——传统搅拌器根本打不散,超声处理又怕破坏晶体结构。直到上个月在材料学研讨会上看到梓梦ZMD800的演示:30秒内把板结的碳化硅粉末分散得像烟雾般均匀。这台看…

作者头像 李华
网站建设 2026/9/10 20:24:16

expo-image 深度指南:Expo 跨平台高性能图片组件完全解析

expo-image 深度指南:Expo 跨平台高性能图片组件完全解析 【免费下载链接】expo An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web. 项目地址: https://gitcode.com/GitHub_Trending/ex/expo …

作者头像 李华
网站建设 2026/9/10 20:19:29

C/C++二维数组格式化输出技巧详解

1. 二维数组格式化输出实战指南 在C/C编程中,二维数组的输出格式化是个看似简单却暗藏玄机的操作。今天我们就来深入探讨如何通过"%-4"和"%4d"这两种格式化方式,实现二维数组的整洁对齐输出。这不仅是基础功的体现,更关系…

作者头像 李华
网站建设 2026/9/10 20:18:07

费马大定理的代码化实现与数学验证实践

1. 项目概述 在数学与计算机科学的交叉领域,费马大定理(Fermats Last Theorem)一直是个引人入胜的话题。这个由皮埃尔德费马在17世纪提出的猜想,直到1994年才被安德鲁怀尔斯最终证明。定理简单表述为:当整数n>2时&a…

作者头像 李华
网站建设 2026/9/10 20:17:27

假期作业三:极简技术栈实现情绪记账、自动备份与实时数据看板

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华