为什么写这篇

做移动端开发,第一个问题永远是”用什么框架”。你不可能每个框架都深入用过再决定,但选错了成本很高——重构比新建痛苦 10 倍。

这篇文章基于我真实的项目经验(Flutter 主力 + UniApp 做过外包 + 关注鸿蒙生态),给每个框架一个公正的评价。不吹不黑。

一句话结论

场景 推荐框架
追求 UI 一致性和高性能 Flutter
团队有 React 背景,快速出活 React Native
小程序为主,App 为辅 UniApp
鸿蒙生态优先,或国产化合规 HarmonyOS 原生(ArkUI)
纯 iOS,不在乎跨平台 SwiftUI

我的选择:Flutter。 原因后面讲。


Flutter

优点

  • 自绘引擎(Skia / Impeller):不依赖平台原生控件,iOS 和 Android 看起来一模一样。UI 一致性是跨平台框架里最强的,没有之一。
  • Dart 语言:类型安全 + 空安全,编译时就能拦截大量低级错误。写过 JS 再写 Dart,会觉得世界清净了很多。
  • 热重载快到离谱:改 UI 几乎秒级生效,调试效率碾压原生开发。
  • Widget 体系强大:一切皆 Widget 的设计虽然初学绕,但复杂 UI 拆解起来很舒服。动画系统一流。
  • 社区活跃,生态成熟:pub.dev 上的包质量整体不错,Google 自己维护的核心库稳定。

缺点

  • 包体积大:一个 Hello World 的 APK 就 15MB+,加上业务代码轻松 30-50MB。
  • Web 端体验一般:CanvasKit 渲染器重,HTML 渲染器又还原度不够,两端难取舍。
  • 原生功能依赖插件:蓝牙、NFC、后台任务等场景需要大量原生桥接代码,不是”一套代码全搞定”这么简单。
  • 学习曲线:Dart + Widget 树 + 状态管理,三座大山。团队新手上手周期 2-4 周。
  • 平台 UI 不够”原生”:Material Design 在 iOS 上看着总有点违和,Cupertino 组件又不够完善。

适合谁

  • 重视 UI 体验和一致性的团队
  • 有精力做原生桥接的开发
  • 产品以 App 为主,Web/小程序为辅助

React Native

优点

  • JS/TS 生态:前端开发者零成本上手,npm 生态无敌丰富。
  • 热更新能力:CodePush / Expo Updates 可以绕开 App Store 审核热修 bug,这在某些场景是杀手级能力。
  • Expo 开发体验:Expo 把原生配置全封装了,新项目搭建比 Flutter 快。
  • 渲染走原生控件:UI 看起来就是真正的原生组件,不会有”山寨感”。
  • React 思维复用:组件化、hooks、状态管理(Zustand / Redux)直接搬过来。

缺点

  • Bridge 架构瓶颈:JS 和 Native 之间的通信走 Bridge(虽然新架构 JSI 在改善),复杂动画和大量数据交互时会卡。
  • 版本升级痛苦:RN 的大版本升级经常 breaking change,第三方库不跟进就得等。
  • UI 一致性差:iOS 和 Android 用的是各自的原生控件,长得完全不一样。想做统一的品牌 UI,得大量覆盖原生样式。
  • 调试心智负担:JS 线程 + Native 线程 + Bridge 通信,排查性能问题要同时看三样东西。
  • Hermes 引擎兼容性:某些 JS 特性不支持,老 RN 项目迁移到 Hermes 也有坑。

适合谁

  • 前端团队做 App,React 技术栈已有积累
  • 对原生 UI 风格有要求(iOS 和 Android 各用各的样子)
  • 需要热更新能力的产品

UniApp

优点

  • 小程序生态覆盖最全:微信、支付宝、百度、字节、QQ、快手,一套代码出 N 个小程序。这块目前没对手。
  • Vue 语法:国内前端主流,上手极快。
  • H5 和 App 都能出:虽然 App 端体验一般,但”能跑”就是价值。
  • uniCloud / uniAD 等配套:DCloud 的商业化生态完整,个人开发者变现路径清晰。
  • 门槛极低:会用 Vue 就能写,没有类型系统、Widget 树这些心智负担。

