背景
2026-09-27,zjchina 从「web 项目」升级为多机协同 / 人机交互架构。现状是三套
渲染后端共用一份 zjchina-ui 组件:web=DOM(浏览器)、desktop/mobile=blitz
自绘(真机)、ssr=HTML 字符串(SEO 侧车),靠 CSS 勉强对齐同构;且
Cargo.toml 里 default = ["web"] 意味着自绘后端从未在正式构建中真正跑过一次。
未来真实场景分化:工厂大屏 / 车间看板 / KUKA 工业平板 / 机器人 HMI 是无浏览器的 真机设备,只能自绘;而对外 zjchina.net 依赖 SEO 与零安装访问,只能浏览器渲染。 二者不是「谁取代谁」,而是需要一条明确的渲染路由。
选项
- 全自绘(web 也走 CanvasKit 式自绘)。 二三类端像素级一致,但 web 端 SEO / 首包 / 无障碍全面倒退——Flutter Web 的 CanvasKit 已是反面教材。
- 维持全 web(
default=["web"],多端继续「声明不用」)。 零风险,但真机 设备端场景永远无处落地,多端声明沦为装饰。 - 自绘为尊 + web 走浏览器渲染兜底(采纳)。 自绘引擎(blitz/wgpu)升为 第一公民服务真机设备端;web 保持 DOM + SSR 侧车,专职浏览器渲染,永不自绘。
证据
- Dioxus 自绘后端(blitz/wgpu)= Flutter Impeller 的对应物;
Cargo.toml第 60–66 行早已声明desktop/mobile,缺的是优先级固化而非再造引擎。 - Flutter 自身 Skia→Impeller 的迁移代价证明:自绘引擎一旦当第一公民就是身份层, 禁不起轻换——因此必须把它们从 L1「借用」提级,而不能继续当作可替换件。
- web 现有 DOM + SSR 线已在生产验证(
X-ZJ-Tier: ssr,侧车故障可降级 CSR 薄壳), SEO 与首绘不回退;「web 不自绘」是对这条已验证能力的保留,不是新风险。
拍板
拍板者 zj:渲染自绘为尊、web 走浏览器渲染兜底。Dioxus 的自绘渲染引擎 (blitz/wgpu)从 L1 借用提升为 L0 级身份层;Dioxus 的组件 DSL(RSX/信号)仍是 L1 借用。web 永不引入 CanvasKit 式自绘。AI 协作者(TRAE)参与场景梳理与选项对比, 拍板权属作者。日期:2026-09-27。
修订记录(Amendments)
- 2026-09-28(修订:spike 证伪 + 内核落地):上面「拍板」的大方向不变
(自绘为尊、web 走浏览器渲染兜底),但「blitz/wgpu」这一表述已被 spike 证伪
并落地为确定内核。要点:
- blitz 出局:dioxus-blitz 在 crates.io 未发布、官方 pre-alpha;
desktop/mobilefeature 实际映射 wry/WKWebView,并非自绘真机。原「证据」 第 1 条(“blitz = Flutter Impeller 对应物,缺的只是优先级固化而非再造引擎”) 作废——恰恰需要再造。 - 独立 wgpu 内核可行:
tidewatch/crates/tw-render最小 spike 实测 5 万蜡烛(10 万 instanced 图元)+ 中文坐标标签在 macOS/Metal 稳定 120 FPS。 - 转正为 zjchina-render(
zjchina-render/,独立 workspace,不并入根 members):领域无关的最小 L0 内核,instanced 静态几何一次性上传 + 每帧仅写 16B 投影 uniform 的渲染策略,供 tidewatch 与后续真机设备端消费。 - 据此,本 ADR 正文中「blitz/wgpu」的语义自 2026-09-28 起统一为 「自有 wgpu 内核 zjchina-render」;Dioxus 组件 DSL(RSX/信号)维持 L1 借用不变。
- blitz 出局:dioxus-blitz 在 crates.io 未发布、官方 pre-alpha;