菜单

AFFiNE 简介

相关源文件

AFFiNE is an open-source, privacy-focused, local-first workspace application that combines document editing, whiteboarding, and collaborative features. It serves as an alternative to applications like Notion and Miro, offering a unified environment for knowledge management, planning, and visual collaboration.

This document provides a high-level overview of the AFFiNE codebase, its core architecture, and main components. It serves as a starting point for understanding how AFFiNE works and how the different parts of the system interact with each other.

Sources: README.md72-95 README.md160-182

AFFiNE是什么?

AFFiNE旨在成为一个一体化的工作空间,融合了多种生产力范式——文档、白板和数据库。该应用程序遵循“本地优先”的方法,这意味着用户数据主要存储在用户的设备上,并可选地提供云同步以实现协作和多设备访问。

AFFiNE 的关键原则包括:

  • 注重隐私:用户数据由用户掌控
  • 本地优先:数据主要存储在本地设备上
  • 开源:社区版采用 MIT 许可证,代码库透明
  • 跨平台:可在 Web、桌面(通过 Electron)和移动平台使用
  • 实时协作:支持多用户同时编辑
  • 可扩展:支持自托管选项和即将推出的插件系统

Sources: README.md72-89 package.json1-5

系统架构

AFFiNE 遵循 monorepo 结构,包含构成完整系统的多个包。其架构可分为三个主要层级:

Sources: packages/frontend/core/package.json1-15 packages/frontend/component/package.json1-15 packages/frontend/apps/web/package.json1-15 packages/frontend/apps/electron/package.json1-15 packages/frontend/apps/ios/package.json1-15

前端层

前端层包含多个共享同一核心的应用:

  1. Web 应用 (@affine/web):AFFiNE 的浏览器版本
  2. 桌面应用 (@affine/electron):基于 Electron 的桌面客户端
  3. 移动应用:iOS (@affine/ios) 和 Android (@affine/android) 客户端

这些应用使用一套通用的 UI 组件(@affine/component)和核心功能(@affine/core),确保了跨平台的统一体验。

Sources: packages/frontend/apps/web/package.json1-20 packages/frontend/apps/electron/package.json1-20 packages/frontend/apps/android/package.json1-20 packages/frontend/apps/ios/package.json1-20

核心系统

AFFiNE 的核心包含几个关键系统:

  1. BlockSuite 编辑器:支持页面和画布模式的文档编辑系统
  2. 组件库:跨应用共享的可重用 UI 组件
  3. 基础设施:用于状态管理的通用实用程序和服务
  4. 环境配置:应用程序设置和环境检测

这些系统构成了 AFFiNE 用户体验的基础,支持富文本编辑、白板等功能。

Sources: packages/frontend/core/package.json11-83 packages/common/infra/package.json1-20

后端服务

后端层提供云功能所需的服务器端功能。

  1. AFFiNE 服务器:云功能的后端服务器
  2. GraphQL API:客户端-服务器通信的数据访问层
  3. 身份验证:用户管理和访问控制
  4. 存储服务:文档和资产的云存储

虽然 AFFiNE 可以完全在本地运行,但这些后端服务支持协作和多设备同步。

Sources: packages/backend/server/package.json1-20

原生组件

为了实现性能关键型操作,AFFiNE 使用了用 Rust 编写的原生模块。

  1. 原生模块:基于 Rust 的高性能组件
  2. 文档存储:用于文档存储和管理的本地数据库
  3. 媒体捕获:用于屏幕和音频捕获的原生功能

原生组件在 Web 技术和系统能力之间架起了桥梁,尤其是在桌面应用程序中。

Sources: packages/frontend/native/index.d.ts1-30 packages/frontend/native/media_capture/src/macos/screen_capture_kit.rs1-50

文档系统架构

文档系统是 AFFiNE 的核心组件之一,为文档模式和画布模式提供编辑能力。

文档系统采用基于块的方法,内容由各种块类型(文本、图像、表格等)组成。这实现了灵活且可扩展的编辑体验。

Sources: packages/frontend/core/package.json11-83

文档系统的主要功能

  1. 双模式编辑:在文档(页面)和白板(无边界)模式之间切换
  2. 块状内容:由各种块类型组成的结构化内容
  3. 实时协作:使用 Yjs 通过 CRDT(无冲突复制数据类型)实现
  4. 本地优先存储:主要通过本地 SQLite 数据库存储
  5. 云同步:用于多设备访问和协作的可选同步

Sources: README.md77-89

数据流和存储

AFFiNE 在文档管理中结合使用了多种存储机制:

  1. 本地存储:通过 Native Binding Store (NBStore) 使用 SQLite 进行主要存储
  2. 云存储:用于多设备同步和协作的可选远程存储
  3. 同步引擎:基于 Yjs 的 CRDT 同步,用于冲突解决
  4. GraphQL API:用于客户端-服务器通信的接口

“本地优先”的方法确保数据始终可离线访问,而云同步则在需要时支持协作和多设备访问。

Sources: packages/common/nbstore/package.json1-20 packages/frontend/native/index.d.ts26-65

Monorepo 结构

AFFiNE 组织成一个 monorepo,其中包含用于系统不同部分的多个包。

这种结构在保持关注点分离的同时,实现了跨平台的代码共享。

主要包和依赖项

目的关键依赖项
@affine/core主应用程序逻辑React、BlockSuite、Yjs
@affine/componentUI 组件库React、Radix UI、Emotion
@affine/native原生功能Rust、NAPI-RS
@affine/nbstore文档存储SQLite、Yjs
@affine/electron桌面应用Electron、async-call-rpc
@affine/server后端服务器NestJS、GraphQL、Prisma
@affine/graphqlGraphQL APIGraphQL、Apollo
@affine/env环境配置-
@toeverything/infra核心基础设施-

来源: package.json51-93 packages/frontend/core/package.json10-83 packages/frontend/component/package.json22-68

AI 集成

AFFiNE 通过其 Copilot 系统集成 AI 功能,该系统在文档编辑体验中提供协助。

Copilot 系统设计为模块化的,支持 AFFiNE 工作空间内的多个 AI 提供商和用例。

来源: README.md82-84

开发与部署

AFFiNE 可以通过多种方式部署

  1. Web 应用程序:托管的 SaaS 版本 affine.pro
  2. 桌面应用程序:Windows、macOS 和 Linux 的原生应用程序
  3. 移动应用程序:iOS 和 Android 应用
  4. 自托管:基于 Docker 的私有实例部署

构建系统主要通过自定义 CLI (@affine-tools/cli) 管理,并结合使用多种工具。

来源: docs/BUILDING.md1-30 docs/building-desktop-client-app.md1-30 tools/cli/package.json1-20

平台支持

平台技术栈
Web@affine/webReact, Vite
Windows@affine/electronElectron, Squirrel/NSIS
macOS@affine/electronElectron, DMG
Linux@affine/electronElectron, AppImage/DEB
iOS@affine/iosCapacitor
Android@affine/androidCapacitor

来源: packages/frontend/apps/electron/package.json86-94 packages/frontend/apps/ios/package.json1-20 packages/frontend/apps/android/package.json1-20

结论

AFFiNE 提供了一个灵活、可扩展的平台,用于文档编辑、知识管理和视觉协作。其架构支持多平台,同时保持一致的用户体验和功能集。

本地优先的方法结合可选的云同步,为用户提供了两全其美:数据的隐私和控制,以及协作的能力。

作为一个开源项目,AFFiNE 在社区贡献和反馈的推动下不断发展,目标是为专有生产力工具提供全面的替代方案。

来源: README.md161-182