为什么不建议学 UniApp?一个独立开发者的真实劝退

说在前面:我不否认 UniApp 解决了某些特定场景的问题,但我个人开发移动端应用有一个原则——能不用就不用。这篇文章就是想跟你掰扯清楚:UniApp 到底哪里不好,好在哪里,以及只有哪些情况下才值得咬咬牙用它。

UniApp 的本质:WebView 套壳

先搞清楚 UniApp 是什么。它本质上是把 HTML/CSS/JS 塞进一个 WebView 里,然后通过 JS Bridge 调用原生能力。

这个架构在 2015 年 PhoneGap/Cordova 的时代就被证明有严重问题,UniApp 做的事并没有本质上不同——只是把 WebView 和原生 API 的对接封装得更彻底了,顺便把小程序的组件规范搬了过来。

你写 view,它渲染成 div。你写 text,它渲染成 span。你写 image,它背后还是 img 标签。所有东西最终都跑在一个浏览器里。

问题一:性能——WebView 的先天缺陷

这是最致命的。WebView 渲染从来就没有快过,不管你用多少个优化技巧。

列表滚动是重灾区。稍微复杂一点的列表,在页面上滑两下就卡,长列表不虚拟滚动的实现会很糟糕。UniApp 官方给的 list 组件相比原生 RecyclerView 或 UICollectionView,差距肉眼可见。

做过对比你就知道:同样的界面,Flutter 的 60fps 和 UniApp 的 30fps,那感觉完全不一样。动画就更不用说了——WebView 里做复杂动画基本是灾难,你又不能像原生那样调 Core Animation 或 Android 的属性动画。

问题二:调试体验——让你怀疑人生

你以为热重载很快?UniApp 的热重载速度慢到你想喝杯茶再回来看。改一行代码等 5-10 秒编译是日常。

真机调试就更别提了。USB 调试经常断连,控制台输出延迟几秒才到,有时候干脆不显示。遇到一个只在真机上出现的 bug,排查过程基本靠猜。

看我在开发者群里经常看到的情况:十次调试里有三次连不上,两次连上了但控制台无输出,剩下五次里还有两次是假连接(代码根本没更新到设备上)。这不是个别现象,是做 UniApp 开发的人的共同体验。

问题三:跨平台是假象

UniApp 说一套代码能跑 App、H5、各种小程序。但实际开发中你会发现:条件编译代码占了项目文件的 30% 以上

每个平台都有自己的一套坑。微信小程序不支持某些 CSS 属性,支付宝小程序的 API 调用方式也不一样,App 端的 WebView 跟 H5 端还有渲染差异。你以为是写一次到处跑,实际上到处修。

更让你恼火的是,很多报错信息根本不告诉你问题出在哪,就返回一个"系统错误",让你自己去猜。

问题四:被 DCloud 生态绑架

UniApp 的插件市场基本被 DCloud 垄断。很多"免费"插件质量堪忧,好的都是付费的,而且只在这个生态内能用。你今天花了 199 买了某个插件,明天想换 Flutter 或者原生,这些投入全部归零。

更严重的是:这个生态不是开放的。你用的 UI 库、你用的支付插件、你用的地图组件,全部依赖 DCloud 的 SDK 封装。一旦 DCloud 放弃维护某个组件,你就得自己填坑或者重新选型。

问题五:CSS 兼容性噩梦

你写的前端样式到了不同平台表现完全不同。flex 布局在微信开发者工具上挺正常的,到了 iOS 端某些元素突然错位。在 App 端的 WebView 渲染正常,到了小程序里某些属性又不生效了。

这就是跨 WebView 开发的最大痛点——浏览器内核差异。Android 不同厂商的系统 WebView 版本各不相同,iOS 的 WKWebView 也有自己的怪癖。UniApp 并没有解决这个问题,只是把它藏到了"平台差异"四个字下面。

那 UniApp 的唯一好处是什么

客观讲,确实有两个优点:

  1. 前端转移动端的门槛低——如果你只会 Vue.js,不想学 Dart/Java/Kotlin/Swift,UniApp 是你最快做出东西的工具。
  2. 小程序生态覆盖——如果你主要业务就是面向微信小程序,顺便带个 App 端壳,UniApp 确实省事。

对,就这些。其他什么"生态丰富""插件多"都是虚的,大部分是你不需要也不该依赖的东西。

什么情况下才考虑 UniApp

直接给结论。只有同时满足以下条件,我才建议你用 UniApp:

  1. 你的项目必须覆盖多个小程序平台(微信 + 支付宝 + 抖音 + …)——这是 UniApp 最核心的价值场景
  2. 项目对性能要求极低,就是个展示型应用,没什么复杂交互,没什么动画需求
  3. 团队没有原生或 Flutter 开发能力,而且来不及招聘/学习
  4. 项目生命周期短,一次性活动页或者试用产品,用完就扔
  5. 你不在乎以后的技术栈迁移成本,或者你确定这个项目不会做大

但凡其中一条不满足,我就建议你别碰 UniApp。尤其是:你想做长期产品,你想做好用户体验,你对性能有要求——果断放弃 UniApp

那应该学什么

  • 个人开发、注重效率、一码多端(真跨平台):Flutter
  • 追求原生体验、需要调用大量平台 API:Android 原生(Kotlin)+ iOS 原生(Swift)
  • 只想做小程序生态:直接学微信小程序原生开发,别绕 UniApp 这一层

最后

我不反对用工具解决问题。但 UniApp 这个工具,它在解决一些问题的同时制造了更多的问题。而且关键是——它制造的那些问题,大部分前端开发者要到项目做到一半才会真正体会到,到那时候已经晚了。

所以如果你是想认真学技术、做长期产品、对自己的作品有要求的人——离 UniApp 远一点。等你真正遇到那些非用不可的场景时,再临时学也来得及,它真没那么复杂,花两天就能上手。

在此之前,把你的时间花在更值得的事情上。

一名痴迷于计算机技术的学生~