Rust in Everything
基于 dioxus 0.7.10

动手

前面十部分读的是 dioxus 的源码。这一部分反过来:不依赖 dioxus,自己写一个迷你的「模板 + 虚拟 DOM + signal」,把更新主线中间那一段(signal 写入、组件标脏、按高度重跑、只比动态槽位、发出指令)从头实现一遍。模板手写成 static,代替 rsx! 的展开;指令和 dioxus 的 Mutation 同名同参;渲染目标是一串指令和一段 HTML,不碰浏览器。写完之后让 dioxus 0.7.10 跑同一组组件,逐行比较两边发出的指令。

  1. 写一个迷你虚拟 DOM:约 550 行核心代码,无依赖。Template 是静态树加两张路径表,VNode 是模板指针加动态值,diff 先比模板指针、再逐个比动态槽位;创建时先写属性、再倒着填动态节点;signal 读时订阅正在运行的组件,写时标脏,队列按 (高度, ScopeId) 从根往下取。计数器、父子组件同时变脏这两组例子,指令和 ElementId 与 dioxus 逐行相同;列表长度变化时 mini 整块替换,dioxus 只增删尾部。
flowchart TB
  tpl["Template 手写 static"] --> vnode["VNode 模板加动态值"]
  sig["Signal 读时订阅"] --> queue["按高度排序的队列"]
  queue --> vnode
  vnode --> diffnode["diff 只比动态槽位"]
  diffnode --> muts["Mutation 列表"]
  vnode --> ssr["SSR 写 HTML"]
  muts --> cmp["和 dioxus 逐行对照"]

💬 关联讨论

发起讨论
加载中...