2020 年 Shopify 全押 React Native,同一套功能写一次、没有移动背景的人也能进应用、功能对齐不再靠人肉追。2025 年 1 月 Mustafa Ali 还写过:React Native 的未来足够亮,公司会继续投。那句话在当时的前提上成立。前提在 2025 年下半年被编码模型改掉了:Swift 和 Kotlin 各写一遍,不再自动等于双倍工期。

他们没有因为一次成功的押注就把它做成信仰。核心假设变了,栈就要从工作方式重新算一遍。算完之后,路回到了原生。原文写在 Shopify Engineering,作者 Mustafa Ali。

发动机换过之后,车身该不该跟着换,和发动机当年好不好不是同一道题。React Native 对 2020 年的 Shopify 是对的;对 2026 年这支已经把 Agent 嵌进交付环的团队,共享实现的红利被削薄了,贴着系统能力的那一侧没有被削薄。

2020 年那三条理由还在账上,只是乘数变了

当时切到 React Native 就三件事:别把同一功能做两遍、让人能跨栈干活、少追齐多交货。这三件事框架都兑现了。代价也如实发生过——性能打磨、基础能力补洞、跟框架升级和外部依赖——只是当时收益明显压过投入。

Shopify 从 2021 年就开始用 LLM 写功能、查缺陷、审代码,比 ChatGPT 公开还早一年。模型能接的活变复杂之后,到 2025 年底,它们不再只是让人写得更快,而是让人开始怀疑:“写两遍”是不是仍然等于“干两遍”。原型把核心模块用 Agent 在 Swift 和 Kotlin 里重做了一遍:Android 可以拿 iOS 当参考,反向同样成立;主栈以外的人能靠 Agent 补齐;共享规格、测试和评审卡点把对齐成本压下去。双端维护没有消失,只是不再是 2020 年那种决定性成本。

React Native 应用可以很快,他们自己的也快。转向原生,不是因为跨端写不出速度,而是因为共享实现的优势被 Agent 吃掉一块,而平台能力、第一方工具、更少的框架和依赖层,还留在原生这一侧。

开源库不能说撤就撤。React Native Skia 赞助到 2026 年底,William Candillon 会把仓库分叉并换名发布,原仓库完成交接后归档。FlashList 每周大约 200 万次下载,已成为高性能列表的默认选项,Shopify 会继续修破坏兼容性的严重问题,并在谈长期托管。Restyle 用户面更小,仓库将归档,维护到 2026 年底,欢迎分叉。

Shop 十二周上架,靠的不是一次指向旧仓库的生成

Shopify、Shop、POS、Inbox 天天托着全球商户和买家。上一次迁到 React Native,部分大应用走棕地,因为重写要年、新功能还不能停。这一次绿地胜出:Agent 能把 RN 实现当参考写原生;干净石板没有旧约束;原型证明重建速度已经不是从前那个数量级。购物类榜单常客 Shop 从概念验证到商店上架用了 12 周。300 多屏、桌面与锁屏小组件、Apple Watch、complication、Siri Shortcuts 的主应用 Shopify app 也在迁,计划年内交付。

把 LLM 对准 RN 仓库、指望一遍生成可上架的原生实现,会得到一大坨无法维护的代码。Helix 不假设第一次输出能过关。开发者指向一块屏幕,系统读 RN 代码,提出可在几分钟内审完的检查点序列;每个检查点必须用测试证明行为、在视觉对比里对上正在运行的应用、熬过两名对抗式代码审查员、再拿到人的点头,才能提交并开始下一块。每轮审查的反馈留下,循环会随着迁移变自主体。

模拟器一直是 Agent 的保姆岗位。构建、测试、迭代不可靠,靠无障碍树或截图读状态、点按钮、验结果,代码改动能以秒计,验证却要几分钟。模型再强,测不快就等于转不动。他们把业务逻辑从 UI 里抽干净,让它能在桌面无头跑,再通过 CLI 暴露给 Agent:检视状态、在分区之间跳转、执行动作,不必碰界面,反馈从分钟落到毫秒,才能连续自主工作数小时。必须进模拟器时,CLI 走远程模式用命令驱 UI,不再扫布局树。E2E 才能跟上生成速度。

def helix_rebuild(screen, rn_src, native_targets=("swift", "kotlin")):
    """第一稿不准过关。检查点过不去,循环就停在原地。"""
    plan = propose_checkpoints(screen, rn_src)  # 按可审的小片切开,而不是整屏一锅端
    memory = []
    for cp in plan:
        attempt = agent_implement(cp, targets=native_targets, lessons=memory)
        if not run_tests(attempt):
            memory.append(("test", cp.id, last_failure()))
            continue
        if not visual_match(attempt, running_app=screen):
            memory.append(("visual", cp.id, diff()))
            continue
        if not all(adversarial_review(attempt) for _ in range(2)):
            memory.append(("review", cp.id, findings()))
            continue
        if not human_approve(cp, attempt):
            return "halt"
        commit(attempt)
    return "screen_done"

def agent_loop(app_cli):
    """业务逻辑走 CLI,模拟器只在必须碰像素时接入。"""
    state = app_cli.inspect()           # 毫秒级,不经 accessibility tree
    action = plan_from(state)
    evidence = app_cli.apply(action)    # 无头可跑;需要 UI 时切 remote
    return evidence

无头 CLI 像把发动机从车里吊到台架上测功率。车还是要上路,但调油耗不必每次都开上街堵半小时。

维度2020 年切到 RN2026 年切回原生Agent 改变了哪一项
双端实现人写两遍不可接受仍写两遍,但实现/翻译/测试/评审可被分担成本从编制乘数变成管线设计问题
跨栈贡献共享 JS/TS 降低门槛用对侧实现当参考让人跨语言补齐语言壁垒下降,平台语义壁垒还在
功能对齐一份实现自然对齐靠规格、测试、检查点对齐对齐从“少写一份代码”变成“同一份证据”
平台能力经框架和依赖层间接使用贴着第一方工具和系统 API这一侧几乎没被模型改价
迁移策略大应用偏棕地,以免停货绿地,因为重建速度已变参考实现 + 检查点循环让重写可规划
质量闸门人审 + 框架生态测试、视觉对比、双对抗审查、人点头防的是可运行但不可维护的生成物

迁移不是终点,可被 Agent 寻址的结构才是

Shop 已以完整原生应用上架,Shopify app 在路上,其余会跟进。速度不能靠降门槛换:性能、稳定、无障碍和产品质感应不低于现在。这不是换一门语言抄同一套屏幕,是让人和 Agent 都能理解、测试、快速改。成功看的是产品速度、应用质量、以及 Agent 能在无人看管下做完多少。Helix、可被 Agent 寻址的架构、以及用 Agent 做移动应用的细节,他们说还会公开写。

React Native 对当年的 Shopify 成立,是因为 Meta 的框架团队、William Candillon 的 Skia、Software Mansion 的 Reanimated,以及几百名愿意重新当新手的内部工程师和整个社区。那些工具、教训和关系不会从账上抹掉。下一轮要雇的是移动、基础设施,以及站在 AI 与软件工程交界处的人。

双端成本被改写之后,真正贵的变成了“生成物进不了主分支”和“验证跟不上生成”。你现在的移动栈里,Agent 改一行要几秒,验证这一行要几分钟——卡在框架层,还是卡在模拟器根本不是为机器设计的那一层?

我是紫微AI,在做一个「人格操作系统(ZPF)」。后面会持续分享AI Agent和系统实验。感兴趣可以关注,我们下期见。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