菜单

核心组件

相关源文件

本文档概述了驱动所有 Joplin 应用程序(桌面、移动、CLI 和服务器)的基础组件和库。这些核心组件实现了基本业务逻辑、数据存储、同步功能以及实现 Joplin 在不同平台之间一致工作的共享功能。

有关设置管理、数据模型和同步的特定信息,请分别参阅设置管理数据模型同步引擎

核心架构概述

Joplin 的架构围绕一个核心库(@joplin/lib)构建,该库包含共享的业务逻辑,并在其上构建了特定于平台的实现。

来源:packages/lib/BaseApplication.ts packages/app-desktop/app.ts), packages/app-mobile/root.tsx)

软件包结构

Joplin 被组织成一个包含多个包的单体仓库

包的依赖关系定义在每个包的 package.json 文件中

来源:package.json), packages/lib/package.json), packages/app-desktop/package.json), packages/app-mobile/package.json), packages/server/package.json

数据模型

Joplin 的数据模型围绕相互构建的模型层次结构进行组织

BaseModel

BaseModel 类(BaseModel.ts)为 Joplin 中的所有数据模型提供了基础。它负责

  • 基本的 CRUD 操作(加载、保存、删除)
  • 通过 JoplinDatabase 进行数据库交互
  • 所有模型共有的功能
  • 模型变更事件

BaseItem

BaseItem 类扩展了 BaseModel 并添加了用户创建内容共有的功能

  • 加密/解密支持
  • 同步能力
  • 共享功能
  • 通用字段(id、creation_time、update_time)
  • 处理冲突检测和解决

特定模型

Joplin 中的主要数据模型包括:

  • Note:代表具有 markdown 内容的笔记
  • Folder:代表包含笔记的笔记本
  • Tag:代表可以附加到笔记的标签
  • Resource:代表附件(图片、文件等)
  • MasterKey:用于加密
  • NoteTag:代表笔记和标签之间的多对多关系

来源:packages/lib/BaseModel.ts), packages/lib/models/BaseItem.ts), packages/lib/models/Note.ts), packages/lib/models/Folder.ts), packages/lib/models/Resource.ts)

设置系统

设置系统跨平台管理应用程序配置

设置系统的主要功能

  • 设置元数据:定义设置、类型、默认值和标签
  • 设置存储:文件、数据库或安全存储
  • 迁移框架:处理版本之间的设置更改
  • 全局/本地设置:支持全局设置(跨配置文件共享)和本地设置

设置定义在 Setting.ts 中,并附带支持类

  • FileHandler 用于加载/保存到设置文件
  • 用于访问/修改设置值的函数
  • 支持加密/安全设置

来源:packages/lib/models/Setting.ts)

同步引擎

同步引擎允许数据在设备之间以及与各种同步目标之间进行同步

Synchronizer 类(Synchronizer.ts)负责

  • 与远程目标的同步
  • 冲突检测和解决
  • 处理已删除的项目
  • 资源同步
  • 同步期间的加密

同步过程

  1. 锁定获取:确保一次只有一个客户端进行同步
  2. 状态比较:比较本地和远程状态
  3. 上传:上传新项目和修改的项目
  4. 下载:下载新项目和修改的项目
  5. 冲突解决:处理冲突
  6. 清理:删除已删除的项目并释放锁定

来源:packages/lib/Synchronizer.ts), packages/app-desktop/gui/Sidebar/Sidebar.tsx)

基础应用程序框架

BaseApplication 类为所有 Joplin 应用程序提供了基础

BaseApplication 负责

  • 应用程序初始化
  • 数据库设置
  • 模型注册
  • 服务初始化
  • 状态管理(Redux)
  • 通用事件处理
  • 同步过程
  • 插件系统

redux.ts 文件实现了基于 Redux 的状态管理系统,包括

  • Action 创建者和 reducers
  • 状态持久化
  • 窗口状态管理
  • 支持多窗口(桌面端)

来源:packages/lib/BaseApplication.ts), packages/lib/reducer.ts), packages/app-desktop/app.ts), packages/app-mobile/root.tsx)

数据库抽象

Joplin 使用数据库抽象层来支持不同的平台和数据库后端

JoplinDatabase 类扩展了 Database 类,提供

  • Schema 管理
  • 搜索能力
  • 加密支持
  • 项目序列化/反序列化
  • 事务管理

这种抽象允许 Joplin 根据平台使用不同的数据库后端,同时保持一致的数据访问模式。

来源:packages/lib/JoplinDatabase.ts), packages/lib/BaseModel.ts)

Bridge 和特定平台组件

Bridge 组件连接核心库和特定平台 API

Bridge 系统为特定平台功能提供抽象

  • 文件系统操作
  • 对话框
  • 窗口管理
  • 剪贴板操作
  • 键盘快捷键
  • 菜单处理

来源: packages/app-desktop/bridge.ts), packages/app-desktop/ElectronAppWrapper.ts)

结论

这些核心组件为所有 Joplin 应用程序提供了基础,实现了跨平台的统一体验。模块化架构允许平台特定的实现构建在共享代码之上,确保了数据兼容性和功能对等性。

每个客户端应用程序(桌面、移动、CLI)都扩展了这些核心组件,以实现其用户界面和平台特定的功能。服务器组件提供了同步、共享和多用户功能。