菜单

系统架构

相关源文件

本文档概述了 Joplin 的系统架构,解释了核心组件的组织方式以及它们在不同平台上的交互方式。它涵盖了驱动 Joplin 的桌面、移动、CLI 应用程序和服务器组件的基础结构。

有关同步等特定功能的信息,请参阅 同步引擎。有关数据模型详情,请参阅 数据模型

高层架构概述

Joplin 被构建为一个多平台应用程序,具有共享的核心业务逻辑和特定于平台的 UI 实现。该应用程序遵循分层架构模式。

来源:packages/lib/BaseApplication.ts39-69 packages/lib/package.json42-106 packages/app-desktop/app.ts1-18 packages/app-mobile/root.tsx1-35

核心应用程序结构

Joplin 的架构以 BaseApplication 类为中心,它为所有应用程序变体提供了基础。然后,每个平台都用特定于平台的功能对其进行扩展。

应用程序生命周期遵循以下主要步骤

  1. 初始化:设置环境,加载设置
  2. 数据库设置:创建或打开 SQLite 数据库
  3. 状态管理:初始化 Redux store
  4. 服务初始化:启动同步等核心服务
  5. UI 渲染:特定于平台的 UI 初始化

来源:packages/lib/BaseApplication.ts84-757 packages/app-desktop/app.ts73-743 packages/app-desktop/ElectronAppWrapper.ts49-622

数据流架构

Joplin 使用 Redux 进行状态管理,并结合使用各种 reducer 来处理应用程序状态的不同方面。

来源:packages/lib/reducer.ts1-67 packages/app-desktop/app.reducer.ts packages/app-desktop/gui/Sidebar/Sidebar.tsx15-26

数据库和模型架构

Joplin 在所有平台上都使用 SQLite 进行数据存储,并具有一致的模型结构。

数据模型遵循以下关键模式

  1. 所有模型都继承自 BaseModel,它提供了 CRUD 操作
  2. 模型通过 JoplinDatabase 与数据库交互
  3. 实体代表每个模型的数据结构
  4. SQLite 数据库由特定于平台的驱动程序进行包装

来源:packages/lib/BaseModel.ts packages/lib/models/Setting.ts151-185 packages/lib/reducer.ts70-182

同步架构

Joplin 的同步系统能够通过各种同步目标在多个设备之间同步数据。

同步过程包括

  1. 本地更改检测:识别自上次同步以来已更改的项目
  2. 远程更改检测:从同步目标获取更改
  3. 冲突解决:确定冲突发生时该怎么做
  4. 上传/下载:在本地和远程之间传输数据
  5. E2EE:用于安全数据传输的端到端加密

来源:packages/lib/BaseApplication.ts475-544 packages/app-mobile/root.tsx94-102 packages/app-desktop/gui/Sidebar/Sidebar.tsx55-58

多平台应用程序结构

Joplin 在多个平台上实现,具有共享的核心逻辑和特定于平台的界面。

每个平台实现

  1. 使用核心库(@joplin/lib
  2. 实现特定于平台的 UI 和集成
  3. 尽可能使用共享组件
  4. 处理特定于平台的​​文件操作、通知等

来源:package.json4-6 packages/app-desktop/package.json2-11 packages/app-mobile/package.json2-5 packages/app-cli/package.json2-5 packages/lib/package.json2-6

设置系统

设置系统跨所有平台管理应用程序配置,支持不同的存储位置和配置文件。

设置系统的关键方面

  1. 通过 Setting 类进行集中配置
  2. 元数据驱动的设置定义
  3. 支持各种数据类型(字符串、布尔值、整数、数组、对象)
  4. 通过钥匙串安全存储敏感设置
  5. 支持多配置文件的基于配置文件的设置
  6. 处理版本之间设置更改的迁移系统

来源: packages/lib/models/Setting.ts151-1218 packages/lib/models/settings/FileHandler.ts1-7 packages/lib/services/profileConfig/mergeGlobalAndLocalSettings.ts1-6

插件系统

Joplin 支持一个强大的插件系统,允许扩展其功能。

插件系统提供:

  1. 基于 JavaScript 的插件 API
  2. UI 扩展的集成点
  3. 插件的设置管理
  4. 预加载的默认插件
  5. 沙盒插件执行环境

来源: packages/app-desktop/app.ts4-7 packages/app-desktop/services/plugins/PluginRunner.js

服务器架构

Joplin Server 提供同步、共享和协作功能。

Joplin Server 的功能:

  1. 用于同步操作的 RESTful API
  2. 用户管理和身份验证
  3. 内容共享能力
  4. 订阅管理(适用于 Joplin Cloud)
  5. 支持 PostgreSQL 和 SQLite 数据库

来源: packages/server/package.json2-86

应用程序启动流程

启动顺序是理解 Joplin 如何初始化其组件的关键部分。

启动包含以下关键步骤:

  1. 处理命令行参数和环境设置
  2. 加载设置和密钥链服务
  3. 初始化数据库,并在需要时运行迁移
  4. 设置 Redux 存储以进行状态管理
  5. 初始化核心服务(同步、插件等)
  6. 初始化 UI 组件(针对基于 GUI 的应用程序)
  7. 处理任何待处理的同步操作

来源: packages/lib/BaseApplication.ts241-319 packages/app-desktop/main.js1-44 packages/lib/utils/processStartFlags.ts20-27

多实例支持

Joplin 支持同时运行多个实例,每个实例都有自己的配置文件。

多实例功能:

  1. 基于配置文件的隔离数据和设置
  2. 实例间的进程间通信
  3. 配置文件锁定以防止并发访问
  4. 用于在实例之间切换的命令
  5. 自定义 URL 协议处理,用于跨实例通信

来源: packages/app-desktop/ElectronAppWrapper.ts73-76 packages/app-desktop/commands/openPrimaryAppInstance.ts1-3 packages/app-desktop/commands/openSecondaryAppInstance.ts1-3 readme/apps/multiple_instances.md1-3

总结

Joplin 的架构遵循以下关键原则:

  1. 跨平台核心:所有平台共享的业务逻辑
  2. 平台特定 UI:每个支持平台的原生 UI
  3. 模块化设计:组件之间清晰的关注点分离
  4. 可扩展性:用于自定义的插件系统
  5. 离线优先:具有同步功能的本地数据库
  6. 安全性:敏感数据的端到端加密
  7. 灵活性:支持多种同步目标和配置

这种架构允许 Joplin 在保持跨平台一致体验的同时,在适当的地方利用特定平台的强大功能。

来源: packages/lib/BaseApplication.ts1-10 README.md7-17