返回目录

aria

dqsjqian/aria

Modern C++20 MVVM framework — cross-platform, layered, coroutine-first. Reactive DAG (Property/Computed/Effect), Task<T>, and pluggable adapters (Qt6, AppKit, ...).

15

星标

5

Fork

MIT

许可证

2026-04-30

创建于

2026-08-16

最近推送

README

⚡ Aria

现代 C++20 MVVM 框架 · 跨平台 · 分层架构 · 协程优先

一套共享核心,覆盖 Windows / macOS / Linux / iOS / Android / Web

C++20 License: MIT Platform Build Tests

English | 简体中文 | HTML 版本


🎯 与主流框架对比

Aria Qt Flutter React Native SwiftUI
语言 C++20 C++ / QML Dart JS / TS Swift
核心体积 仅头文件,~0 100+ MB ~50 MB SDK ~200 MB node_modules 系统内置
响应式引擎 ✅ 自动依赖追踪(Computed 零配置) ❌ 手动 connect 信号槽 ✅ 但锁死在 Flutter 框架内 ✅ 但锁死在 React 内 ✅ 但锁死在 Apple 内
C++20 协程 Task<T> + co_await ⚠️ QCoroutine(受限)
ABI 稳定 ✅ 类型擦除层,主版本号内稳定 ⚠️ 部分稳定
UI 工具包 ✅ 任意(Qt / AppKit / UIKit / JNI / Web / WASM) ❌ 只有 Qt ❌ 只有 Flutter UI ❌ 只有 React 组件 ❌ 只有 SwiftUI
同一 ViewModel 跨平台 ✅ 一份 C++ 代码驱动 6 个平台 ❌ 每个平台要 QML 重写 ⚠️ Dart 跨平台但非原生 UI ⚠️ JS 跨平台但非原生 UI ❌ Apple only
Web 支持 ✅ HTTP/SSE(服务端驱动)+ WASM(计划) ✅ Web
宏依赖 零宏 大量 Q_OBJECT / SIGNAL / SLOT
License MIT LGPL / 商业 BSD MIT Apple 闭源

一句话:aria 把响应式引擎从 UI 框架里拆出来,做成纯 C++20 头文件库。你选什么 UI 工具包都行,ViewModel 一份代码跑六个平台。

✨ 核心特性

  • 📦 仅头文件核心 —— Property<T> / Computed<T> / Effect / Command<> / ObservableList<T> / Validator<T> 共享同一个响应式依赖图引擎。Computed 自动跟踪依赖,reactive::batch / reactive::untracked 精确控制通知范围。
  • 🔌 类型擦除 ABI 层 —— aria-abi / aria-runtime / aria-binding 在主版本号内 ABI 稳定;模板层仅源码兼容。
  • C++20 协程 —— Task<T>、执行器、co_await schedule_on(pool),异步代码写起来像同步代码。
  • 🖥 适配器抽象 (IViewAdapter) —— Qt6 / AppKit / UIKit / JNI / HTTP / WASM,任何 UI 工具包都能用同一套业务逻辑驱动。

🏗 架构(10 个模块)

┌────────────────────────────────────────────────────────────────────────┐
│                         应用层 (Application)                            │
└────────────────────────────────┬───────────────────────────────────────┘
              ┌──────────────────┼──────────────────┐
              ▼                  ▼                  ▼
   ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
   │ Qt6 适配器    │    │ JNI 适配器    │    │ HTTP 适配器   │     (可选模块;
   │ (Win/Mac/Lin)│    │  (Android)   │    │ REST/SSE Web │      按需启用)
   │ AppKit/UIKit │    │              │    │ WASM 计划中   │
   └──────┬───────┘    └──────┬───────┘    └──────┬───────┘
          └───────────────────┴───────────────────┘
                              ▼
              ┌─────────────────────────────────┐
              │    aria-binding  (SHARED)       │
              │  BindingEngine + IViewAdapter   │
              └────────────────┬────────────────┘
                               │
        ┌──────────────────────┴───────────────────────┐
        ▼                                              ▼
