ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

思源笔记 v3.1.16 版本详解:数据库体验、模板新函数、自动同步与稳定性改进

思源笔记 v3.1.16 版本详解:数据库体验、模板新函数、自动同步与稳定性改进 思源笔记 v3.1.16 版本详解数据库体验、模板新函数、自动同步与稳定性改进【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan思源笔记SiYuanv3.1.16 是一次以细节改进为主的版本更新围绕数据库属性视图单元外观、模板函数、自动同步、资源文件加载、移动端查找替换等核心场景进行了针对性优化并修复了一批影响日常使用的缺陷。本文以该版本的官方变更记录为骨架结合仓库源码逐项解析这些改进背后的实现原理帮助你理解每个改动的作用、适用场景与底层逻辑。版本概览与定位v3.1.16 属于思源笔记 v3.1.x 系列的一次小版本迭代官方概述将其定位为改进了部分细节。从变更记录来看本次版本共包含23 项功能改进覆盖数据库外观与交互、模板函数、同步、导入导出、资源文件加载、移动端能力、国际化等多个方面1 项功能移除移除 Sentry 诊断数据上报6 项缺陷修复涉及大纲面板、代码块粘贴、文档回滚、搜索语法、输入法兼容与安全漏洞1 项开发者相关更新新增推送更新块 ID 事件。在阅读以下细节之前需要明确的是该版本是面向最终用户的发布版本其变更记录位于 app/changelogs/v3.1.x/v3.1.16/ 目录下同时提供简体中文v3.1.16_zh_CN.md、繁体中文v3.1.16_zh_CHT.md与英文v3.1.16.md三个语言版本。数据库属性视图体验全面优化数据库属性视图是本次更新中改进密度最高的模块共涉及 5 项改动可见官方对数据库交互细节的重视。数据库单元外观与主键字段图标改进数据库单元外观对数据库中单元格的视觉样式进行了统一调整改善了信息密度与可读性改进数据库选择字段的颜色与布局选择字段单选/多选的颜色方案与布局进行了重新设计使不同选项之间的区分更直观数据库主键字段显示绑定文档块图标主键字段现在会显示其绑定文档块的图标帮助用户在表格视图中快速识别主键对应的文档来源。这三项改动均属于前端交互层面的调整其数据模型与渲染逻辑分散在 kernel/av/属性视图数据层与 app/src/protyle/前端渲染层中。其中主键字段图标功能与数据库的绑定文档块能力直接相关主键值本质上引用的是文档块 ID其图标正是通过块树block tree查询得到的文档图标。数据库搜索结果输入法兼容本次修复了使用微软拼音在数据库搜索中无法输入中文字符的问题。该问题属于输入法组合态composition事件在搜索输入框中的处理缺陷修复后可以确认在 app/src/search/ 与数据库搜索相关的前端代码中输入事件对 IME 组合文本的处理得到了完善从而保证微软拼音等输入法在数据库搜索场景下可以正常输入中文。新增两个模板函数statBlock与querySQL本次更新为模板引擎新增了两个内置函数statBlock与querySQL分别用于统计块内容与执行 SQL 查询。statBlock块内容统计函数statBlock(id)接收一个块 ID返回该块的统计结果可用于文档字数统计、链接数统计等模板场景。从源码实现来看该函数定义在 kernel/filesys/template.go并通过BuiltInTemplateFuncs注册进模板函数表其核心实现在 kernel/filesys/stat.go对于文档块ast.NodeDocument会统计整棵文档树返回字符数、字数、链接数、图片数、引用数以及块数对于普通块则只统计该块本身BlockCount固定为 1。一个值得注意的细节是当文档内嵌数据库属性视图时statTree会遍历文档中的属性视图块把数据库单元格内的 URL、图片、引用块、文本、数字、邮箱、电话等字段内容一并纳入统计见 kernel/filesys/stat.go这意味着statBlock统计出的字数比单纯阅读文档正文更接近文档实际包含的全部信息量。在模板中的典型用法如下{{ $stat : statBlock 20210808180117-6v0mkxr }} 本文字数{{ $stat.WordCount }} 图片数量{{ $stat.ImageCount }}返回结构BlockStatResult包含RuneCount字符数、WordCount字数、LinkCount链接数、ImageCount图片数、RefCount引用数与BlockCount块数六个字段。querySQLSQL 查询函数querySQL(stmt)接收一条 SQL 语句执行后返回结果行map 列表可用于构建统计某笔记本块数量按标签聚合等动态模板。其实现位于 kernel/sql/database.go有两个关键约束值得注意单语句校验执行前会调用CheckSingleStatement校验语句是否为单条 SQL防止注入与多语句执行结果数量上限最多返回 1024 行结果超出部分会被截断。从源码结构看该函数与既有的queryBlocks、querySpans函数同属 SQL 模板函数族注册于SQLTemplateFuncs见 kernel/sql/database.goqueryBlocks用于查询块对象、querySpans用于查询行级元素而querySQL则提供最底层的原生 SQL 能力灵活性最高同时也要求使用者具备一定的 SQL 基础。模板中的典型用法{{ $rows : querySQL SELECT COUNT(*) AS c FROM blocks WHERE box_id 20210808180117-6v0mkxr }} 笔记本块总数{{ (index $rows 0).c }}与这两个函数一并值得说明的是由于安全原因本次模板函数表同时移除了env、expandenv、getHostByName三个函数见 kernel/filesys/template.go对应修复一些安全漏洞条目避免模板在不可信场景下读取环境变量或执行 DNS 查询。自动同步支持自定义同步间隔本次更新新增了设置自动同步间隔能力用户可以手动调整自动同步的频率而不再依赖固定的同步节奏。配置项与取值范围同步配置结构定义在 kernel/conf/sync.go其中新增的Interval字段即自动同步间隔单位为秒默认值30 秒见NewSync()kernel/conf/sync.go最小限制30 秒最大限制43200 秒即 12 小时。当传入的值超出该范围时会被钳制到边界值见SetSyncIntervalkernel/model/sync.go。实现链路设置间隔的完整链路为前端调用POST /api/sync/setSyncInterval接口路由注册见 kernel/api/router.go接口处理器解析 JSON 参数interval后调用model.SetSyncInterval见 kernel/api/sync.goSetSyncInterval更新配置并保存同时调用planSyncAfter重新规划下一次自动同步时间。planSyncAfter的实现非常简洁它只是把全局的syncPlanTime设置为当前时间 指定间隔见 kernel/model/sync.go同步调度器会持续检查该时间点来决定是否触发同步。与固定间隔兜底的配合尽管间隔可配置内核仍保留了一个兜底机制当自动同步因网络不可用等原因失败时会通过fixSyncInterval5 分钟规划重试而不是立即按用户配置的间隔重试避免高频失败重试拖垮系统见 kernel/model/sync.go。此外IncSync在每次有内容变更后也会按当前配置的Conf.Sync.Interval重新规划同步kernel/model/sync.go。需要说明的适用前提自动同步间隔只影响自动同步模式Mode1若用户选择手动同步或完全手动模式则该配置不会触发定时同步行为。移动端与多平台能力增强移动端查找替换与资源文件历史本次更新支持在移动端使用查找替换与资源文件历史功能补齐了此前移动端与桌面端的功能差距。移动端相关代码集中在 app/src/mobile/资源文件历史则由内核侧的 kernel/model/history.go 提供历史记录查询支撑。移动文档窗口保留上次搜索关键字文档树顶部的文档搜索窗口现在会记住上次输入的关键字切换文档后无需重新输入属于明显的使用体验改善。浏览器环境面板 stickTab 图标允许在浏览器环境中使用面板中的stickTab钉住标签页图标此前该能力可能仅面向桌面客户端环境。相关改动可在 app/src/ 的标签页管理代码中找到对应实现。编辑、导入导出与资源文件改进多重选择列表项保持选中状态对列表项进行缩进/减少缩进操作后原本处于多重选中状态的块会继续保持选中避免因结构调整而丢失选区对长文档的批量结构调整很有价值。改进行级元素解析与图片粘贴光标定位改进行级元素解析内核使用 Lute 解析引擎对行级元素如加粗、行内代码、数学公式等的解析进行了优化相关解析逻辑由 kernel/util/lute.go 调用 Lute 引擎完成改进粘贴图片后的光标定位粘贴图片后光标会正确落在图片之后而非停留在图片之前或中间改善了图文混排时的输入节奏改进图片的Del行为光标位于图片附近时按下 Delete 键的行为更加符合直觉避免误删或删除后光标位置异常兼容图片遗留数据对历史版本遗留的图片数据格式进行了兼容处理降低升级后的数据迁移风险。改进导入 Markdown 与导出数据改进导入 Markdown 文件Markdown 导入的解析与渲染细节得到优化导入后的文档结构更贴近源文件改进导出数据导出的数据包在完整性或结构上进行了改进导出功能入口位于 kernel/api/export.go改进资源文件加载性能资源文件图片、附件等的加载性能得到优化对包含大量资源的文档打开速度有积极影响。资源管理相关实现可参考 kernel/model/assets.go 与 kernel/model/assets_watcher.go。界面与交互细节改进改进文件标签交互文档标签tag的交互方式得到改进包括标签的添加、移除与展示行为相关实现位于 kernel/api/tag.go 与前端标签渲染代码中。改进在当前标签页中打开时的前进与后退启用在当前标签页中打开选项后文档间的历史前进/后退行为得到修正避免在同一标签页内来回切换时历史栈混乱。搜索预览区域支持行级备注定位搜索结果的预览区域现在支持定位到行级备注marker即搜索结果可以跳转到匹配的行级元素位置配合 app/src/search/ 中的预览渲染逻辑使用。改进字体系列与表情符号字体系列与表情符号渲染得到改进。思源内置了 JetBrainsMono、LxgwWenKai霞鹜文楷与 Noto COLRv1 表情字体本次更新对字体回退与表情符号显示进行了优化可在 app/appearance/fonts/ 目录中查看内置字体资源。新增阿拉伯语支持通过社区的贡献pull request思源新增了阿拉伯语界面支持语言文件位于 app/appearance/langs/ar.json。目前思源在 app/appearance/langs/ 目录下已提供包括简体中文zh-CN.json、繁体中文zh-TW.json、英语、日语、韩语、阿拉伯语等在内的二十余种界面语言。缺陷修复稳定性与安全大纲面板更新覆盖内容修复了大纲面板刷新时可能覆盖当前浏览内容的问题避免用户在大纲与正文间切换时丢失阅读位置。粘贴代码块缺少换行修复了从外部复制代码块粘贴到思源时末尾缺少换行符的问题确保粘贴后的代码块在渲染与导出时格式正确。回滚文档后编辑器未自动刷新修复了执行文档历史回滚后编辑器内容未自动刷新的问题。回滚操作由内核侧 kernel/model/history.go 执行本次修复确保回滚后前端能够收到数据变更并重新渲染。无法使用查询语法搜索修复了搜索功能无法使用查询语法query syntax的问题。查询语法是思源搜索的高级能力入口在搜索下拉菜单中对应querySyntax语言项见 app/src/search/menu.ts支持按块类型、属性、SQL 等条件组合检索。安全漏洞修复本次更新修复了若干安全漏洞与模板函数改动直接相关的部分是移除了模板函数表中的env、expandenv、getHostByName三个函数见 kernel/filesys/template.go这三个函数分别允许模板读取环境变量、展开环境变量字符串、解析主机名在模板来源不可信的场景下存在信息泄露与 SSRF 风险。隐私移除 Sentry 诊断数据上报本次更新移除了 Sentry 报告诊断数据的功能对应 issue #13522进一步强化了思源隐私优先的产品定位。移除后内核代码中不再包含 Sentry 上报相关逻辑运行数据不再外发至第三方诊断平台。开发者能力推送更新块 ID 事件面向插件开发者本次新增了推送更新块 ID 事件能力当块的 ID 发生更新如文档复制、移动等产生新 ID时内核会向前端推送事件通知。插件可通过监听该事件同步块 ID 变化保持插件缓存与文档数据的一致性。事件推送机制基于内核与前端之间的 WebSocket 通道相关基础设施可参考 kernel/plugin/websocket.go。小结v3.1.16 虽然定位为细节改进版本但实际覆盖面相当广数据库交互细节打磨、statBlock与querySQL两个模板函数的加入显著增强了模板的自定义能力可配置的自动同步间隔让数据备份节奏更灵活移动端功能补齐与多语言扩展则进一步降低了使用门槛。对于日常用户而言升级到该版本后可重点关注数据库外观变化、新的模板函数用法以及在设置中调整符合自身习惯的自动同步间隔。【免费下载链接】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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进