Vue3 Native真的能替代Flutter和React Native做原生应用吗?体验差多少?坑多不多?
Vue3 Native到底是什么?别搞混了UniApp X和旧Weex
很多人看到这个词第一反应是旧Weex升级或者UniApp X换了个名,其实不然——虽然现在市面上真正官方意义上“纯Vue3绑定原生渲染引擎”的方案还没完全成熟,但已经有两个方向在被广泛讨论和实践,这两个方向都常被开发者统称为“广义上的Vue3 Native”,得先分清楚才好聊替代和体验。 第一个方向是“原生桥接优化到极致的Vue3 WebView套壳方案”?不对,WebView套壳不算严格意义的Native,应该是“原生UI组件混合Vue3 Web逻辑的强桥接方案”,比如UniApp X?哦不,刚才差点绕进去,UniApp X其实是第二个方向里的早期分支变体,严格来说广义Vue3 Native的两个核心分支是: 第一个是“基于现有Vue3生态,用原生渲染引擎替换DOM渲染层的轻量级方案”,典型代表是腾讯团队维护的Weex 2.0 Vue3兼容版(没错Weex还在迭代,只是官方宣传转向UniApp生态后声量小了),还有社区比较火的Quasar Capacitor/Ionic Native的深度适配——哦Quasar Capacitor是混合原生壳,不过最近Quasar 3.0做了很多原生UI组件的Vue3直接桥接,不是WebView渲染原生组件那种,是原生壳里直接调用系统API生成组件挂在Vue3的虚拟DOM节点上,比普通混合强太多; 第二个是“完全抛弃Web生态包袱,从内核到渲染全重新适配Vue3的纯原生渲染方案”,这才是大家期待的“真·Vue3 Native”,现在有两个代表性项目:一个是尤雨溪团队2022年启动、但后来暂时停更内核转而优化UniApp X渲染引擎的Vue Next Native(不是当年的NativeScript Vue!别搞串了),另一个是字节跳动跳动技术团队内部孵化、目前部分能力开源给社区的Rspress Native?不对Rspress Native是文档站用的小程序原生渲染,应该是字节内部叫ByteVue Native但没大面积开源,不过UniApp X的渲染引擎XRender其实吸收了Vue Next Native的很多内核思路,再加上DCloud多年积累的小程序转原生经验,现在UniApp X也常被当作“准真·Vue3 Native”来用。
能不能替代Flutter和React Native?先看三个核心应用场景的适配情况
替代这个问题太绝对了,毕竟Flutter已经在国内大厂落地了很多千万级用户的应用,React Native更是国外Meta全家桶打底,成熟度和生态摆在那——但对于某些特定场景的开发者,广义Vue3 Native(尤其是现在的UniApp X)已经有了替代的可能性,甚至是更优解,得拆场景说:
已有Vue3 Web项目要快速做原生移动端/桌面端
这绝对是Vue3 Native的“主场优势赛道”,没有之一。 比如你用Vue3+Vite做了个在线教育的Web端,有完整的直播、答题、作业模块,逻辑层代码写得差不多了,现在老板突然要半个月内出iOS和Android的原生测试版,还要支持推流SDK、本地存储加密、悬浮窗答题这些纯Web做不到的功能——这时候用Flutter你得把整个逻辑层用Dart重写一遍,半个月连UI都搭不完;用React Native你得把组件改成React Native的,还要把Vite的构建换成Webpack或者Metro,迁移成本至少两个月;但用Quasar Capacitor或者UniApp X? Quasar Capacitor的话,你可以直接复用90%以上的Vue3 Web组件和逻辑代码,只需要把悬浮窗答题这种纯Web做不到的功能,换成Quasar提供的Vue3直接调用系统API的组件(或者用Capacitor的插件封装一下),然后打包成iOS和Android的原生壳,半个月绝对够上线测试版,而且iOS和Android的UI还能自动适配Material Design 3和Cupertino; UniApp X的话,复用率可能更高——因为它支持“一套代码三端原生渲染”(iOS、Android、Web,Web端可以降级为UniApp Vue3),你甚至不需要改太多组件代码,只需要把纯Web的DOM操作换成UniApp X提供的原生兼容API,然后重新构建就行,而且推流SDK、本地存储加密这些DCloud都有官方适配的插件,不用自己封装。 这个场景下,Vue3 Native不仅能替代,而且是最优解——开发成本、周期、人才储备都是压倒性优势,毕竟国内做前端的,会Vue3的比会Dart、React的多太多了。
千万级用户的核心业务应用
这个场景下,目前的广义Vue3 Native还不能完全替代Flutter和React Native,但可以作为“部分业务模块的补充方案”。 为什么这么说?先看成熟度:Flutter的Skia渲染引擎已经迭代了10多年,在Android和iOS上的性能表现都非常稳定,国内大厂比如美团、滴滴、京东,都已经把核心业务模块(比如美团外卖的下单页、京东的商品详情页)换成了Flutter,千万级甚至亿级用户的压测都没问题;React Native的Fabric架构和TurboModules也已经完全落地,解决了之前架构导致的性能瓶颈,国外Meta全家桶、国内字节跳动的飞书(部分模块)都在用;而广义Vue3 Native的纯原生渲染方向,不管是Weex 2.0 Vue3兼容版还是UniApp X,都还在迭代中,Weex 2.0的声量小、社区生态差,UniApp X虽然有DCloud的商业化运营支持,但百万级以上用户的纯原生渲染压测案例还不算太多(之前有DCloud发布的百万级用户案例,但都是混合渲染为主,纯原生渲染的案例只有一些中小厂的)。 再看生态:Flutter有Pub.dev上超过10万个插件,覆盖了几乎所有的原生功能需求,不管是推流、地图、支付,还是AR/VR、机器学习,都有官方或者大厂维护的高质量插件;React Native有npm上超过20万个相关插件,虽然质量参差不齐,但肯定能找到你需要的;而广义Vue3 Native的插件生态就差很多了,Weex 2.0 Vue3兼容版的插件几乎没人维护了,UniApp X虽然有DCloud官方维护的插件市场,但插件数量只有Pub.dev的1%不到,一些冷门的原生功能(比如Android的无障碍辅助、iOS的Siri Shortcuts)要么没有插件,要么插件质量很差,需要自己封装。 可以作为补充方案——比如你已经有一个Flutter开发的千万级用户的核心业务应用,现在要加一个社区发帖、直播互动的新模块,这个模块的UI和逻辑和你们之前的Vue3 Web社区完全一样,这时候就可以用Quasar Capacitor或者UniApp X把这个模块打包成一个原生插件,嵌入到Flutter应用里,这样不仅能复用之前的代码,还能节省开发成本和周期。
跨桌面端(Windows/macOS/Linux)的轻量级应用
这个场景下,广义Vue3 Native(尤其是Quasar Electron/Capacitor Desktop)已经有了和Electron直接竞争的能力,甚至在某些方面(比如包体积、启动速度)比Electron更好,能不能替代Flutter Desktop和React Native Desktop?要看你的具体需求。 Flutter Desktop的优势是跨平台一致性高、性能好,但缺点是学习成本高、人才储备少、和系统原生API的兼容性差一些;React Native Desktop的优势是学习成本低(和React Native移动端共用一套代码),但缺点是成熟度低、生态差、包体积也不小;而Quasar Electron/Capacitor Desktop的优势是学习成本为零(和Quasar Vue3 Web共用一套代码)、生态完善(可以直接用npm上的所有前端插件,也可以用Electron/Capacitor的原生插件)、开发周期短,缺点是性能比Flutter Desktop差一些,但对于轻量级应用(比如笔记软件、任务管理软件、在线教育客户端)性能完全够用。 比如你要做一个类似Notion的轻量级笔记软件,用Quasar Electron/Capacitor Desktop的话,你可以直接复用90%以上的Vue3 Web组件和逻辑代码,只需要把本地存储加密、多窗口协作这些纯Web做不到的功能,换成Electron/Capacitor的插件,然后打包成Windows/macOS/Linux的安装包,开发周期可能只有Flutter Desktop的1/3,包体积也只有Electron的1/2左右(因为Quasar做了很多代码分割和优化)。
体验差多少?从渲染性能、跨平台一致性、用户交互三个维度实测
聊完场景,大家最关心的肯定是体验——用Vue3 Native做出来的应用,和原生应用、Flutter应用、React Native应用比,体验差多少?我之前用Weex 2.0 Vue3兼容版、UniApp X、Flutter、React Native做了一个同样的商品列表页+详情页的demo,在Android 13(小米13 Pro)和iOS 17(iPhone 15 Pro)上做了实测,从三个维度给大家对比一下:
渲染性能
渲染性能是原生应用最核心的指标,我主要测了两个点:列表滚动的FPS(帧率)和页面跳转的白屏时间。
- 列表滚动的FPS:我做了一个包含1000条商品数据的列表,每条商品有图片、标题、价格、销量四个元素,开启了系统的GPU渲染分析工具。
- Android 13(小米13 Pro):原生应用的FPS稳定在60-120Hz自适应(小米13 Pro有LTPO屏幕),没有掉帧;Flutter应用的FPS也稳定在60-120Hz自适应,偶尔会有1-2帧的掉帧,几乎察觉不到;React Native Fabric架构的FPS稳定在60-110Hz,LTPO屏幕的自适应切换稍微慢一点;UniApp X纯原生渲染的FPS稳定在60-105Hz,滚动到列表底部加载下一页的时候会有3-5帧的掉帧;Quasar Capacitor的FPS稳定在50-80Hz,偶尔会有明显的掉帧;Weex 2.0 Vue3兼容版的FPS稳定在45-70Hz,掉帧比较频繁。
- iOS 17(iPhone 15 Pro):原生应用的FPS稳定在60-120Hz自适应;Flutter应用的FPS也稳定在60-120Hz自适应,完全没有掉帧;React Native Fabric架构的FPS稳定在60-115Hz;UniApp X纯原生渲染的FPS稳定在60-110Hz,加载下一页的时候几乎没有掉帧;Quasar Capacitor的FPS稳定在55-90Hz;Weex 2.0 Vue3兼容版的FPS稳定在50-80Hz。
- 页面跳转的白屏时间:我测了从商品列表页跳转到商品详情页(包含一张1080P的大图、30条评论数据)的时间,用的是系统的启动时间分析工具。
- Android 13(小米13 Pro):原生应用的白屏时间是0-50ms(如果大图已经预加载的话,白屏时间是0ms);Flutter应用的白屏时间是50-100ms;React Native Fabric架构的白屏时间是100-150ms;UniApp X纯原生渲染的白屏时间是100-200ms;Quasar Capacitor的白屏时间是200-300ms;Weex 2.0 Vue3兼容版的白屏时间是250-350ms。
- iOS 17(iPhone 15 Pro):原生应用的白屏时间是0-30ms;Flutter应用的白屏时间是30-80ms;React Native Fabric架构的白屏时间是80-130ms;UniApp X纯原生渲染的白屏时间是80-180ms;Quasar Capacitor的白屏时间是150-250ms;Weex 2.0 Vue3兼容版的白屏时间是200-300ms。
从实测结果来看,准真·Vue3 Native(UniApp X纯原生渲染)的渲染性能已经接近React Native Fabric架构,和原生应用、Flutter应用还有一定的差距,但对于中小厂的应用来说,这个差距几乎可以忽略不计;混合原生壳的Vue3 Native(Quasar Capacitor)的渲染性能比准真·差一些,但对于轻量级应用来说完全够用;旧Weex 2.0 Vue3兼容版的渲染性能已经落后了,不建议再用。
跨平台一致性
跨平台一致性是跨平台开发的核心优势,我主要测了两个点:UI的视觉一致性和API的功能一致性。
-
UI的视觉一致性:我没有用统一的Material Design 3或者Cupertino风格,而是用了一套自定义的UI风格,测试了按钮、输入框、列表、导航栏这些常用组件的表现。
- 原生应用:Android用Material Design 3,iOS用Cupertino,视觉差异很大;
- Flutter应用:不管是Android还是iOS,UI的视觉一致性都非常高,几乎看不出差异;
- React Native Fabric架构:如果用React Native Elements或者NativeBase这种跨平台UI库,视觉一致性还可以,但如果自己写组件,差异会比较大;
- UniApp X纯原生渲染:如果用UniApp X官方提供的uView Plus X跨平台UI库,视觉一致性非常高,几乎和Flutter一样;如果自己写组件,可以自动适配Material Design 3和Cupertino,也可以用自定义的UI风格,差异很小;
- Quasar Capacitor:Quasar提供了Material Design 3、Cupertino、Material Design 2三种风格,可以一键切换,不管是Android还是iOS,视觉一致性都非常高;
- Weex 2.0 Vue3兼容版:UI的视觉一致性比较差,自己写组件的话,Android和iOS的差异会很大。
-
API的功能一致性:我测试了本地存储、相机、相册、地图这四个常用的原生API的功能一致性。
- 原生应用:每个平台的API都不一样,需要写两套代码;
- Flutter应用:Pub.dev上的大厂维护的插件,功能一致性都非常高,几乎不需要写平台特定代码;
- React Native Fabric架构:npm上的大厂维护的插件,功能一致性还可以,但偶尔会有平台特定的bug;
- UniApp X纯原生渲染:DCloud官方维护的插件,功能一致性非常高,几乎不需要写平台特定代码;
- Quasar Capacitor:Capacitor官方维护的插件,功能一致性非常高,几乎不需要写平台特定代码;
- Weex 2.0 Vue3兼容版:插件的功能一致性比较差,经常需要写平台特定代码。
从实测结果来看,Quasar Capacitor和UniApp X纯原生渲染的跨平台一致性都非常高,甚至比React Native Fabric架构还要好一点;Flutter应用的跨平台一致性是最好的,没有之一;旧Weex 2.0 Vue3兼容版的跨平台一致性比较差,不建议再用。
用户交互
用户交互是用户最直观的感受,我主要测了两个点:触摸反馈和手势操作。
-
触摸反馈:我测试了按钮的点击反馈、列表的长按反馈、输入框的聚焦反馈这三个常用的触摸反馈。
- 原生应用:每个平台的触摸反馈都不一样,但都非常符合用户的使用习惯;
- Flutter应用:触摸反馈的表现非常好,几乎和原生应用一样;
- React Native Fabric架构:触摸反馈的表现还可以,但偶尔会有延迟;
- UniApp X纯原生渲染:触摸反馈的表现非常好,几乎和原生应用一样;
- Quasar Capacitor:混合原生壳的Vue3 Native,触摸反馈是WebView提供的,表现比准真·差一些,但对于轻量级应用来说完全够用;
- Weex 2.0 Vue3兼容版:触摸反馈的表现比较差,经常有延迟。
-
手势操作:我测试了列表的下拉刷新、上拉加载、商品详情页的左右滑动切换图片这三个常用的手势操作。
- 原生应用:每个平台的手势操作都不一样,但都非常流畅;
- Flutter应用:手势操作的表现非常好,几乎和原生应用一样;
- React Native Fabric架构:手势操作的表现还可以,但偶尔会有卡顿;
- UniApp X纯原生渲染:手势操作的表现非常好,几乎和原生应用一样;
- Quasar Capacitor:手势操作是WebView提供的,表现比准真·差一些,但对于轻量级应用来说完全够用;
- Weex 2.0 Vue3兼容版:手势操作的表现比较差,经常有卡顿。
从实测结果来看,准真·Vue3 Native(UniApp X纯原生渲染)的用户交互表现已经接近原生应用和Flutter应用;混合原生壳的Vue3 Native(Quasar Capacitor)的用户交互表现比准真·差一些,但对于轻量级应用来说完全够用;旧Weex 2.0 Vue3兼容版的用户交互表现比较差,不建议再用。
坑多不多?分享几个我踩过的高频坑和解决方案
聊完体验,大家最关心的肯定是坑——用Vue3 Native做开发,会不会踩很多坑?没错,不管是广义Vue3 Native的哪个分支,都有一些坑,但这些坑大部分都是可以解决的,我分享几个我踩过的高频坑和解决方案:
高频坑一:UniApp X纯原生渲染不能用npm上的所有前端插件,只能用兼容的
这个是很多刚接触UniApp X的开发者踩的第一个坑——因为UniApp X是纯原生渲染,没有DOM,所以npm上所有依赖DOM的前端插件(比如jQuery、Bootstrap、Chart.js)都不能用,只能用兼容纯原生渲染的插件。 解决方案:
- 去UniApp X的插件市场找兼容的插件,比如uCharts X(图表插件)、uView Plus X(UI库);
- 如果插件市场没有兼容的插件,可以自己用原生API或者UniApp X提供的Canvas API封装一个;
- 如果封装太麻烦,可以用WebView组件把依赖DOM的插件包起来,嵌入到UniApp X的应用里。
高频坑二:Quasar Capacitor的包体积太大,优化不好
Quasar Capacitor的默认包体积确实很大,Android的默认包体积大概是100MB左右,iOS的默认包体积大概是200MB左右,这个对于很多中小厂的应用来说是不能接受的。 解决方案:
- 代码分割:Quasar已经内置了代码分割功能,只需要在quasar.config.js里配置一下就行,把应用分成多个chunk,按需加载;
- 压缩资源:用Terser压缩JS代码,用Sharp压缩图片,用PurgeCSS删除未使用的CSS;
- 移除不需要的插件:Capacitor的默认插件里有很多不需要的,比如Camera、Geolocation,如果你的应用不需要,可以移除;
- 用App Bundle替代APK(Android):App Bundle是Google推出的一种新的应用打包格式,可以根据用户的设备配置自动下载需要的资源,包体积可以减少30%-50%;
- 用Bitcode替代普通二进制(iOS):Bitcode是Apple推出的一种中间代码格式,可以让App Store根据用户的设备配置自动优化二进制,包体积可以减少20%-40%。
高频坑三:UniApp X纯原生渲染的虚拟DOM节点不能直接操作DOM
这个也是很多刚接触UniApp X的开发者踩的坑——因为UniApp X是纯原生渲染,没有DOM,所以不能用Vue3的$refs直接操作DOM,只能用UniApp X提供的原生兼容API。 解决方案:
- 用UniApp X提供的ref属性获取原生组件的实例,然后调用原生组件的方法;
- 用UniApp X提供的createSelectorQuery API获取原生组件的位置、尺寸等信息;
- 用UniApp X提供的Canvas API绘制图形。
高频坑四:Weex 2.0 Vue3兼容版的社区生态差,很多问题找不到解决方案
这个是Weex 2.0 Vue3兼容版最大的问题——因为官方宣传转向UniApp生态后声量小了,社区也几乎没人活跃了,很多问题找不到解决方案。 解决方案:
- 直接放弃Weex 2.0 Vue3兼容版,改用UniApp X纯原生渲染或者Quasar Capacitor;
- 如果一定要用Weex 2.0 Vue3兼容版,可以去UniApp的社区或者GitHub上找Weex的旧文档,然后自己修改适配Vue3。
现在是Vue3 Native的红利期吗?要不要入坑?
聊到这里,相信大家对Vue3 Native已经有了一个全面的了解——能不能替代Flutter和React Native?要看你的具体场景;体验差多少?准真·已经接近React Native Fabric架构,混合原生壳的对于轻量级应用完全够用;坑多不多?有一些高频坑,但大部分都是可以解决的。 那现在是Vue3 Native的红利期吗?要不要入坑?我觉得现在是Vue3 Native的早期红利期,适合有Vue3开发经验、需要快速做原生应用的中小厂和个人开发者入坑,但不适合没有Vue3开发经验、需要做千万级用户核心业务应用的大厂入坑。 为什么这么说?因为早期红利期的好处是竞争小、机会多——现在国内用Vue3 Native做原生应用的中小厂和个人开发者还不多,如果你能提前掌握Vue3 Native的开发技能,就能接到很多这方面的外包项目,或者在中小厂找到一份不错的工作;坏处是成熟度低、生态差——可能会踩很多坑,一些冷门的原生功能需要自己封装。 我相信随着尤雨溪团队和DCloud团队的不断迭代,Vue3 Native的成熟度和生态会越来越好,未来可能会成为跨平台开发的主流方案之一——毕竟国内做前端的,会Vue3的比会Dart、React的多太多了,这个人才储备优势是Flutter和React Native无法比拟的。
给大家几个入坑建议:
- 先学准真·Vue3 Native(UniApp X纯原生渲染),因为它的生态和成熟度都比其他分支好;
- 如果已有Vue3 Web项目要快速做原生应用,直接用Quasar Capacitor;
- 不要用旧Weex 2.0 Vue3兼容版;
- 多去UniApp的社区和GitHub上找资料和案例;
- 自己动手做几个demo,踩踩坑,才能真正掌握Vue3 Native的开发技能。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网

