许多能在各处运行的应用,其实是同一个网页,在每台设备上套了一个不同的外框。Caliu 选择了更远的那条路:每个应用都用其平台原本就为之设计的工具构建。这意味着更多的工作,也正是滚动、输入、键盘快捷键和辅助功能都符合你设备习惯的原因。
网页应用
网页应用用 TypeScript 和 React 编写。它是一个 Progressive Web App:Service Worker 会在你的设备上保留整个应用的副本,所以它能在没有网络的情况下启动和工作,你也可以像安装其他应用一样从浏览器安装它。新版本发布时,它从不打断你:应用会提示有更新,并在你选择时再应用。
iPhone、iPad 和 Mac
Apple 应用用 Swift 和 SwiftUI 编写,iPhone、iPad 和 Mac 共享同一套代码库。每个平台依然拥有自己的布局和习惯:Mac 上是侧边栏和键盘快捷键,iPhone 上是触控手势,iPad 上两者兼有。
正因为它们是真正的原生应用,它们能接入系统的其他部分:小组件、分享菜单、快捷指令和 Spotlight。Apple Watch 应用同样用 Swift 编写,它本身就是一个完整的同步客户端,直接与服务器通信,因此即使手机不在身边,你的笔记也在手腕上。
Android
Android 应用用 Kotlin 和 Jetpack Compose 编写,后者是 Google 为 Android 界面打造的官方工具包。它是对 Apple 应用的一次细致移植:相同的结构、相同的行为、相同的测试,逐个用例地转换过来,因此一条笔记在两边的表现完全一致。
让四个应用步调一致
四个应用很容易各行其是。几个习惯让它们保持一致:
- 共享的规则,共享的测试。 那些绝不能有差异的规则,比如如何识别一个
#tag、如何读取笔记的标题、如何整理同步队列,在每种编程语言里各写一次,并在每个平台上对照同一批测试用例进行检验。 - 外观只有一个来源。 主题、字体和 Caliu 自己的图标集只定义一次,再为每个应用生成,因此同一个主题在 Mac 上和在 Android 手机上看起来一模一样。
- 一份翻译,处处通用。 每个应用都支持相同的语言,Android 应用的文字由 Apple 应用的翻译生成,因此各设备上的措辞保持一致。
工作留在你的设备上
因为每个应用都是一个完整的应用,而不是通往服务器的一扇窗,繁重的工作都在你的设备上完成:搜索、导出为各种格式,以及渲染你的笔记,全都可以离线进行。