Joplin 2.6 新特性深度解析:按笔记本排序、笔记本图标、加密协作与同步性能优化
【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin
Joplin 2.6 是面向桌面端、移动端与命令行(CLI)三大平台同步发布的一次重要更新,围绕"笔记组织效率"与"同步可靠性"两条主线带来了多项实质改进:全新的排序按钮与按笔记本独立的排序规则、桌面与移动端均可使用的笔记本 emoji 图标、基于 Joplin Cloud / Joplin Server 的加密笔记本协作,以及同步启动、Markdown 编辑器分屏滚动、S3 同步与 HTML 导出等底层优化。本文将逐项拆解这些新特性的使用方式,并结合当前仓库源码(packages/lib/models/settings/builtInMetadata.ts、packages/lib/models/Folder.ts、packages/lib/SyncTargetAmazonS3.js 等)说明其背后的实现原理,帮助你在实际使用中更充分地利用这些能力。
一、按笔记本排序与排序按钮
1.1 笔记列表顶部的排序按钮
2.6 版本在笔记列表上方新增了排序按钮区域,这是本功能最直观的变化。通过该区域可以按以下字段对笔记排序:
- 修改时间(modification date)
- 创建时间(creation date)
- 标题(title)
- 自定义顺序(custom order)
每个字段都支持升序与降序两种方向,且方向切换会即时生效并持久化。按钮区截图如下:
从源码看,这套排序能力在底层由一组专门的内置设置驱动。在 packages/lib/models/settings/builtInMetadata.ts 中,排序字段定义如下:
'notes.sortOrder.field': { value: 'user_updated_time', type: SettingItemType.String, section: 'note', isEnum: true, public: true, appTypes: [AppType.Cli], label: () => _('Sort notes by'), options: () => { const noteSortFields = ['user_updated_time', 'user_created_time', 'title', 'order', 'todo_due', 'todo_completed']; // ... }, storage: SettingStorage.File, isGlobal: false, },由此可见,排序字段实际支持的可选值比发布说明列举的四种更丰富,完整枚举为:
| 字段值 | 含义 |
|---|---|
user_updated_time | 修改时间(默认值) |
user_created_time | 创建时间 |
title | 标题 |
order | 自定义顺序 |
todo_due | 待办事项截止时间 |
todo_completed | 待办事项完成时间 |
默认按"修改时间"排序;如果你大量使用待办事项,也可以切换到todo_due或todo_completed按截止/完成时间组织笔记。
1.2 全局排序与按笔记本独立排序
默认情况下,所选排序规则会应用到所有笔记本。2.6 新增了"按笔记本独立排序"能力:启用后,某个笔记本的排序规则只对该笔记本生效,不影响其他笔记本。
启用方式非常直接——在笔记本上右键,选择"Toggle own sort order"(切换自身排序顺序):
这一特性由 Kenichi Kobayashi 开发。它解决了不同场景下的实际痛点:比如"收件箱"希望按创建时间倒序,而"项目笔记"希望按自定义顺序排列,过去只能全局统一,现在每个笔记本可以各自为政。
1.3 背后的设置项与触发机制
除了排序字段本身,仓库中还定义了与之配套的若干设置项,可结合 CLI 或配置文件灵活调整:
notes.sortOrder.reverse(builtInMetadata.ts):布尔值,是否反向排序,默认true(即默认降序)。notes.sortOrder.buttonsVisible(builtInMetadata.ts):布尔值,是否在笔记列表顶部显示排序按钮,默认true,属于外观(appearance)配置分区。folders.sortOrder.field与folders.sortOrder.reverse(builtInMetadata.ts):这两个设置项表明"排序"能力同样延伸到了笔记本(文件夹)列表本身,并非只针对笔记。
源码注释还揭示了排序设置的联动机制:凡是名称以notes.sortOrder开头的设置项都是特殊设置,修改它会自动触发笔记列表的刷新(见 packages/lib/BaseApplication.ts 中的generalMiddleware()逻辑)。也就是说,用户在任何界面改动排序,整个笔记列表都会立刻按新规则重新渲染,无需手动刷新。
1.4 笔记与文件夹的排序实现
在 packages/lib/models/Note.ts 与 packages/lib/models/Folder.ts 中可以看到排序逻辑的落地:笔记排序在查询层按所选字段与方向组织结果;而文件夹树排序(Folder.sortFolderTree,见 packages/lib/models/Folder.ts)则默认按字母顺序排列,并递归应用到子文件夹。这与笔记列表的排序按钮是两套独立但互补的机制——一个管笔记,一个管笔记本目录树。
二、笔记本图标支持
2.6 起,桌面端与移动端都可以为笔记本关联图标。操作步骤为:右键点击笔记本 → 选择"Edit":
随后会打开新的笔记本编辑对话框,在这里可以修改笔记本标题,并为其分配一个图标。目前图标使用 emoji,发布说明也提到未来不排除支持自定义图标:
从实现层面看,笔记本图标并不是一个独立的数据库字段,而是以 JSON 字符串形式序列化存储的。在 packages/lib/models/Folder.ts 中可以看到:
public static serializeIcon(icon: FolderIcon): string { return icon ? JSON.stringify(icon) : ''; } public static unserializeIcon(icon: string): FolderIcon { if (!icon) return null; return { ...defaultFolderIcon(), ...JSON.parse(icon), }; } public static shouldShowFolderIcons(folders: FolderEntity[]) { // If at least one of the folder has an icon, then we display icons for all // folders (those without one will get the default icon). This is so that // visual alignment is correct for all folders, otherwise the folder tree // looks messy. return !!folders.find(f => !!f.icon); }其中值得注意的细节是shouldShowFolderIcons的设计:只要有一个笔记本设置了图标,所有笔记本都会显示图标位——没有图标的笔记本使用默认图标占位。这样做的目的是保证文件夹树的视觉对齐,避免部分笔记本有图标、部分没有导致的参差不齐。反序列化时则通过defaultFolderIcon()提供默认值,再与解析出的 JSON 合并,保证兼容性。
三、Joplin Cloud 上的加密笔记本协作
得益于此前几个版本在加密能力上的积累,2.6 起可以在 Joplin Cloud(或 Joplin Server)同步时,对加密笔记本进行共享与协作编辑。
使用前提非常明确:
- 共享双方都需要升级到 Joplin 2.6;
- 发起共享的一方需要开启端到端加密。
满足上述条件后,绝大多数流程由应用自动完成——尤其是应用会自动为参与协作的每个用户生成并分发所需的加密密钥,用户无需手动导出或交换密钥文件。
这一能力的关键价值在于:笔记本在云端是以密文形式存储与传输的,同时多个协作者又能解密和编辑同一批笔记,兼顾了"隐私保护"与"多人协作"两个目标。需要注意,此功能依赖 Joplin Cloud / Joplin Server 作为同步后端,本地文件系统、WebDAV 等其它同步目标不在此功能覆盖范围内。
四、同步启动速度优化
同步过程的启动阶段通常需要先获取一个同步锁(lock),而获取锁涉及多轮网络请求,在启动时可能比较耗时。2.6 对这一流程做了针对性优化:
- 减少了获取锁所需的请求次数;
- 每次请求消耗的资源也更少。
优化效果按同步目标有所差异:对 Joplin Cloud 的收益最明显,Joplin Server 次之,其它同步目标也有小幅提升。这类优化直接影响的是每次打开应用触发同步时的等待时间,属于体感层面的体验改进。
五、Markdown 编辑器分屏滚动改进
Markdown 编辑界面默认是"左编辑、右预览"的分屏布局,2.6 之前当笔记中包含多张图片及其它媒体时,左右两侧的滚动位置经常不同步,影响长文校对体验。
Kenichi Kobayashi 在本版本中重做了这一机制,使编辑器与预览区在滚动时保持同步——即使笔记内容很复杂。其行为表现是:两侧会互相"等待"或"加速",以尽可能保持对齐(在长笔记中尤其明显)。该功能附带了详细的技术说明文档,随对应的 Pull Request 一并提交(即发布说明中引用的 PR #5512 技术文档),对实现细节感兴趣的读者可以到该 PR 的讨论中查阅。
六、S3 同步的改进与优化
6.1 可靠性与错误处理
得益于 Lee Matos 的工作,2.6 中 S3 同步的可靠性明显提升,错误处理也更加完善。对使用 Amazon S3(或兼容 S3 协议的对象存储)作为同步后端的用户来说,这意味着更少的同步失败与更明确的报错信息。
6.2 SDK 从 v2 升级到 v3
本次升级的另一个重要变化是将底层 AWS SDK 从 v2 升级到v3。在 packages/lib/SyncTargetAmazonS3.js 中可以确认当前实现直接引用了 v3 的模块化客户端:
const { S3Client, HeadBucketCommand } = require('@aws-sdk/client-s3');同步目标在初始化时通过new S3Client(this.s3AuthParameters())(SyncTargetAmazonS3.js)创建客户端,并按需执行HeadBucketCommand等操作。由于 v3 采用按需引入的模块化设计,最终可执行文件的体积因此缩小了约3–5 MB(具体数值因操作系统而异)。
源码中还保留了针对 v3 的已知问题的处理痕迹:例如 v3 在自动时钟偏移修正上存在 bug(SyncTargetAmazonS3.js),以及部分 301/403 错误的 XML 解析问题(SyncTargetAmazonS3.js),这些都在实现中做了规避处理,属于版本升级时一并解决的兼容性细节。
七、将笔记导出为自包含 HTML 文件
2.6 改进了单条笔记的 HTML 导出方式:导出单个笔记为 HTML 时,所有图片、脚本、样式及其它附件都会被打包进同一个 HTML 文件,而不再像以前那样生成多个文件与目录。
这一变化显著提升了导出的可用性:
- 分享给未安装 Joplin 的人时,只需发送一个文件即可查看完整笔记(含内嵌图片与样式);
- 归档、邮件转发、放入网页等场景都更加方便;
- 无需依赖外部资源目录,文件本身即自包含(self-contained)。
如果你有"把某条笔记原样分享出去"的需求,这是 2.6 中值得优先使用的能力。
八、其它变更与缺陷修复
本版本还包含总计19 项新功能与改进、16 项缺陷修复,完整清单分布在各个平台的更新日志中,可在仓库内查看:readme/about/changelog 目录下的桌面端、Android、iOS 与 CLI 更新日志文件。由于 2.6 是移动端、桌面端和 CLI 同步发布的版本,各平台日志相互补充,合在一起才能看到本次更新的全貌。
小结
Joplin 2.6 是一轮"体验优化"色彩浓厚的版本:排序按钮与按笔记本独立排序让笔记组织方式更灵活(底层由notes.sortOrder.*系列设置驱动,字段可覆盖修改时间、创建时间、标题、自定义顺序乃至待办截止时间);笔记本 emoji 图标以 JSON 序列化方式存储,并借助"全量占位"策略保持目录树整齐;加密笔记本协作把隐私保护与多人编辑统一到了 Joplin Cloud / Joplin Server 之上;而同步锁优化、Markdown 分屏滚动重写、S3 SDK 升级与自包含 HTML 导出,则分别在不同环节提升了稳定性和效率。无论是个人知识管理还是团队协作,都可以结合上文提到的设置项与操作路径,把这些能力真正用起来。
【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考