CrossFly 是一个开源框架(Apache 2.0),你用纯 Java 编写 UI 和逻辑,它通过 LibGDX/OpenGL 在 GPU 上渲染,并编译为桌面端(Windows、macOS 和 Linux)、Android 和 iOS 的原生二进制文件,以及可在 Chrome、Firefox、Safari 等任何现代浏览器中运行的 WebGL 构建。搭配 CrossFly Sync 即可实现离线优先的数据。
React Native 是 Meta 的开源(MIT)框架,你编写 JavaScript/TypeScript,它使用每个平台的原生控件来渲染。其新架构(JSI/Fabric/TurboModules)取代了旧的桥。它面向 Android 和 iOS;桌面由社区维护、在主干之外。
真正重要的差异
新架构解决了真实的问题。这里说的是它没解决的——以及 CrossFly 在结构上更简单的地方。
UI 仍然骑在一条 JavaScript 线程上
新架构(JSI/Fabric)移除了旧的序列化桥——这是实打实的进步。它没有移除的是:你的 JS 逻辑仍运行在单一线程上。繁重计算、大列表或复杂动画仍可能饿死 UI 线程、丢帧;生态系统自己给出的答案 FlashList,正是因为列表在中端 Android 上卡顿才存在的。
CrossFly 的渲染路径里根本没有 JS 线程。UI 由 Java 在 GPU 上绘制,所以“JS 线程忙所以屏幕卡顿”这一整类问题根本不存在。
原生模块是一张兼容性矩阵
任何核心没有覆盖的东西——相机、地图、蓝牙、支付——都是一个社区原生模块。让几十个模块在 Gradle、CocoaPods 和每个 React Native 版本之间保持相互兼容,用社区自己的话说,接近一份全职工作;一次版本升级很少只是“把数字改大而已”。
CrossFly 拥有自己的渲染栈,并调用 JVM 成熟的库。没有一群按平台划分的原生模块要去调和,也不会每次升版就遇上 CocoaPods/Gradle 的原生崩溃。
升级早已声名在外
React Native 以升级痛苦而闻名:破坏性变更横跨 JS 和原生,AppDelegate/Gradle 的调整可能让你的应用白屏,而且官方专门有一个 Upgrade Helper,因为手动比对版本就是这么繁琐。落后一年,你就要面对手动迁移——而新架构如今已是强制的,未迁移的模块会逼着你排期。
一门语言、一套工具链、很小的依赖面,加上 JVM 的向后兼容文化,让 CrossFly 的升级枯燥得多——而这恰恰是你想从一次升级中得到的。
桌面是外挂件,不是目标
React Native 的桌面存在于独立的、由社区/Microsoft 维护的仓库(react-native-windows/macOS)中,按自己的节奏推进,落后于核心和新架构。它可用,但相比 iOS 和 Android 是二等公民。
桌面是 CrossFly 的一等目标,来自与移动相同的 GPU 渲染器——一份代码、一个负责人,在 Windows、macOS、Linux、Android、iOS 和浏览器中表现一致。
CrossFly 领先之处
React Native 真正强大之处
CrossFly 对比 React Native 一览
| 维度 | CrossFly | React Native |
|---|---|---|
| 语言 | Java | JavaScript / TypeScript |
| 渲染 | 通过 LibGDX/OpenGL 在 GPU 上 | 原生平台控件 |
| 渲染路径线程 | GPU,无 JS 线程 | 单条 JS 线程编排 UI |
| 原生模块 | 很少(JVM 库) | 众多社区模块要去调和 |
| Java/后端复用 | 直接(它就是 Java) | 通过原生模块/JS |
| 平台 | 桌面端(Windows、macOS、Linux)、Android、iOS、网页(任意浏览器)——都是一等公民 | Android、iOS;桌面在主干之外 |
| 离线优先 | CrossFly Sync(双向) | 第三方包 |
| 升级 | 依赖面小,JVM 节奏 | 出了名地繁琐(Upgrade Helper) |
| 治理 | 多厂商 OpenJDK | Meta 主导 + 社区 |
| 许可 | 开源(Apache 2.0,Core) | 开源(MIT) |