介绍一下 fre native.

介绍一下 fre native.
最新回答
青苓菀

2022-07-19 16:03:46

fre native 是一个基于 Flutter 与 Rust 结合的跨端动态化框架,核心通过 Dart FFI 调用 Rust 实现的 Arena 树结构,优化内存管理与渲染性能,同时探索 Flutter 动态化解决方案。以下是详细介绍:

核心架构与实现原理
  1. 技术栈整合

    Flutter + QuickJS:在 Flutter 中嵌入 QuickJS 引擎运行 fre 逻辑,通过 Dart FFI 与 Rust 交互。

    Rust Arena 树:Rust 端维护一棵内存中的 Arena 树,通过索引建立引用关系,避免所有权问题。

    渲染流程

    fre 通过 Arena API 调用 Rust 方法生成 Arena 树。

    Rust 完成布局计算(Layout)后,将树结构转换为 Flutter 的 Widget 或 Render Object 渲染。

图:fre native 的整体架构,展示 Flutter、QuickJS、Rust 和渲染层的交互
  1. 设计动机

    避免 VDOM 性能开销

    传统 VDOM(如 React)每次生成新树并与旧树对比(Immediate Mode),不适合 FFI 通信和算法优化。

    Arena 树在内存中持久化,仅操作单棵树,减少内存分配与对比开销,类似 Angular Ivy 的 IDOM 设计。

    Rust 的结构优势

    Rust 的所有权模型限制复杂结构实现,Arena 模式通过索引引用绕过限制,简化内存管理。

关键模块解析
  1. Arena API

    功能:提供内存中树的创建、操作和遍历接口,支持 Flutter 通过 Dart FFI 调用 Rust 方法。

    优势

    统一内存管理,避免频繁分配/释放节点。

    便于实现局部更新(如 Flex 布局的 OBB 算法需依赖平台局部渲染接口)。

  2. Layout 计算

    移动端布局核心:聚焦 Flex 布局与动画,通过 Rust 实现高效计算。

    算法选择

    优先利用平台局部更新接口(如 H5 Canvas 的 clearRect),避免全屏重绘。

    示例:iOS 平台若缺乏局部更新接口,可能导致性能下降(类似 Firefox 早期问题)。

  3. Flutter 动态化支持

    Dart FFI 双向通信

    Flutter 提供 FFI 支持透传回调,实现与 Rust 的双向交互。

    对比阿里 Kraken:Kraken 在 Dart 端模拟 W3C DOM/CSS,而 fre 直接使用 Rust 维护核心结构,减少 Case-by-Case 代码(如 React 4 万行 vs. fre 400 行)。

与同类框架对比
  1. 与 Kraken 的差异

    结构实现

    Kraken:Dart 模拟 DOM 和 W3C 标准,贴近 Web 开发习惯。

    fre:Rust 维护 Arena 树,追求“受控的画图纯度”,便于远程调试。

    代码量:fre 通过结构优化显著减少代码量,但功能覆盖度可能低于 Kraken。

  2. 与 RN Fabric 的差异

    树结构

    RN Fabric:使用 Shadow Tree 抽象层,与平台渲染树解耦。

    fre:Arena 树专为 Rust 设计,通过 FFI 与 Flutter 交互,风格不同但目标相似。

    通用性:两者架构类似,均可适配多平台(如小程序、Deno),但 fre 更侧重 Rust 生态整合。

项目目标与现状
  1. 核心目标

    跨端动态化:提供 Flutter 动态化方案,支持热更新与逻辑动态下发。

    Rust 技术探索:通过 FFI 串联 Dart、Rust 等语言,积累多语言协作经验。

    性能优化:测试用例稳定(100+ 用例通过),证明核心算法已达稳定状态。

  2. 当前状态

    仓库性质:私人仓库,持续调整结构,未正式开源。

    适用场景

    不推荐替代 React/Vue(生态与性能无优势)。

    适合需要轻量级、高可控性的动态化场景(如嵌入式设备、特定领域跨端应用)。

  3. 未来规划

    完善 Flutter 动态化能力,支持更复杂的业务逻辑。

    扩展多语言支持(如 Go、Zig),探索 FFI 在更多场景的应用。

总结

fre native 通过 Rust Arena 树与 Dart FFI 的结合,在内存管理与渲染性能上实现创新,为 Flutter 动态化提供了新思路。尽管生态成熟度不及 React/Vue,但其轻量级设计与对 Rust 的深度整合,使其在特定领域具备独特优势。项目仍处于演进阶段,未来有望成为多语言协作与跨端开发的参考案例。