- 前端
- 桌面应用
- 移动开发
【免费下载链接】app
Think fearlessly with end-to-end encrypted notes and files. For issues, visit https://standardnotes.com/forum or https://standardnotes.com/help.
本篇技术指南以仓库根目录 CHANGELOG.md 为骨架,围绕 Standard Notes 应用 monorepo 在 3.21.0 版本(2022-06-13)的功能演进展开:从「组件化 Monorepo」的架构拆分、端到端加密文件系统(Files)的引入,到工作区切换、Vaults、PKCE 登录、新版修订历史等核心能力,逐一结合 packages 下的真实源码与测试进行纵深解读。读完本文,你将理解该版本为何是 Standard Notes 从「网页应用」走向「桌面 + 移动 + Web 全家桶」的转折点,并能根据 changelog 条目在仓库中快速定位对应实现。
版本快照:3.21.0 与 0.0.2
CHANGELOG 的顶层结构非常清晰,采用 conventional commits 约定(standard-version工具生成):
- [3.21.0](2022-06-13):本文件记录的最新版本,包含大规模 Features 与 Bug Fixes,是 monorepo 组件化重构正式落地后的第一个里程碑版本。
- 0.0.2(2022-06-13):紧随其后的历史条目,实际是 monorepo 早期的发布记录,合并展示了从旧架构迁移过程中的全部功能与修复。
整个文件遵循### Features/### Bug Fixes/### Reverts三段式分组,每条变更后都附带了 issue/PR 编号(如#1045、#1071)和提交哈希,便于溯源。
发布机制:仓库根目录 package.json 与 lerna.json 共同定义了这套流程:
- 采用yarn workspaces + Lerna(independent 独立版本模式),所有包位于 packages 下;
- 版本发布脚本
release:prod调用lerna version --conventional-commits,自动根据提交信息生成 changelog 并打 tag; changelog:json调用 scripts/ChangelogToJson.js,把 Markdown changelog 转为 JSON(各子包的 CHANGELOG.md.json 即由该脚本产出);postversion触发 scripts/push-tags-one-by-one.sh 逐个推送 tag。
这正是 CHANGELOG 中每条记录都能带版本号、PR 编号与 commit hash 的原因。
组件化 Monorepo:一次从单体到多包的架构重构
3.21.0 最核心的信号是"components monorepo"(#1082)以及一系列新包落地,标志着项目从单体 Web 应用拆分为可独立发布、独立构建的包集合。CHANGELOG 中明确记录的包包括:
| 包(packages 目录) | 版本条目来源 | 定位 |
|---|---|---|
| packages/desktop | add desktop repo(#1071) | Electron 桌面客户端 |
| packages/mobile | mobile app package(#1075) | React Native 移动端 |
| packages/toast | toast package(#1073) | 独立的 Toast 通知组件库 |
| packages/styles | styles package(#1074) | StyleKit 样式与 Alert 组件 |
| packages/files | files related improvements | 端到端加密文件存储领域逻辑 |
| packages/filepicker | 仓库内既有 | 文件读写(Classic/Streaming)抽象 |
| packages/sncrypto-web | upgrade sncrypto-web | Web 端密码学实现 |
以 packages/toast 为例,源码印证了这一版本 "新包 + 新组件" 的落地方式:
- ToastContainer.tsx 基于nano stores的
toastStore渲染右下角堆叠式通知,仅在toasts.length > 0时挂载; - toastStore.ts 用
atom<Toast[]>管理状态,addToast通过nanoid生成 id(重复 id 会警告并生成新 id),dismissToast设置dismissed标记并在175ms 后移除节点以保留退场动画; - addTimedToast.ts 提供倒计时 Toast:每秒
updateToast刷新剩余秒数文案,归零时dismissToast并触发回调,同时autoClose: false避免与手动计时冲突。
对应 changelog 条目show download/upload progess in toast(#1008)、timed color scheme toast(#978)正是这套组件的实际消费场景——下载/上传进度与系统配色切换提示均以 Toast 呈现。
端到端加密文件系统(Files):本版本的重量级功能线
3.21.0 围绕「文件」展开的功能条目数量在所有 Features 中占比最高,包含:文件预览弹窗(#945)、文件视图(#1064)、多文件选中视图(#1062)、文件信息面板(#965)、文件配额展示(#994)、图片缩放选项(#984)、预览中自动播放视频(#1036)、方向键切换前后文件(#1004)、下载/上传进度展示(#1008/#1011)、文件备份(#1024)、文件拖拽上传(#921/#923)以及受保护文件预览前要求密码(#991)。
这些 UI 能力背后的领域逻辑集中在 packages/files/src/Domain,从源码结构看,其设计体现了「加密与传输解耦」的分层:
- Operations:EncryptAndUpload.ts 与 DownloadAndDecrypt.ts 定义两个顶层操作(并配有
*.spec.ts测试),即「上传前先加密、下载后先解密」的端到端加密链路; - Chunker:ByteChunker.ts 与 OrderedByteChunker.ts 负责把大文件按字节切片,配合文件大小分块上传,对应 changelog 中
upgrade snjs with file size changes(d33e48e); - UseCase:FileEncryptor.ts、FileUploader.ts、FileDecryptor.ts、FileDownloader.ts 各自配套 spec,可单独复用;
- Types:
FileUploadProgress、FileDownloadProgress为进度条 UI 提供数据契约——这正是show download progress in file preview modal(#1011)与 Toast 进度提示(#1008)的直接数据来源; - Device:
FileBackups*系列(如 FileBackupsDevice.ts、FileBackupsConstantsV1.ts)实现本地文件备份能力,对应file backups(#1024); - Api:
FileSystemApi、FilesApiInterface等抽象文件系统接口,与 packages/filepicker 的ClassicReader/ClassicSaver、StreamingReader/StreamingSaver形成「读取层适配」——changelog 中update filepicker to latest version(c6ed953)即指向该包。
此外,show alert if file exceeds classic reader limit(#948)说明旧版 Classic API 存在大小上限,而新版 Streaming 系列正是为了突破这一限制而引入。
安全与认证:PKCE、2FA 与挑战弹窗
3.21.0 在安全侧的关键演进包括:
- PKCE 登录:
upgrade deps to introduce PKCE sign in(9f11b02),OAuth 授权码 + PKCE 的引入强化了第三方授权场景(如authorize CloudLink access); - 双因素认证:
integrate two factor authentication(#626)及后续的2FA activation dialog、QR 码边框修复(#749); - 会话管理:
sessions management系列条目,配合 snjs 的userCanManageSessions、option to sign out all workspaces(#1005); - 挑战弹窗(Challenge Modal)重构:
new lock screen and challenge modal design(#957)、cancelable challenges、custom challenges,以及set minimum passcode length——从 changelog 可以推断,保护机制(Protections)从「特定 UI」演进为「统一挑战流程」,受保护笔记(protected notes)预览前会先弹出密码/通行码挑战(ask for password before previewing protected files,#991)。
该版本同时开启了demo token(67e0bf0)与snjs with auto integrity resolution(#912),后者意味着客户端可在数据完整性校验失败时自动尝试修复,是端到端加密体系健壮性的重要补充。
工作区、账户切换与订阅体验
- 账户切换器:
add account switcher menu(#941)、add workspace switcher to lock screen(#969)——多工作区(Workspaces)体验被正式引入,锁屏页也可切换; - 订阅体验优化:
redirect subscribers to dashboard instead of plans page(#897)、Manage subscription按钮、Move SubscriptionState to central AppState(#869)——订阅状态被提升到中央 AppState,供多模块共享; - Vaults:
vaults(#927)条目引入了保险库(Vault)概念,仓库中 packages/snjs/lib/Services 与 packages/sncrypto-common 均有对应领域代码支撑。
编辑器、标签与笔记管理体验
3.21.0 在「笔记编辑」与「组织管理」上同样密集:
- 编辑器切换:
Add new "Change Editor" option to note context menu(#823)、add change editor button(#874)、improve change editor menu keyboard navigation(#831)、show alert when changing to non-interchangeable editor(#834)——编辑器系统支持更细的切换交互与兼容性告警; - 笔记类型:
note types(f5a9006)与update note type menu design(#1032)——笔记内容类型(富文本/纯文本/Markdown 等)成为一等概念; - 修订历史重构:
new revision history UI(#861)、legacy history修复(#879)、first history entry being fetched twice(#903)——旧版历史接口与新式历史 API 的切换,仓库 packages/snjs/lib/Domain 中可找到对应历史模型; - 标签体系:
native smart tags(#782)、smart views、untagged notes smart view(60bddd0)、persist tags expanded state(0c3d1fc)、add tag context menu(#890)——标签从「附加组件」进化为原生功能; - 文件夹:
display folders even without the premium(#826)、enable folders by default and remove from experimental features(70f4dd6)——文件夹功能转正并默认开启; - 多选交互:
select multiple notes in list、shift-click to select range of notes、ability to cancel multiple selection from UI(#1045)——批量操作能力补齐。
主题、外观与系统配色
add themes source(#1089)将主题源引入 monorepo;show all themes and premium icon if not entitled(#854)与check if user is entitled to theme before activating it(#867)完善了主题的权限校验;activate cached themes without entitlement check(b8e242c)处理了离线缓存主题的激活路径;show toast before applying system color scheme(#964)与don't apply system color scheme anytime any preference changes(4923577)说明系统深浅色跟随策略在该版本被收敛为「仅在明确切换时生效」;- 底层样式由 packages/styles(StyleKit 风格)与 packages/icons(
replace IonIcons with svg icons,#1069)支撑,后者完成了图标体系的自有化。
备份、导出与数据迁移
- 邮件备份开放:
enable email backups for everyone(58b6389); - 多笔记 ZIP 导出:
export as zip if multiple notes are selected(#926)、use new zip.js module for backup(#929)——导出改用 zip.js 实现; - 加密备份安全化:
make encrypted backups protected(#524)、delete local backups when signing out(6a52721)、download backup before changing password(add0497); - 迁移偏好面板:
add migration pref pane(#825)、folders migration issue修复(d17edfc)——为数据升级提供显式入口; - 导入健壮性:
prevent importing backup files with version > 003(a0d6884)、check backup file version first before importing(6f798e3)。
Bug Fixes 主题归类:从 changelog 反推质量工程
3.21.0 的修复清单规模庞大,可归纳为几条主线:
- 菜单与弹窗生命周期:
popover closing on delete dialog(#1022)、sign out dialog disappearing when account menu is unfocused(#863)、render change editor menu only if it is open(#894)——集中修复菜单状态不同步问题; - 搜索与过滤:
make search case-insensitive(#925)、tag search causing regex exception(#938)、redesign search filtering experience(#908)——搜索由大小写敏感改为不敏感,并修复了正则异常; - 文件预览细节:
image zoom over 100%(#998)、pinch zoom on preview modal(#1012)、spinner loading infinitely on unsupported file types(#1002)、object url not being revoked on modal close(#1044)——预览的资源管理与缩放边界; - 编辑器状态:
plain editor font changing(#880)、plain editor revision rendering(#889)、saving status while fully offline(7abad65)——离线保存状态与纯文本编辑器渲染; - 工程基建:
running tests and adding tests to CI & CD(#1047)、circular dependencies(#1040)、remove bugsnag(#931)、upgrade deps to introduce PKCE sign in(9f11b02)——测试进 CI、依赖清理与安全升级。
值得留意的是remove bugsnag(#931)与若干 Datadog/New Relic 相关提交,说明该版本的错误监控体系也在同步迁移;upgrade to latest active node LTS version(3660848)则对应根 package.json 中engines: node >=12.19.0 <17.0.0的约束。
如何在本仓库验证这些内容
读者可按以下路径在仓库中逐一印证 changelog 条目:
- 新包结构:浏览 packages 顶层目录,对照「桌面/移动/Web/共享库」的划分;每个包自带独立的 package.json 与 CHANGELOG;
- Toast 实现:packages/toast/src 下的
ToastContainer、toastStore、addTimedToast,配套 packages/toast/CHANGELOG.md; - 文件加密链路:packages/files/src/Domain/Operations 与 packages/files/src/Domain/UseCase 下的
*.spec.ts测试,直接对应EncryptAndUpload/DownloadAndDecrypt两个用例; - 历史修订:packages/snjs/lib/Domain 与 packages/snjs/mocha 下的
history.test.js; - 桌面端:packages/desktop/app/javascripts/Main(40 个 TS 文件)对应
add desktop repo(#1071)的落地; - 版本脚本:scripts/ChangelogToJson.js 与 scripts/push-tags-one-by-one.sh 对应发布流程。
小结
3.21.0 是 Standard Notes app 仓库历史上承前启后的一个版本:它既是组件化 Monorepo 架构正式成型的里程碑(desktop/mobile/toast/styles 等新包落地),也是端到端加密文件系统从实验走向产品化的关键节点(加密上传/下载、分块、进度、备份、预览全链路打通),同时完成了 PKCE、2FA、会话管理、Vaults 等安全与多工作区能力的筑基。对于开发者而言,这份 CHANGELOG 不仅是发布记录,更是一张按图索骥的「功能地图」——每一个条目都能在 packages 的源码与测试中找到对应实现,是学习大型 TS monorepo 工程化实践的第一手材料。
- 前端
- 桌面应用
- 移动开发
【免费下载链接】app
Think fearlessly with end-to-end encrypted notes and files. For issues, visit https://standardnotes.com/forum or https://standardnotes.com/help.
相关推荐
Standard Notes终极指南:端到端加密笔记应用完全解析
Standard Notes终极指南:端到端加密笔记应用完全解析 Standard Notes是一款专为注重隐私的用户设计的端到端加密笔记应用,提供安全可靠的内
前端桌面应用移动开发Standard Notes端到端测试策略:构建可靠加密笔记应用的最佳实践
Standard Notes端到端测试策略:构建可靠加密笔记应用的最佳实践 Standard Notes作为一款端到端加密的笔记应用,其测试策略的核心在于确保数
前端桌面应用移动开发为什么选择Standard Notes:端到端加密笔记应用的终极对比指南
为什么选择Standard Notes:端到端加密笔记应用的终极对比指南 在当今数字时代,隐私安全已成为笔记应用选择的关键因素。Standard Notes作为
前端桌面应用移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考