缺点

  • App 端性能堪忧:底层是 WebView + 原生壳(或 weex 引擎),复杂页面掉帧明显,长列表直接卡。
  • 调试地狱:不同小程序平台的 API 差异、样式兼容性问题,修 bug 的时间可能超过写功能。
  • 组件库质量参差:uView 等常用组件库 bug 多,遇到问题往往得绕道。
  • 不是”真正的跨平台”:小程序、H5、App 三端差异很大,实际项目里免不了 #ifdef 条件编译,代码割裂感强。
  • 技术天花板低:做不了高性能动画、复杂手势交互、音视频处理等场景。

适合谁

  • 小程序是核心产品形态
  • 外包项目、快速交付、甲方要”能跑就行”
  • 个人开发者做工具类小程序变现

鸿蒙(HarmonyOS / ArkUI)

优点

  • 国产化合规:政府、央企、金融等领域的硬性要求,不是技术选择问题。
  • ArkUI 声明式开发:思路和 Flutter/SwiftUI 类似,上手不难。
  • 分布式能力:多设备协同(手机、平板、手表、车机)是鸿蒙的核心卖点,其他框架做不到。
  • 官方投入大:华为在推,DevEco Studio 在快速迭代,生态在增长。

缺点

  • 生态还弱:第三方库少,很多常见功能要自己封装。
  • 市场占有率不确定:HarmonyOS NEXT 去掉了 AOSP 兼容层,用户接受度待验证。
  • 跨平台能力弱:目前只覆盖鸿蒙设备,iOS/Android 不兼容。如果要做其他平台,得另起炉灶。
  • 文档和社区还在早期:遇到问题能搜到的解决方案少,踩坑成本高。
  • 开发工具不稳定:DevEco Studio 在某些 Mac 上兼容性有问题,模拟器也经常抽风。

适合谁

  • 有国产化合规要求的企业项目
  • 鸿蒙生态优先的战略布局
  • 想抢占鸿蒙早期开发者红利

原生(SwiftUI / Jetpack Compose)

优点

  • 性能天花板最高:直接调用系统 API,没有中间层损耗。
  • 平台特性全覆盖:所有最新 API 第一时间能用,不需要等框架适配。
  • UI 绝对原生:用户体验无缝,不会出现”这不像 iPhone App”的违和感。

缺点

  • 不跨平台:iOS 和 Android 各写一套,人力成本翻倍。
  • SwiftUI 还不够成熟:复杂定制场景经常要回退到 UIKit,两套混写维护头疼。
  • Jetpack Compose 生态还在追赶:相比传统 Android View 体系,面试和市场普及度还有距离。

实际项目怎么选:一张决策表

你关心什么 第一名 第二名 不适合
UI 还原度 Flutter SwiftUI UniApp
开发速度 UniApp RN (Expo) 原生
性能 原生 Flutter UniApp
团队上手 UniApp RN Flutter
小程序覆盖 UniApp Flutter / RN
鸿蒙生态 ArkUI 其他全部
热更新 RN UniApp Flutter
长期维护成本 Flutter RN UniApp

我的选择逻辑

主力项目「雷达快传」选 Flutter,理由:

  1. 产品重体验:文件传输类 App 有进度动画、拖拽交互、流畅过渡——这些是 Flutter 的强项。
  2. iOS/Android 双端一致:我不想在 iPhone 和安卓手机上看到两个”不同风格”的应用。
  3. Dart 真香:类型安全在多人协作和长期维护中是实打实省时间的。

外包项目用 UniApp,理由:

  • 甲方要的是”小程序 + H5 + App 都给我出了”,UI 还原度要求不高,快速交付就行。

不选 RN,纯粹是因为团队不是 React 技术栈——如果你主力写 React,RN 是个很好的选择,别被我的偏好影响。


最后的建议

框架是工具,产品是目的。 不要因为”这个框架火”就选它。搞清楚你的产品形态、团队能力、长期规划,让框架服务你,不是你服务框架。

如果你还在纠结,选 Flutter。至少未来 3 年,它是跨平台移动开发最稳妥的选择。