2022-07-19 16:03:46
fre native 是一个基于 Flutter 与 Rust 结合的跨端动态化框架,核心通过 Dart FFI 调用 Rust 实现的 Arena 树结构,优化内存管理与渲染性能,同时探索 Flutter 动态化解决方案。以下是详细介绍:
核心架构与实现原理Flutter + QuickJS:在 Flutter 中嵌入 QuickJS 引擎运行 fre 逻辑,通过 Dart FFI 与 Rust 交互。
Rust Arena 树:Rust 端维护一棵内存中的 Arena 树,通过索引建立引用关系,避免所有权问题。
渲染流程:
fre 通过 Arena API 调用 Rust 方法生成 Arena 树。
Rust 完成布局计算(Layout)后,将树结构转换为 Flutter 的 Widget 或 Render Object 渲染。
避免 VDOM 性能开销:
传统 VDOM(如 React)每次生成新树并与旧树对比(Immediate Mode),不适合 FFI 通信和算法优化。
Arena 树在内存中持久化,仅操作单棵树,减少内存分配与对比开销,类似 Angular Ivy 的 IDOM 设计。
Rust 的结构优势:
Rust 的所有权模型限制复杂结构实现,Arena 模式通过索引引用绕过限制,简化内存管理。
Arena API
功能:提供内存中树的创建、操作和遍历接口,支持 Flutter 通过 Dart FFI 调用 Rust 方法。
优势:
统一内存管理,避免频繁分配/释放节点。
便于实现局部更新(如 Flex 布局的 OBB 算法需依赖平台局部渲染接口)。
Layout 计算
移动端布局核心:聚焦 Flex 布局与动画,通过 Rust 实现高效计算。
算法选择:
优先利用平台局部更新接口(如 H5 Canvas 的 clearRect),避免全屏重绘。
示例:iOS 平台若缺乏局部更新接口,可能导致性能下降(类似 Firefox 早期问题)。
Flutter 动态化支持
Dart FFI 双向通信:
Flutter 提供 FFI 支持透传回调,实现与 Rust 的双向交互。
对比阿里 Kraken:Kraken 在 Dart 端模拟 W3C DOM/CSS,而 fre 直接使用 Rust 维护核心结构,减少 Case-by-Case 代码(如 React 4 万行 vs. fre 400 行)。
与 Kraken 的差异
结构实现:
Kraken:Dart 模拟 DOM 和 W3C 标准,贴近 Web 开发习惯。
fre:Rust 维护 Arena 树,追求“受控的画图纯度”,便于远程调试。
代码量:fre 通过结构优化显著减少代码量,但功能覆盖度可能低于 Kraken。
与 RN Fabric 的差异
树结构:
RN Fabric:使用 Shadow Tree 抽象层,与平台渲染树解耦。
fre:Arena 树专为 Rust 设计,通过 FFI 与 Flutter 交互,风格不同但目标相似。
通用性:两者架构类似,均可适配多平台(如小程序、Deno),但 fre 更侧重 Rust 生态整合。
核心目标
跨端动态化:提供 Flutter 动态化方案,支持热更新与逻辑动态下发。
Rust 技术探索:通过 FFI 串联 Dart、Rust 等语言,积累多语言协作经验。
性能优化:测试用例稳定(100+ 用例通过),证明核心算法已达稳定状态。
当前状态
仓库性质:私人仓库,持续调整结构,未正式开源。
适用场景:
不推荐替代 React/Vue(生态与性能无优势)。
适合需要轻量级、高可控性的动态化场景(如嵌入式设备、特定领域跨端应用)。
未来规划
完善 Flutter 动态化能力,支持更复杂的业务逻辑。
扩展多语言支持(如 Go、Zig),探索 FFI 在更多场景的应用。
fre native 通过 Rust Arena 树与 Dart FFI 的结合,在内存管理与渲染性能上实现创新,为 Flutter 动态化提供了新思路。尽管生态成熟度不及 React/Vue,但其轻量级设计与对 Rust 的深度整合,使其在特定领域具备独特优势。项目仍处于演进阶段,未来有望成为多语言协作与跨端开发的参考案例。