┌───────────────────┐                       ┌────────────────────┐
│ aria-runtime      │                       │  aria-async        │
│ (SHARED .dylib)   │                       │   (仅头文件)        │
│ EventBus          │                       │ Task<T>            │
│ Container         │                       │ Scheduler          │
│ Dispatcher        │                       │ Executor           │
│ Logger            │                       │ schedule_on        │
└───────┬───────────┘                       └─────────┬──────────┘
        └──────────────────┬─────────────────────────┘
                           ▼
              ┌─────────────────────────────┐
              │ aria-core  (仅头文件)        │
              │ Property / Computed / Cmd   │
              │ ObservableList / Validator  │
              │ Subscription                │
              └────────────┬──────────────┘
                             ▼
              ┌─────────────────────────────┐
              │  aria-abi  (STATIC .a)      │
              │ 类型擦除 Signal/Slot         │
              │ ABI 稳定,无模板              │
              └─────────────────────────────┘
模块 类型 依赖 说明
aria-abi STATIC 类型擦除的信号/槽,无模板,ABI 稳定
aria-core 仅头文件 abi 全部模板:PropertyComputedCommandObservableListValidator。仅源码兼容。
aria-async 仅头文件 core C++20 Task<T>、执行器。仅源码兼容。
aria-runtime SHARED core, abi EventBus / Container / Dispatcher / Logger —— 单例统一放在一个动态库中。ABI 稳定
aria-binding SHARED core, runtime BindingEngineIViewAdapterABI 稳定
适配器 SHARED/STATIC binding Qt6 / AppKit / UIKit / JNI / HTTP(按需启用);WASM 计划中。

📋 环境要求

  • CMake >= 3.20
  • 完整支持 C++20 的编译器
    • GCC >= 12(Windows 下可走 MSYS2 UCRT64 工具链)
    • Clang >= 15(macOS/iOS 上 AppleClang 15+ 即可)
    • MSVC v143 / Visual Studio 2022(Windows,详见下文)
  • (可选) Qt6 >= 6.4(用于 Qt6 适配器和 GUI 示例)

Windows 同时支持 MSYS2 UCRT64(GCC)和 MSVC / Visual Studio 2022 两条工具链。 团队栈里有哪个就用哪个 —— 同一棵源码树都能编出完整框架 + 测试 + 适配器,不需要分支或 fork。

🚀 快速开始

git clone https://github.com/dqsjqian/aria.git
cd aria
cmake -B build/flavors/release -DCMAKE_BUILD_TYPE=Release
cmake --build build/flavors/release -j
ctest --test-dir build/flavors/release --output-on-failure

build/ 是构建树的容器,不要直接配置进它。统一布局见 scripts/build.sh 顶部。

🔧 一键构建脚本

# macOS / Linux
scripts/build.sh             # Release
scripts/build.sh tests       # Release + 跑测试
scripts/build.sh asan        # Debug + AddressSanitizer + UBSan
scripts/build.sh tsan        # Debug + ThreadSanitizer

# Windows —— MSYS2 UCRT64(GCC + Ninja)
scripts\build.ps1            # Release
scripts\build.ps1 tests
scripts\build.ps1 asan

# Windows —— MSVC / Visual Studio 2022
scripts\build-msvc.ps1       # Release(使用 build/flavors/msvc/ 目录)
scripts\build-msvc.ps1 tests
scripts\build-msvc.ps1 debug

🛠 Windows 工具链

工具链 脚本 构建目录 备注
MSYS2 UCRT64(GCC 14+ / Clang 18+) scripts\build.ps1 build/ 体积小(≈300 MB),大多数 CI 镜像已预装。
MSVC v143(VS 2022) scripts\build-msvc.ps1 build/flavors/msvc/ 通过 vswhere 自动定位 VS 安装;使用 Visual Studio 17 2022 生成器。
📖 MSVC 一次性配置
# 1. 安装 Visual Studio 2022 Build Tools(或完整 IDE),勾选
#    "Desktop development with C++" + "C++ CMake tools"。
# 2. (可选)安装 Qt 6 的 msvc2022_64 组件。
# 3. 任意 PowerShell 窗口里:
scripts\build-msvc.ps1 tests
📖 MSYS2 一次性配置
# 1. 从 https://www.msys2.org 安装 MSYS2
# 2. 打开 "MSYS2 UCRT64" 终端:
pacman -Syu
pacman -S --needed mingw-w64-ucrt-x86_64-toolchain \
                   mingw-w64-ucrt-x86_64-cmake \
                   mingw-w64-ucrt-x86_64-ninja git
