共计 4705 个字符,预计需要花费 12 分钟才能阅读完成。
git
https://www.appflowy.io/
https://github.com/AppFlowy-I…
也就 1 周 star 9.8k,我认为他是刷的。
指标 & 特色
- 指标代替 Notion
- 数据 100% 本人治理
- 开源形式提供,你能够本人改
- 多平台反对
- 原生体验,预计是用了 flutter 关系
编译运行
-
- git clone
git clone https://github.com/AppFlowy-IO/appflowy.git
-
- 装置 rust
cd appflowy/frontend
make install_rust
source $HOME/.cargo/env
make install_cargo_make
cargo make install_targets
-
- 切换 flutter dev
flutter channel dev
or
fvm use dev
fvm global dev
-
- flutter 启用 desktop
# for windows
flutter config --enable-windows-desktop
# for macos
flutter config --enable-macos-desktop
# for linux
flutter config --enable-linux-desktop
-
- 用 vscode 或者其它 idea 关上
open appflowy/frontend
代码架构
-
技术选型
- flutter: 多端适配
- rust: ffi 平台接口、服务端
- flutter 端
frontend/app_flowy
- 前端业务 rust 层
frontend/rust-lib
- 共享库 shared-lib
shared-lib
- 后端 rust api
backend
参阅技术阐明 doc
- 零碎设计说明
doc/APPFLOWY_SYSTEM_DESIGN.md
Frontend FLowySDK
│ ┌─────────┐
│ ┌7─▶│Handler A│
│ │ └─────────┘
│ ┌─────────┐ │ ┌─────────┐
┌──────┐ ┌────┐ ┌──────────────┐ │ ┌───▶│Module A │──┼──▶│Handler B│
│Widget│─1─▶│Bloc│─2─▶│ Repository A │─3─┐ │ │ └─────────┘ │ └─────────┘
└──────┘ └────┘ └──────────────┘ │ │ │ │ ┌─────────┐
┌──────────────┐ │ ┌───────┐ ┌─┴──┐ ┌───────────┐ │ ┌─────────┐ └──▶│Handler C│
│ Repository B │───┼───▶│ Event │─4─▶│FFI │─5──▶│Dispatcher │─6─┼───▶│Module B │ └─────────┘
└──────────────┘ │ └───────┘ └─┬──┘ └───────────┘ │ └─────────┘
┌──────────────┐ │ │ │
│ Repository C │───┘ │ │ ┌─────────┐
└──────────────┘ │ └───▶│Module C │
│ └─────────┘
│
│
Here are the event flow:
- User click on the
Widget
(The user interface) that invokes theBloc
actions Bloc
calls the repositories to perform additional operations to handle the actions.Repository
offers the functionalities by combining the event, defined in theFlowySDK
.Events
will be passed in theFlowySDK
through the FFI interface.Dispatcher
parses the event and generates the specific action scheduled in theFlowySDK
runtime.Dispatcher
find the event handler declared by the modules.Handler
consumes the event and generates the response. The response will be returned to the widget through theFFI
.
The event flow will be discussed in two parts: the frontend implemented in flutter and the FlowySDK implemented in Rust.
- linux 编译阐明
doc/BUILD_ON_LINUX.md
- windows 编译阐明
doc/BUILD_ON_WINDOWS.md
- 奉献参加阐明
doc/CONTRIBUTING.md
- DDD 设计说明
doc/DOMAIN_DRIVEN_DESIGN.md
┌──────────────────────────────────────────────────┐ ─────────▶
│ Presentation Layer │──┐ Dependency
└──────────────────────────────────────────────────┘ │
│ │
▼ │
┌──────────────────────────────────────────────────┐ │
│ Application Layer │ │
└──────────────────────────────────────────────────┘ │
│ │
▼ │
┌──────────────────────────────────────────────────┐ │
│ Domain Layer │◀─┘
└──────────────────────────────────────────────────┘
▲
│
┌──────────────────────────────────────────────────┐
│ Infrastructure Layer │
└──────────────────────────────────────────────────┘
Presentation Layer:
- Responsible for presenting information to the user and interpreting user commands.
- Consists of Widgets and also the state of the Widgets.
Application Layer:
- Defines the jobs the software is supposed to do. (Shouldn’t find any UI code or network code)
- Coordinates the application activity and delegates work to the next layer down.
- It doesn’t contain any complex business logic but the basic validation on the user input before
passing to the other layer.
Domain Layer:
- Responsible for representing concepts of the business.
- Manages the business state or delegated to the infrastructure layer.
- Self contained and it doesn’t depend on any other layers. Domain should be well isolated from the
other layers.
Infrastructure Layer:
- Provides generic technical capabilities that support the higher layers. It deals with APIs, persistence and network, etc.
- Implements the repository interface and hiding the complexity of the Domain layer.
- 编辑器
doc/EDITOR.md
- roadmap
https://trello.com/b/NCyXCXXh…
看看本地文件在哪里
- 找到 sqlite
- 搜寻本地
find ~ -iname 'flowy-database.db'
~/Library/Containers/com.appflowy.macos/Data/Documents/flowy/fd3ada7d-7653-4196-90e1-7de0019627bc/flowy-database.db
flutter 插件
- flutter-quill
https://github.com/singerdmx/…
富文本编辑器
- freezed
https://pub.flutter-io.cn/pac…
数据 model 生成器,反对注解形式
- flutter_colorpicker
https://pub.flutter-io.cn/pac…
色彩选取工具
- styled_widget
https://pub.flutter-io.cn/pac…
简化小组件定义
Icon(OMIcons.home, color: Colors.white)
.padding(all: 10)
.decorated(color: Color(0xff7AC1E7), shape: BoxShape.circle)
.padding(all: 15)
.decorated(color: Color(0xffE8F2F7), shape: BoxShape.circle)
.padding(all: 20)
.card(
elevation: 10,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20),
),
)
.alignment(Alignment.center)
.backgroundColor(Color(0xffEBECF1));
- get_it
https://pub.flutter-io.cn/pac…
全局拜访你的业务对象,你能够拆分业务和 UI
// 定义
final getIt = GetIt.instance;
void setup() {getIt.registerSingleton<AppModel>(AppModel());
// Alternatively you could write it if you don't like global variables
GetIt.I.registerSingleton<AppModel>(AppModel());
}
// 应用
MaterialButton(child: Text("Update"),
onPressed: getIt<AppModel>().update // given that your AppModel has a method update),
总结
- 看到人家的架构,感觉本人弱爆了,我还是先畛域分层设计做做洁净
- flutter bloc , rust ffi web protobuf 感觉还是成熟的抉择
- 如果继续更新的话,我也很想看看架构的演变
- 现阶段预计还是在测试架构设计,应该不会上很多性能
© 猫哥
- https://ducafecat.tech/
- https://github.com/ducafecat
- 微信群 ducafecat
正文完