news 2026/5/1 7:28:23

从 WebView 到 React Native,再到 Flutter:用 Runtime 视角重新理解跨端框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从 WebView 到 React Native,再到 Flutter:用 Runtime 视角重新理解跨端框架

当我们讨论 RN、Flutter、KMP 时,很多争论停留在“哪个好”“性能谁高”“岗位多不多”。
但真正拉开层级差距的,不是 API,而是UI 在系统中的存在方式

当我开始从Runtime(运行时)与 UI 系统结构去看这些框架时,才发现:
它们的根本差异,不在语言,不在生态,而在UI 是否跨 Runtime

一、先统一概念:什么是 Runtime(运行时)?

Runtime 不是库,也不是框架,而是:

👉一套能独立执行代码、管理内存、调度任务、维护对象模型的系统环境。

常见 Runtime:

  • JS Runtime(Hermes / V8 / JSC)

  • Java Runtime(ART)

  • Dart Runtime

  • iOS Objective-C / Swift Runtime

每个 Runtime,本质上都是一个独立的小世界

二、WebView 混合:最原始的「双 Runtime + Bridge」

传统 WebView + JSBridge 架构:

JS Runtime(浏览器内核) ⇄ Bridge ⇄ Native Runtime(Android / iOS)

特点:

  • JS 操作 DOM
  • Native 提供系统能力
  • 原生并不知道页面结构
  • UI 完全由浏览器内核掌控

👉 这是最典型的双 Runtime 架构

问题也很明显:

  • UI 对原生是黑盒
  • 高频交互性能不可控
  • 无法纳入原生 UI 体系

三、React Native:把“网页”升级成“原生 UI 说明书”

React Native 做了一件本质性的改变:

👉不再让 JS 操作 DOM,而是用 JS 描述“原生 UI 说明书”。

例如:

<View> <Text>Hello</Text> </View>

这不是创建控件,而是在生成:

👉 一份“原生 UI 说明书(虚拟 UI 树)”。

RN 的核心链路

  1. JS 生成虚拟 UI 树(说明书)
  2. State 变化 → 新树 → Diff
  3. 通过 Bridge 发送 UI 操作指令
  4. 原生构建 Shadow Tree
  5. 创建/更新真实控件
  6. 系统完成渲染

本质可以概括为:

👉RN = JS UI 说明书 + 跨 Runtime UI 协议 + 原生执行器

四、RN 的本质特征:UI 是「跨 Runtime 的系统」

在 RN 中:

  • UI 状态 / Diff 在JS Runtime
  • UI 创建 / 更新 / 绘制在Native Runtime
  • 每一次 UI 变化,都必须跨 Runtime 同步

👉 UI 本身是一个分布式系统

这正是 RN 所有复杂度的根源:

  • Bridge 成本
  • 调度延迟
  • 多线程同步
  • 调试困难

这些不是“工程没写好”,而是结构特征

五、Flutter 为什么出现:干掉“跨 Runtime UI”

Flutter 的设计目标从一开始就和 RN 不同:

👉 不要 Bridge
👉 不要原生控件
👉 不要平台 UI 系统

Flutter 选择的是:

Dart Runtime + Flutter Engine + Skia ↓ 自己维护 UI Tree / Layout / Paint / Animation

也就是说:

  • UI Tree 在 Flutter Runtime
  • Diff 在 Flutter Runtime
  • 布局在 Flutter Runtime
  • 绘制在 Flutter Runtime

👉 UI 主链路在单一 Runtime 内闭环

原生只负责:

  • 窗口
  • 输入
  • 系统能力

六、关键分界线:不是“几个 Runtime”,而是“UI 在哪”

很多人会说:

Flutter 也有 Dart Runtime + 原生 Runtime,不也是双 Runtime?

从操作系统事实看没错。
但从架构意义上,这是完全不同的层级。

真正的分界线是:

RN / WebView

👉 UI 的生成与执行横跨两个 Runtime
👉 UI 是跨 Runtime 同步系统

Flutter(即使加上 KMP)

👉 UI 主循环完全在 Flutter Runtime 内
👉 跨 Runtime 的只是业务调用

所以更准确的说法是:

👉RN 是“双 Runtime UI 系统”
👉Flutter 是“单 Runtime UI 引擎系统”

七、KMP 的位置:业务 Runtime,而不是 UI 框架

KMP 的核心价值不在 UI,而在:

  • Domain / UseCase
  • 数据层
  • 协议层
  • 状态机
  • 业务一致性

它解决的是:

👉业务 Runtime 的复用问题。

典型高阶结构是:

UI Runtime(Flutter / CMP / RN) ↑ 业务 Runtime(KMP) ↑ 系统 Runtime(Android / iOS)

八、一句话统一所有跨端体系

  • WebView:双 Runtime + 黑盒 UI

  • RN:双 Runtime + 原生 UI 协议

  • Flutter:单 Runtime + UI 引擎

  • KMP:共享业务 Runtime

或者更狠一点:

👉RN 是桥接架构的极致,Flutter 是去桥接架构的结果。

九、我的最终认知模型

  • RN:JS 写原生 UI 说明书 → Bridge → 原生绘制

  • Flutter:Dart 写 UI → 引擎直接绘制

  • KMP:Kotlin 写业务内核 → 多端复用

  • 原生:系统能力与硬件边界

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 1:49:01

FFXIV辍学插件终极指南:3步快速跳过烦人动画

FFXIV辍学插件终极指南&#xff1a;3步快速跳过烦人动画 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip 还在为FF14副本中那些冗长的过场动画感到烦恼吗&#xff1f;FFXIV辍学插件正是你需要的完美解决…

作者头像 李华
网站建设 2026/5/1 5:12:17

systemd修复

比起君子讷于言而敏于行&#xff0c;我更喜欢君子善于言且敏于行。 目录 场景 解决思路&#xff1a; 1. 重装 2. 热恢复 1&#xff09;让 systemd 重新 exec 自身 2&#xff09;手动拉起 D-Bus&#xff08;它死了 systemd 就失联&#xff09; 3&#xff09;若 D-Bus 反复…

作者头像 李华
网站建设 2026/5/1 5:11:33

零翔出玩组局陪玩系统:技术架构与功能创新引领社交旅游新风尚

摘要 本文深入探讨了零翔出玩组局陪玩系统的技术架构、核心功能及其市场应用。该系统集组局、社群、论坛、搭子匹配、旅游线路规划、团购票券、线上线下陪玩、裂变营销等多功能于一体&#xff0c;通过先进的技术架构和丰富的功能选择&#xff0c;为用户提供了一站式社交旅游服…

作者头像 李华
网站建设 2026/5/1 5:11:51

如何快速使用FF14动画跳过插件:告别副本等待时间终极指南

如何快速使用FF14动画跳过插件&#xff1a;告别副本等待时间终极指南 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip 还在为FF14副本中漫长的动画播放而烦恼吗&#xff1f;每次组队刷副本&#xff0c;总…

作者头像 李华
网站建设 2026/5/1 5:12:23

Facebook开发者账号被封?2026年原因解析与解决方法

在出海业务中&#xff0c;Facebook 开发者账号&#xff08;Developer Account&#xff09;往往是被低估、却风险极高的一环。一旦开发者账号被封&#xff0c;影响的不只是某一个 App&#xff0c;而是 App ID、API 权限、广告投放、登录体系、数据回传等整条链路。不少团队会困惑…

作者头像 李华