# 3. (可选)把 C:\msys64\ucrt64\bin 加入 PATH
# 4. 从任意终端执行:
scripts\build.ps1 tests

📦 在自己的项目中使用

方式 A —— 先安装,再用 find_package(生产环境推荐):

cmake -S . -B build/flavors/release -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build/flavors/release -j && sudo cmake --install build/flavors/release
find_package(aria 1.0 REQUIRED)
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE aria::aria)
# 也可以按需选择模块:aria::core / ::async / ::runtime / ::binding

方式 B —— 直接嵌入(不安装)

add_subdirectory(third_party/aria EXCLUDE_FROM_ALL)
target_link_libraries(my_app PRIVATE aria::core aria::async)

即拷即用的模板在 templates/quickstart/

💻 示例项目

aria 提供覆盖每一个受支持 UI 工具包的可运行示例,外加几个无界面、专门压核心的控制台示例。

UI 展示示例:

# 项目 工具包 演示内容
1 qt-showcase Qt6 (Widgets) 总展厅 Demo:一个应用、九个 Tab,覆盖框架全部公开能力
2 macos-appkit-mvvm macOS AppKit (ObjC++) 自定义 IViewAdapter 绑定原生 NSTextField/NSButton
3 ios-oc-uikit-mvvm iOS UIKit (ObjC++) 自定义 IViewAdapter 绑定原生 UIKit 控件
4 web-mvvm Web(HTTP/REST/SSE) HttpAdapter 把 C++ ViewModel 暴露给浏览器,可选 HTTPS
5 android-jni-mvvm Android(JNI + Compose) 从 Kotlin 驱动同一个 C++ ViewModel

无界面 / 控制台示例ARIA_BUILD_EXAMPLES=ON):

项目 演示内容
inspector-demo CLI 响应式图 flush 追踪器
plugin-property-demo 跨 dylib 的 ABI 冒烟测试
todomvc 无界面 TodoMVC:ObservableList + FilteredList + Selection
📖 构建并运行示例
# 示例 1(Qt)
cmake -S . -B build/flavors/qt-demo -DARIA_BUILD_QT6=ON
cmake --build build/flavors/qt-demo -j
./build/flavors/qt-demo/bin/ex_qt_showcase

# 示例 4(web)—— 需要 HTTP 适配器
cmake -S . -B build/flavors/web-demo -DARIA_BUILD_HTTP=ON
cmake --build build/flavors/web-demo --target example_4_web_mvvm

示例 2、3 不参与 CMake 构建 —— 直接打开 Xcode 工程运行;示例 5 是 Android Studio / Gradle 工程(需 NDK r26+)。

⚙️ 构建选项

选项 默认值 说明
ARIA_BUILD_TESTS ON 构建单元测试并注册到 ctest。
ARIA_BUILD_EXAMPLES ON 构建所有示例。
ARIA_BUILD_BENCHMARK ON 构建微基准测试。
ARIA_BUILD_SHARED ON runtime/binding 编译为动态库。
ARIA_BUILD_QT6 OFF 构建 Qt6 适配器和 GUI 示例。
ARIA_BUILD_APPKIT OFF macOS AppKit 适配器(需 APPLE)。
ARIA_BUILD_UIKIT OFF iOS UIKit 适配器(需 APPLE)。
ARIA_BUILD_JNI OFF Android JNI 适配器(需 NDK r26+)。
ARIA_BUILD_HTTP OFF HTTP/REST/SSE 适配器 + Web 示例。
ARIA_BUILD_WASM OFF (计划中) WebAssembly 适配器。
ARIA_ENABLE_ASAN OFF AddressSanitizer。
ARIA_ENABLE_UBSAN OFF UndefinedBehaviorSanitizer。
ARIA_ENABLE_TSAN OFF ThreadSanitizer。

👋 Hello, world

#include "aria/aria.hpp"
using namespace aria;

Property<int> count{0};

// 不再需要显式依赖列表 —— Computed 首次求值时,
// 内部读到的每一个 Property::get() 都会被自动追踪为依赖。
Computed<std::string> label([&]{
    return "count = " + std::to_string(count.get());
});

