菜单

项目结构

相关源文件

本文档概述了 Joplin 代码库中的多仓库结构、包组织和依赖管理。有关高级系统架构的信息,请参阅 系统架构

单仓概览

Joplin 使用 Yarn workspaces 组织成一个多仓库,这允许在保持独立构建和依赖的同时,共同开发多个相关包。

来源:package.json1-121 .eslintrc.js1-322 tsconfig.json1-34 yarn.lock1-102

工作区配置

多仓库的配置位于根目录的 package.json 文件中

根目录包含共享的配置文件

  • package.json:定义 workspaces 和共享脚本
  • tsconfig.json:基础 TypeScript 配置
  • .eslintrc.js:整个项目的 linting 规则
  • yarn.lock:依赖锁定文件

来源:package.json1-121 tsconfig.json1-34 .eslintrc.js1-322 packages/app-desktop/package.json1-211 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82 packages/lib/package.json1-108 packages/server/package.json1-86 packages/tools/package.json1-71 packages/renderer/package.json1-58 packages/fork-htmlparser2/package.json1-68

包组织

主要软件包类别

来源:packages/app-desktop/package.json1-211 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82 packages/lib/package.json1-108 packages/server/package.json1-86 packages/tools/package.json1-71 packages/renderer/package.json1-58 packages/fork-htmlparser2/package.json1-68

客户端应用程序

描述版本主要技术
app-desktop基于 Electron 的桌面应用程序3.3.5Electron, React, CodeMirror, TinyMCE
app-mobile适用于 iOS 和 Android 的移动应用程序3.3.0React Native, Expo
app-cli命令行界面3.3.0Node.js, terminal-kit

客户端应用程序共享一个通用核心,但实现特定于平台的接口。例如,桌面应用程序使用 Electron,并为 Windows、macOS 和 Linux 提供了特定的构建配置。

来源:packages/app-desktop/package.json29-128 packages/app-mobile/package.json1-152 packages/app-cli/package.json1-82

核心库

描述目的关键依赖项
lib核心业务逻辑数据模型、同步引擎、设置sqlite3, fs-extra, node-rsa
rendererMarkdown/HTML 渲染器笔记渲染markdown-it, katex, highlight.js
editor编辑器组件富文本和 Markdown 编辑CodeMirror 组件
utils实用函数共享助手极少的依赖

lib 包尤为核心,包含:

  • 笔记、笔记本和标签的数据模型
  • 支持多种同步目标的同步引擎
  • 设置管理
  • 加密/解密
  • 搜索功能

来源:packages/lib/package.json1-108 packages/renderer/package.json1-58 packages/editor/package.json1-46

服务器组件

The server 包实现了 Joplin Server 功能,该功能提供:

  • 客户端同步端点
  • 用户管理
  • 共享功能
  • Joplin Cloud 服务后端

它使用 Koa.js 作为 Web 框架,并支持 SQLite 和 PostgreSQL 数据库

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

依赖管理

内部依赖

多仓库中的软件包使用带波浪号前缀的统一版本模式互相引用

这确保了

  1. 所有包使用兼容的版本
  2. 仅自动应用补丁更新
  3. 版本管理已简化

来源:packages/app-desktop/package.json160-209 packages/app-mobile/package.json23-87 packages/server/package.json24-60

外部依赖

外部依赖项在两个级别进行管理

  1. 根级别:通用工具(TypeScript、ESLint、Gulp)和开发依赖项
  2. 包级别:每个包声明自己的特定依赖项

根级别还包含使用 Yarn 的 resolution 机制修补的依赖项

此机制确保所有包之间的依赖版本一致,并在需要时应用自定义补丁。

来源:package.json72-121 packages/app-desktop/package.json131-210 packages/lib/package.json42-107

构建系统

全局构建脚本

根目录下的 package.json 提供了构建所有包的脚本

这些脚本使用 Yarn 的工作区功能来

  • 并行或顺序构建包
  • 编译 TypeScript 文件
  • 在开发过程中监视更改
  • 安装后自动构建

来源:package.json15-65

特定包的构建流程

每个包通常实现

构建流程因包类型而异

  • 桌面应用:使用 Electron Builder 进行打包
  • 移动应用:使用 React Native 构建工具
  • CLI 应用:使用 Gulp 进行构建任务
  • 服务器:使用 TypeScript 编译和资源构建

来源:packages/app-desktop/package.json7-18 packages/app-mobile/package.json7-21 packages/server/package.json6-22

发布流程

发布通过专用脚本管理

例如,服务器的发布流程会增加版本号、创建 Git 标签并更新变更日志

来源:package.json42-51 packages/tools/release-server.ts1-29

测试框架

该项目在所有包中使用 Jest 进行测试

各个包会为其特定需求配置 Jest,测试通常与源文件一起存放。

来源:package.json56-57 packages/lib/package.json15-16 packages/renderer/package.json16-17

代码检查和风格

该项目使用支持 TypeScript 的 ESLint

TypeScript 文件有额外的规则来强制执行一致的编码模式。

来源:.eslintrc.js1-322

结论

Joplin 项目的 monorepo 结构提供了多项优势

  • 应用程序之间共享代码(桌面、移动、CLI、服务器)
  • 跨包的一致版本控制
  • 简化的开发工作流程
  • 集中的工具和配置

包的组织反映了客户端应用程序、核心库和服务器组件之间的架构分离。依赖管理使用 Yarn 工作区来保持包之间的兼容性,同时允许每个包指定其自己的外部依赖项。

构建系统同时支持带有监视模式的开发工作流程和带有每个平台特定脚本的发布流程。跨代码库的测试和代码检查是标准化的,以确保一致的质量。