写在前面
你有没有遇到过这些烦恼:Notion经常卡顿加载,Miro的数据不知道存在哪,想要个完全属于自己的知识管理系统?
今天分享的AFFiNE,就是为了解决这些问题而生的。
什么是AFFiNE
AFFiNE是一个开源工作空间,把文档编辑、白板绘图、数据库管理三个功能合在一起。
最大亮点是本地优先——数据存在你自己电脑上,断网也能用,联网后自动同步。
这个项目在GitHub上线不到3年,现在已经有58.3k个星标,社区很活跃。
技术架构
双语言开发模式
前端用TypeScript + React写业务逻辑,性能关键部分用Rust实现,通过WASM连接。
TypeScript + React课程:https://yunpan.plus/t/71-1-1
这样做的好处是开发效率和运行性能都能兼顾。
自研编辑器BlockSuite
团队没有直接用现成的编辑器框架,而是自己开发了BlockSuite引擎。
核心设计理念是:同一份数据可以用两种方式展示。
- 文档模式:传统的上下滚动排版
- 白板模式:自由拖放的画布布局
所以你能把文档里的内容直接拖到白板上,反过来也可以。
CRDT协同算法
多人同时编辑时如何避免冲突?AFFiNE用的是CRDT(无冲突复制数据类型)方案。
传统方案需要服务器做仲裁,必须联网。CRDT可以在本地计算,离线状态下也能正常工作。
底层基于Y.js实现,配合浏览器的IndexedDB存储。
项目结构
AFFiNE/
├── blocksuite/ # 编辑器引擎
├── packages/
│ ├── frontend/ # Web应用
│ ├── backend/ # 服务端
│ └── native/ # 桌面客户端
├── tests/ # 测试代码
└── tools/ # 开发工具
采用Monorepo架构,用Yarn Workspace管理多个子项目。
值得关注的设计
插件系统
类似VSCode的扩展机制,开发者可以贡献新的Block类型。
比如有人想加个思维导图功能,就可以写个插件实现。
性能优化
白板上可能有成百上千个元素,怎么保证流畅?
答案是用四叉树做空间索引:
- 把画布分成网格
- 只渲染屏幕上看得见的部分
- 拖动时动态加载其他区域
灵活的部署方式
提供三种使用方式:
- 直接用官方云服务
- Docker一键部署到自己服务器
- 完全私有化部署(配置自己的数据库)
从零门槛到完全掌控,用户可以根据需求选择。
快速上手
本地开发
git clone https://github.com/toeverything/AFFiNE.git
cd AFFiNE
yarn install
yarn dev
浏览器打开 http://localhost:3000 就能看到效果。
生产部署
官方提供Docker镜像,配合Postgres数据库使用:
services:
affine:
image: ghcr.io/toeverything/affine:stable
ports: ["3000:3000"]
volumes: ["./data:/app/data"]
所有数据都在你自己的服务器上。
适合谁用
个人用户:管理笔记、写日记、规划项目
团队协作:共同编辑文档、头脑风暴、任务看板
开发者:学习编辑器引擎设计、CRDT算法实现
企业:私有化部署,满足数据安全合规要求
和同类产品的对比
Notion主要是云端应用,离线功能受限。
Miro专注白板,文档编辑比较弱。
Airtable数据库很强,但编辑体验一般。
AFFiNE把三者的功能整合在一起,加上本地优先的特性。
当然功能成熟度还在追赶阶段,毕竟项目比较年轻。
技术栈总结
前端:React 18 + TypeScript + Jotai
编辑器:BlockSuite(自研)
协同:Y.js (CRDT)
构建:Vite + Turborepo
后端:Node.js + Rust
数据库:Postgres + IndexedDB
桌面端:Electron / Tauri
写在最后
AFFiNE想做的是一个"操作系统级"的知识管理工具。
从技术角度看,它体现了几个趋势:
- 本地优先替代纯云端
- Rust+TS混合开发
- Monorepo管理复杂项目
- 自托管成为产品优势
对前端开发者来说,这是个不错的学习案例——从编辑器引擎到协同算法,从构建优化到跨平台方案,涉及大型项目的各个技术环节。
关注《云栈大前端》,分享更多开源项目解析
项目资源
GitHub仓库:https://github.com/toeverything/AFFiNE
官方网站:https://affine.pro
在线体验:https://app.affine.pro
文档中心:https://docs.affine.pro
前端全栈课程:https://yunpan.plus/t/71-1-1
标签:#AFFiNE #GitHub #开源项目 #知识管理 #协作工具 #Rust #TypeScript #LocalFirst