Shopify 最近正式回应了「从 React Native 回到原生」和「为什么不用 KMP」这两个问题。就在 2025 年,他们还刚刚总结过五年的 RN 实践,那时所有移动 App 都已经迁到 React Native,Shopify App 做到了 P75 页面加载低于 500ms、超过 99.9% 的 crash-free sessions,甚至已经迁移到 RN 新架构上,并明确把这次迁移称为巨大成功。

结果现在突然宣布回归原生。原因也很直接:AI 来了之后,「React 这个共享语言,现在被 English 取代了」。

也就是说,对 Shopify 而言,跨平台的一致性需求已经发生变化:从过去的「共享代码」转向「共享行为、测试和验证标准」。AI 可以负责把同一个意图分别实现成 Swift 和 Kotlin,再由测试系统证明这两份实现仍然是同一个产品。
整个变化大致可以这样理解:
| 成本 |
2020 年 |
Shopify 2026 年的做法 |
| 功能实现 |
Swift/Kotlin 人工做两遍,贵 |
Agent 大量承担第二份实现 |
| 双端同步 |
靠人追 Feature Parity |
Agent 比较实现和自动化测试 |
| 人员技能 |
往往需要 iOS/Android 专长分别覆盖 |
同一个开发者可以借 Agent 跨栈工作 |
| 原生能力 |
RN 需要框架、Binding、第三方库 |
Swift/Kotlin 直接使用第一方能力 |
当然,这也不是「有手就行」的事情。把 Swift 和 Kotlin 都生成出来其实不难,真正麻烦的是时间长了以后,问题会逐渐浮现:
- iOS 修了一个边界 Bug,Android 有没有跟?
- 一个 analytics event 的 payload 两边是不是一致?
- 无障碍行为有没有漂移?
- 某个 Experiment 是否只在 Android 落了?
以前 React Native 的最大优势在于,大量业务逻辑天然只有一份,因此很多差异从源头就不存在。但回到原生后,这些东西可不是用了 AI 就白送。因为 AI 会飘、会作弊、会幻觉、会偷懒。只有没经历过真正工程开发的人,才会觉得用了 AI 就能立刻实现双端原生。
这里有一个很典型的例子:英伟达最近用 AI 给 KDA 做性能优化时,AI 为了作弊做了不少骚操作:
- 发现 Q/K 输入总是某种高斯分布,干脆不算真实 L2 norm,直接写死一个 0.1778209953 常数
- 发现测试里的 sequence layout 固定,就把
cu_seqlens 的动态逻辑写死
- 发现测试数据里旧 history 影响不大,就只保留最近 32 token,把历史直接砍掉
- 使用一种计算 decay 的快速方式,测试数据能跑,但衰减稍大就数值 underflow,真实模型直接 NaN

看不懂这些具体细节没关系,只需要明白:AI 在实现需求时是不可靠的。AI 不保证你给出一份 Android 代码,就能生成行为一致的 iOS 代码。如果什么都不做,只想着让 AI 对着 Android 生成 iOS,结果大概率是一堆难以维护的“屎山”。Shopify 的迁移一开始也遇到类似问题。
所以 Shopify 后来做了大量工作来维持迁移和双端一致性。核心思路是把“一致性”从源码层搬到验证层:
用一套共享测试来验证 Swift 和 Kotlin 中实现的业务逻辑,同一 Feature 只有两端都通过相同测试才能发布。这些逻辑还能脱离模拟器,直接 headless 跑在桌面环境里,给 Agent 一个非常快的反馈循环。
换句话说,以前跨端框架承担的是结构性约束,大家只能共享同一套实现,自然不容易分叉。而 Shopify 现在改成另一种约束:
允许代码长得完全不同,但要求最终行为持续满足同一份 contract。
这也解释了为什么 Shopify 现在仍然要求“一个开发者同时负责两个平台”。他们没有重新拆出传统的 iOS Team 和 Android Team,还是同一个人保留产品上下文,让 Agent 帮他跨越陌生技术栈。这样做的目的是减少“两个团队之间解释同一个 Feature”的沟通成本,而 Swift/Kotlin 的实现差异则交给工具去吸收。
所以 Shopify 没有因为回归原生就加人,还是原本的人,只是跨平台框架变成了 Agent 跨平台框架,把代码成本变成验证成本。
在这个过程中,他们做了 Helix。拿迁移一个订单页面举例:
- 工程师告诉 Helix 要迁哪个 screen
- Helix 先读取现有 RN 原始需求实现,把任务切成几个很小的 checkpoint
- 然后先搭页面骨架,再实现订单 header,再接 action,再补复杂状态
- 每完成一个 checkpoint,先用 CLI 行为测试证明逻辑正确,然后把 RN 旧页面和新原生页面放到相同状态,通过视觉模型检查布局和 UI 差异
- 之后再交给两个彼此隔离的 reviewer agent 检查架构和代码质量,最后才轮到工程师确认
Shopify 还专门做了 Tardis,把运行中的日志、事件、状态暴露给 Agent,同时允许它发送命令。之后做 parity review 时,Tardis 还可以同时捕获 RN 和 native App 的截图、analytics event 以及 payload,再让 Agent 检查两边是否对应。
这样后续 iOS 和 Android 在推进过程中也可以享受这套 infra。
所以不是说没有成本,实际成本反而比 RN 还高。但收益也很明显。Shopify 能够放弃 shared codebase,很大程度上依赖他们有一套 shared verification system。回到原生后,对 Shopify 来说最直观的就是性能收益:
| 指标 |
React Native |
Native |
变化 |
| iOS 冷启动 |
3200 ms |
2466 ms |
-23% |
| Android 冷启动 |
4433 ms |
2233 ms |
-50% |
| Session stability |
99.5%+ |
99.95%+ |
Crash session 降 10 倍 |
| Android App Size |
293 MB |
184 MB |
-37.2% |
| Android Release Build |
— |
— |
时间降 75% |
至于 Kotlin Multiplatform (KMP),它恰好处在 RN 和完全双原生之间。KMP 在 AI 时代可能反而会更受欢迎,因为它以前用起来麻烦、门槛较高,而现在 AI 能帮忙抹平这些问题。
但对 Shopify 来说,KMP 仍然没有意义。因为用了 KMP 反而要多处理一些问题,比如 iOS 上模块垃圾回收和调试相关的性能开销。在已经有一整套 AI infra 之后,维护 infra 就足够支撑两套原生代码对比,性能问题直接就是附加收益,升级适配也能按 P0 完成,不需要等框架适配。所以干脆没必要上 KMP。

也正如作者所说,原生的成本降低了,对跨平台方案来说同样也更低。双端脱离跨平台后的长时间迭代成本,需要有基建持续来维持。所以这个过程只是把成本转移到了其他位置,但收益同样直接:性能和适配就是最明显的回报。