Command<> increment([&]{ count = count.get() + 1; });

auto sub = label.bind([](const std::string& s) { std::cout << s << '\n'; });

increment();   // → "count = 1"
increment();   // → "count = 2"

⚡ 异步编程(C++20 协程)

#include "aria/async/task.hpp"
#include "aria/async/executor.hpp"
using namespace aria::async;

Task<std::string> fetch_user(int id) {
    co_await schedule_on(network_pool);     // 跳到工作线程
    auto raw = http::get("/users/" + std::to_string(id));
    co_await schedule_on(main_dispatcher);   // 切回 UI 线程
    co_return parse(raw);
}

🌍 跨平台映射

平台 UI 宿主 适配器 状态
Windows Qt6 / WinUI aria-qt6 ✅ MSYS2 UCRT64 + MSVC 2022
macOS AppKit / Qt6 aria-qt6 / aria-appkit ✅ 可用
Linux Qt6 / GTK aria-qt6 ✅ 可用
iOS UIKit / SwiftUI bridge aria-uikit ✅ 可用(示例 3)
Android Compose / View aria-jni ✅ 就绪(NDK r26+)
Web(服务端驱动) 浏览器 HTML/JS aria-http ✅ REST + SSE(示例 4)
Web(浏览器内 C++) DOM via WASM aria-wasm 🔜 计划中

🧪 测试状态

$ ctest --test-dir build --output-on-failure
    Start 1: abi_tests           ✅ Passed
    Start 2: core_tests          ✅ Passed
    Start 3: fuzz_tests          ✅ Passed
    Start 4: async_tests         ✅ Passed
    Start 5: runtime_tests       ✅ Passed
    Start 6: binding_tests       ✅ Passed
    Start 7: qt6_tests           ✅ Passed   (ARIA_BUILD_QT6=ON)
    Start 8: appkit_conformance  ✅ Passed   (Apple 平台)
    Start 9: appkit_table_source ✅ Passed   (Apple 平台)

100% tests passed, 0 tests failed

75+ 个测试用例覆盖 docs/reference/lifecycle.mddocs/reference/error-model.md 中所有生命周期 / 重入 / 异常安全契约。

📊 性能基准(Apple M 系列, -O3 -DNDEBUG)

操作 纳秒/次
Property<int>::get() 10.4
Property<int>::set() 无观察者 28.5
Property<int>::set() 1 个观察者 29.3
Property<int>::set() 10 个观察者 45.9
订阅 + 自动取消订阅周期 54.9
Computed 链 x5(set + 重新计算 + get) 289.1
EventBus::publish(1 个订阅者) 13.4
Container::resolve<Singleton> 7.6
10 次 set 包在 reactive::batch 156.1
批量更新加速比(对比逐次更新) 1.91×

📋 框架本体契约

所有非平庸行为都钉在带编号的契约文档里,每条契约有稳定 ID(如 L-13 / E-22 / LD-7)。

文档 前缀 范围
api-style.md S-N 命名、命名空间、错误与异步风格约束
lifecycle.md L-N 线程、订阅、flush、view 销毁、cancel/dtor 不变式
error-model.md E-N aria::Error / ErrorKind taxonomy
list-diff-contract.md LD-N Insert / Remove / Replace / Move / Reset 语义
diagnostics.md D-N TraceEvent + TraceSink 诊断协议
performance.md PERF-N 复杂度上界与实测基线

🗺 路线图

Aria 已开源(MIT License),源码托管在 GitHub。待办与已延后清单的唯一信息源在 docs/ROADMAP.md;当前能力快照见 CHANGELOG.md

🤝 贡献指南

欢迎贡献!涉及架构改动的请先开 Issue 讨论。

  • 代码风格由 .clang-format.clang-tidy 统一管控
  • 所有变更必须通过 ctest --output-on-failure
  • 新功能需要在对应 modules/*/tests/ 套件中补充测试

🙏 致谢

📄 License

MIT © 2026 aria contributors


📖 其他格式

HTML 版本 · English · English HTML

DSH Plugins 是独立的 DeepSeek Harness plugins 社区导航站,与 DeepSeek 官方无关,也不代表官方背书。第三方插件未经安全审计,安装前请审查源码。