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 的关键原则包括:
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
前端层包含多个共享同一核心的应用:
@affine/web):AFFiNE 的浏览器版本@affine/electron):基于 Electron 的桌面客户端@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 的核心包含几个关键系统:
这些系统构成了 AFFiNE 用户体验的基础,支持富文本编辑、白板等功能。
Sources: packages/frontend/core/package.json11-83 packages/common/infra/package.json1-20
后端层提供云功能所需的服务器端功能。
虽然 AFFiNE 可以完全在本地运行,但这些后端服务支持协作和多设备同步。
Sources: packages/backend/server/package.json1-20
为了实现性能关键型操作,AFFiNE 使用了用 Rust 编写的原生模块。
原生组件在 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
Sources: README.md77-89
AFFiNE 在文档管理中结合使用了多种存储机制:
“本地优先”的方法确保数据始终可离线访问,而云同步则在需要时支持协作和多设备访问。
Sources: packages/common/nbstore/package.json1-20 packages/frontend/native/index.d.ts26-65
AFFiNE 组织成一个 monorepo,其中包含用于系统不同部分的多个包。
这种结构在保持关注点分离的同时,实现了跨平台的代码共享。
| 包 | 目的 | 关键依赖项 |
|---|---|---|
@affine/core | 主应用程序逻辑 | React、BlockSuite、Yjs |
@affine/component | UI 组件库 | 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/graphql | GraphQL API | GraphQL、Apollo |
@affine/env | 环境配置 | - |
@toeverything/infra | 核心基础设施 | - |
来源: package.json51-93 packages/frontend/core/package.json10-83 packages/frontend/component/package.json22-68
AFFiNE 通过其 Copilot 系统集成 AI 功能,该系统在文档编辑体验中提供协助。
Copilot 系统设计为模块化的,支持 AFFiNE 工作空间内的多个 AI 提供商和用例。
来源: README.md82-84
AFFiNE 可以通过多种方式部署
构建系统主要通过自定义 CLI (@affine-tools/cli) 管理,并结合使用多种工具。
来源: docs/BUILDING.md1-30 docs/building-desktop-client-app.md1-30 tools/cli/package.json1-20
| 平台 | 包 | 技术栈 |
|---|---|---|
| Web | @affine/web | React, Vite |
| Windows | @affine/electron | Electron, Squirrel/NSIS |
| macOS | @affine/electron | Electron, DMG |
| Linux | @affine/electron | Electron, AppImage/DEB |
| iOS | @affine/ios | Capacitor |
| Android | @affine/android | Capacitor |
来源: 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