思源笔记 v3.5.8 版本更新详解:编辑器交互、表格能力与跨平台稳定性改进
导读
本文基于思源笔记(SiYuan)开源仓库中 v3.5.8 版本变更记录,系统梳理该版本在编辑器交互、表格编辑、导入导出、移动端体验与桌面端稳定性等方面的 16 项功能改进、7 项缺陷修复与 1 项开发重构。文章不仅完整呈现每一项变更的实操影响,还结合仓库源码(app/src 与 kernel)说明其底层实现逻辑,帮助读者理解"这次更新改了什么、为什么这么改、以及如何用好这些新能力"。
一、版本总览
v3.5.8 是一个典型的"细节打磨"版本:没有破坏性的大功能上线,而是围绕日常使用频率最高的编辑器交互、表格操作、资源文件管理与剪藏导入场景做集中优化,同时修复了多个影响 Windows、HarmonyOS、iPhone 与 Android 设备的关键缺陷,并将桌面端 Electron 运行时升级至 v39.6.1。
- 改进功能(Enhancement):16 项
- 修复缺陷(Bugfix):7 项
- 开发重构(Refactor):1 项
下文按"编辑器与布局""表格编辑能力""资源与导入导出""移动端体验""RTL 显示"五大主题展开,再单独说明缺陷修复与开发重构。
二、编辑器与布局:更顺手的日常操作
1. 拖动块图标到停靠面板时编辑器不再滚动
此前将文档块图标(块标)直接拖拽到左右停靠面板时,编辑器会跟随鼠标产生不必要的滚动,导致拖拽定位困难。本版本修复了该行为,拖拽过程中编辑区保持静止。
从源码结构看,窗口分屏与拖拽布局的核心逻辑集中在 app/src/layout/Wnd.ts:其中 split(direction, after) 方法负责将窗口按 "tb"(上下)或 "lr"(左右)方向拆分,拖拽事件则通过 dataTransfer.getData(Constants.SIYUAN_DROP_FILE) 等数据通道完成跨窗口传递。此次修复即是对拖拽过程中编辑区滚动触发的抑制,让"拖块标停靠"这一高频手势更加精准。
2. 图表宽度变化后自动重新渲染
当文档中嵌入的图表(如图表块)所在容器宽度发生变化(如窗口缩放、切换分屏布局)时,图表不再保持旧尺寸或出现渲染错位,而是自动触发重新渲染以适配新宽度。这对于需要频繁调整窗口布局、将文档在分屏与整页之间切换的用户尤其友好,保证图表始终与版面同步。
3. 支持配置"打开页签时不分屏"
这是本版本新增的一项布局设置能力。此前某些页签(如特定类型的文档或面板)打开时会触发分屏行为,用户无法控制;现在可以在设置中显式配置,使指定页签打开时保持单窗口不分屏,避免打断当前的编辑流。
布局系统在源码中由 app/src/layout/index.ts、app/src/layout/tabUtil.ts、app/src/layout/util.ts 协同管理:util.ts 负责布局树的序列化与反序列化(layoutToJSON、按 "instance": "Wnd" 还原窗口),Wnd.ts 负责窗口的 split 拆分布局。所谓"分屏"本质是在 Layout 下新建一个 Wnd 子节点,而"不分屏"即直接在当前 Wnd 中追加 Tab。该配置项的引入,就是在打开页签时根据配置决定走 split 还是直接 addTab 分支,让用户按自己的习惯决定哪些页签可以独占当前窗口。
4. 修复对话框交互后 Windows 上的焦点问题(PR #16862)
Windows 平台上,关闭某些对话框(如设置、搜索等模态窗口)后,编辑器有时无法重新获得键盘焦点,导致快捷键失灵。本版本通过 PR #16862 修复了该焦点回归问题,确保对话框交互结束后焦点正确返回编辑器,Windows 用户的键盘操作流不再中断。
5. 修复 main.js 在启动时的偶发报错
在特定环境下(如系统主题、缩放比例或启动参数组合异常),桌面端主进程 main.js 会在启动阶段抛出错误。本版本修复了该启动路径上的异常处理,提升了桌面端启动的健壮性。
三、表格编辑能力:从单元格到行列结构
1. 支持为表格设置标题
普通表格块新增"设置标题"能力。设置后,表格会拥有一个独立的标题行,用于描述表格内容,在大纲、块引用与导出场景中更容易被识别和定位。这使表格从"纯数据容器"升级为"可命名内容块",对长文档中的多表格管理非常实用。
2. 合并单元格后改进换行处理(br)
此前合并单元格后,单元格内原有的换行标记(<br>)可能出现多余空行或换行丢失的问题,影响阅读与排版。本版本优化了合并后 br 元素的清理与保留逻辑,使合并结果更贴近用户预期。
3. 表格右键菜单支持一键插入多行多列
这是表格编辑效率的一次显著提升。此前插入行/列只能逐行逐列操作,本版本在表格右键菜单中新增"插入多行/多列"入口:通过数量输入框一次性指定插入的行数或列数,即可批量插入。
从源码看,表格与数据库表(Attribute View)的行操作共享同一套插入逻辑。在 app/src/protyle/render/av/action.ts 中,右键菜单项 insertRowBefore / insertRowAfter(表格为"在前/后插入行",数据库表为"在前/后插入条目")的模板内嵌了一个 <input type="number" step="1" min="1" value="1"> 数字输入框,用户在菜单中填入数量后调用 insertRows 完成批量插入——这正是 v3.5.8 "一键插入多行多列" 的菜单实现载体。插入列的逻辑与之对称,位于同目录的列操作模块中。对大量结构化数据录入(如批量粘贴表格、整理数据矩阵)来说,该能力可以明显减少重复右键操作。
四、资源文件与导入导出:数据流转更完整
1. 改进导入 .sy.zip
.sy.zip 是思源笔记的文档打包交换格式,用于在实例之间迁移单个或多个文档。本版本改进了导入流程的健壮性与兼容性。导入的底层实现在 kernel/api/import.go 的 importSY 函数中:通过 c.MultipartForm() 接收上传文件,将文件写入 util.TempDir/import 临时目录,并以 gulu.File.IsSubPath(importDir, writePath) 做路径穿越校验防止越界写入,随后解析并导入文档树。改进后,导入较大或结构较复杂的 .sy.zip 时失败率更低、错误提示更明确。
2. 修复 Windows 上无法导出资源文件
此前 Windows 平台上,导出文档(如导出为 HTML、PDF 等)时资源文件(图片、附件等)可能无法被正确写入导出包。本版本修复了该问题,确保 Windows 下导出的文档资源完整可用。
3. 修复导出 Markdown 时未导出任何资源文件
这是一个影响面较广的数据完整性缺陷:在特定条件下执行"导出 Markdown"时,导出的 .md 文件正文正常,但资源文件(图片等)没有被一并导出,导致换端后图片全部丢失。本版本修复后,Markdown 导出会按预期将引用的资源文件一并打包输出。
资源导出的相关逻辑位于 kernel/model/export.go:Markdown 导出走 ExportPandocConvertZip 分支(pandocFrom = "gfm+footnotes+hard_line_breaks"、pandocTo = ""、扩展名 .md),资源文件收集与打包在同一导出管线中完成,此次修复即保证了该管线在 Windows 与 Markdown 场景下资源文件的完整收集。
4. 在 Windows 和 macOS 的资源文件菜单中支持复制文件(PR #17049)
此前资源文件(asset)的右键菜单在 Windows / macOS 上缺少"复制"入口,用户需要先下载再另存。本版本通过 PR #17049 为桌面端资源文件菜单补齐了"复制文件"能力,复制后可直接粘贴到文件管理器或其他位置,简化了取用资源的路径。
5. 微软商店版本不再自动设置 Pandoc 参数
Pandoc 是思源笔记文档格式转换(导出 docx、odt 等)的核心依赖。此前在所有平台上,导出初始化时都会自动为 Pandoc 追加 --reference-doc <模板路径> 参数以套用默认参考文档模板;但由于微软商店(Microsoft Store)沙箱环境的文件访问限制,自动注入的模板路径在商店版中可能失效。
修复策略清晰体现在 kernel/model/conf.go 的初始化逻辑中:
params := util.RemoveInvalid(Conf.Export.PandocParams)
if !strings.Contains(params, "--reference-doc") && "" != util.PandocTemplatePath && !Conf.System.IsMicrosoftStore {
params += " \"" + util.PandocTemplatePath + "\""
Conf.Export.PandocParams = strings.TrimSpace(params)
}
即:仅当当前构建不是微软商店版本(!Conf.System.IsMicrosoftStore)时才自动追加 --reference-doc;商店版用户可在"设置 → 导出"中手动配置 Pandoc 参数(Conf.Export.PandocParams)以获得相同效果。导出时,kernel/model/export.go 会先校验 Pandoc 可执行文件有效性(util.IsValidPandocBin),再对参数做换行归一化(util.ReplaceNewline)后拼装命令行执行。这避免了商店版因模板路径不可访问而导致的转换失败。
6. 改进将块引用导出为脚注
文档导出(如导出为 Markdown / Word 等)时,块引用(Block Reference)可以选择转换为脚注形式输出。本版本优化了转换质量,使被引用的内容在导出后以标准脚注呈现,同时修正了此前脚注编号或位置可能错乱的问题,提升了跨格式引用的可读性。
五、HTML 剪藏:更准确的内容捕捉
网页剪藏是思源笔记高频入口,本版本针对两类常见剪藏失真场景做了专项改进:
- 改进 HTML 列表剪藏:此前从网页复制/剪藏嵌套列表(
<ul>/<ol>多级结构)时,层级关系可能出现丢失或错乱;本版本优化了列表结构解析,保证多级列表剪藏后层级完整。 - 改进 HTML 块级元素中嵌套行级元素的剪藏:网页中常见的"块级容器内混排行内元素"(如
<div>中包含<span>、<a>等)结构,此前剪藏时可能丢失内联样式或内容顺序;本版本改进了嵌套解析,使复杂 HTML 结构剪藏后内容与样式更接近原网页。
这两项改进共同提升了"从网页到笔记"的内容保真度,对经常使用剪藏功能的资料收集型用户价值明显。
六、移动端体验:闪卡交互与输入体验
1. 改进闪卡交互
闪卡(Flashcard)是思源笔记的间隔重复复习功能。本版本优化了闪卡复习过程中的交互细节,使"显示答案、标记熟悉/生疏"等操作的响应更流畅。
闪卡相关的配置集中在 app/src/config/tabs/flashcardTab.ts(由 app/src/config/setting/tabs.ts 注册调用),运行态配置在 app/src/config/tabs/flashcardRuntime.ts。其中可配置项包括:
- 制卡范围:
flashcard.mark(标记为闪卡)、flashcard.list(列表块)、flashcard.heading(标题块)、flashcard.superBlock(超级块)作为闪卡来源; - 复习参数:
flashcard.reviewMode(复习模式)、flashcard.newCardLimit/flashcard.reviewCardLimit(新卡/复习卡数量上限)、flashcard.requestRetention(目标记忆保持率,对应 FSRS 间隔重复算法参数)。
v3.5.8 对闪卡交互的改进正是在这一配置体系之上对复习界面与操作反馈的打磨。
2. 改进移动端的资源文件编辑界面
在移动端(iOS / Android)编辑资源文件(如图片属性、附件信息)时,此前的界面在窄屏上存在控件拥挤、操作路径不直观的问题。本版本重构了移动端资源编辑界面,使其更适配触屏操作。
3. 修复 iPhone 上编辑器滚动缓慢
iOS Safari / WebView 上,长文档滚动时偶发明显卡顿。本版本优化了 iPhone 端编辑器的滚动行为,使长文档的浏览与定位更加流畅。
4. 修复部分 Android 设备上键盘弹出后自动收起
在部分 Android 机型上,点击输入区域时软键盘弹出后会立即自动收起,导致无法输入。本版本修复了该输入法交互问题,保证键盘行为稳定。
七、RTL 语言支持:数学、表格、图表与代码块显示改善
思源笔记支持从右到左(RTL)排版语言(如阿拉伯语、希伯来语)内容。本版本集中改善了两类块级内容在 RTL 文档中的显示:
- 数学公式块:行内/块级公式在 RTL 上下文中不再出现符号方向错乱;
- 表格、图表与代码块:这三类"宽元素"在 RTL 排版中此前可能存在对齐或滚动方向异常,本版本统一改善了它们的显示,使 RTL 用户在多语言混排文档中也能获得一致的阅读体验。
八、缺陷修复清单(Bugfix)
除上述已展开说明的修复外,本版本还包含以下针对性缺陷修复:
| 缺陷 | 影响场景 | 修复效果 |
|---|---|---|
| 浮动窗口中删除焦点块导致控制台错误 | 在浮动窗口(如浮窗中打开文档)内删除当前聚焦块 | 不再产生控制台报错 |
| 鸿蒙(HarmonyOS)系统升级后白屏或崩溃 | 鸿蒙端升级到新版本后首启 | 恢复正常启动与使用 |
| 某些情况下 main.js 启动时报错 | 特定环境组合下桌面端启动 | 启动异常被正确兜底处理 |
九、开发重构:Electron 升级至 v39.6.1
本版本将桌面端运行时从旧版 Electron 升级至 v39.6.1,这是本次唯一的 Refactor 项(issue #17067)。升级带来浏览器内核(Chromium)与 Node.js 运行时的安全补丁和性能改进,为后续桌面端功能迭代奠定基础。
在仓库中可以印证 Electron 版本策略:当前 app/package.json 中桌面端声明依赖为 "electron": "42.6.1"(master 分支已推进到更高版本),并通过 "install:electron" 脚本支持使用 ELECTRON_MIRROR 镜像源安装,"dist" 系列脚本则通过 electron-builder 按平台打包(electron-builder.yml、electron-builder-arm64.yml、electron-builder-darwin.yml、electron-builder-linux.yml 等配置分别对应不同目标平台与架构)。v3.5.8 稳定版固定使用 v39.6.1,用户在升级后即可获得该版本对应的运行时改进。
十、升级与下载
v3.5.8 的变更记录同时提供简体中文(v3.5.8_zh_CN.md)、繁体中文(v3.5.8_zh_CHT.md)与英文(v3.5.8.md)三个版本,历史版本记录可参见 app/changelogs 目录按版本号组织的完整变更文档。
升级建议:
- 桌面端(Windows / macOS / Linux):在应用内"设置 → 关于"中检查更新,或通过官方发布渠道获取对应平台安装包;
- 移动端(iOS / Android)与鸿蒙端:从各自应用商店获取更新;
- 命令行用户:可使用思源内核的 kernel/cli/cmd 相关命令辅助运维部署(仓库内的 entrypoint.sh 展示了 Docker 等场景下的启动方式)。
由于本版本包含多处跨平台缺陷修复(Windows 资源导出、HarmonyOS 白屏、iPhone 滚动、Android 键盘等),建议受影响的用户尽快升级;若长期使用表格批量编辑、HTML 剪藏与 .sy.zip 导入导出功能,本版本的改进也能直接提升日常效率。
结语
v3.5.8 是思源笔记在"稳定与细节"方向上的一个扎实版本:它没有引入激进的新范式,而是把编辑器拖拽、分屏配置、表格批量插入、资源文件复制、Markdown 导出完整性、移动端输入体验、RTL 显示等高频痛点逐一打磨,并通过 Electron 升级夯实桌面端底座。对开发者而言,这些变更同样是一份很好的代码阅读地图——从 app/src/layout 的分屏与布局树,到 app/src/protyle/render/av/action.ts 的表格批量插入,再到 kernel/model/conf.go 与 kernel/model/export.go 的 Pandoc 参数与导出管线,每一处改进都可以在源码中找到清晰落点。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00