uni-app
对vue3 & Vite
的升级,是一个渐进式过程:
至此,uni-app
在全平台支持了 Vite
编译及Vue 3.x
运行。
so,这场持续一年之久的大版本升级,究竟给uni-app
项目带来了哪些提升?
是时候总结(秀)一波了。
新版 uni-app 框架主要做了三大改进:
vue3 + ts
重写内置组件和API,实现更彻底、更高效的tree-shaking
;基于这三大改进,uni-app项目获得了多快好省四大收益:
新版uni-app
支持Vue 3.x框架,支持组合式API,可实现更聚焦的业务开发。
Vue 3.x的一些新增特性,uni-app
也已经完全支持,如:
<script setup>
<style scoped>
、<style module>
、State-Driven Dynamic CSS(v-bind)
jsx
、tsx
(h5,app 平台支持,小程序不支持)另外,在小程序平台,新版uni-app
也扩展了更多的语法,如:
class
、style
支持函数、变量等,不再局限数组、对象类型)props
支持(如传递函数)slot
支持(如作用域插槽)开发者日常工作中,最无聊的就是等待编译构建。
某乎上还有一个”程序员在等待编译的时候都做什么?“的讨论帖,可见编译时间对开发者而言,是一个多么尴尬无聊的碎片时间。
uni-app
本次升级vue3 & Vite
后,在编译时间上有多少改进?带给开发者多少福利?我们安排真实测试,以数据说话。
测试环境说明:
硬件:RedmiBook 14 二代 处理器:Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz 内存:16.0 GB 操作系统:Windows 11 专业版 64 位操作系统
关于编译速度,我们做了两个维度的对比:
uni-app
常用项目模板,在H5、小程序、App平台,分别测试vue 2.6
和vue 3.x
的编译时间uni-app
的vue 3.x
版本进行对比我们选择uni-app默认模板
、uni-starter
、hello-uniapp
三个项目模板,分别测试vue 2.6
和vue 3.x
的编译时间。
uni-app项目编译时间的采集方式:
vue 2.6
版本编译时间 = webpack 的 stats.endTime - stats.startTimevue 3.x
版本编译时间 = 构建工具入口处记录 global.__vite_start_time = performance.now(),构建工具编译完成时:performance.now() - global.__vite_start_time对uni-app
的三个项目模板分别运行到H5平台,进行多次编译测试,并求其均值后,获得如下数据:
由此,我们可以观察到:
vue 2.6
环境下,随着项目复杂度的提升,H5首页预览所需编译时间会直线增加;这是因为在vue 2.6
版本下,虽然仅预览首页,但依然会使用 webpack
编译整个项目资源;故项目越复杂,编译时间越长;vue 3.x
环境下,H5首页预览的编译时间跟项目复杂度也有关系,但增幅不大;这是因为在vue 3.x
版本下,使用 Vite
进行构建,预览首页时仅编译首页及首页所依赖资源,不会编译其它页面资源。通过图表对比,我们可以直观得出结论:vue 3.x
环境下的首页编译时间,平均不到vue 2.6
环境下的十分之一。
换言之,vue 3.x
版本下的首页编译速度,相比vue 2.6
版本,有十倍效率提升。
这个十倍效率提升,主要得益于新版采用Vite
作为构建工具,由此带来了两大好处:
esbuild
作为打包工具,相比vue 2.6
环境下的webpack
,构建速度快 10-100 倍(这不是我们夸大,详见esbuild)本着这个十倍效率提升,小伙伴们还不赶紧上手试试?
对uni-app
的三个模板项目运行到小程序平台,多次编译测试,并求其均值后,获得如下数据:
从上图对比数据来看,我们可以得出结论:小程序平台,vue 3.x
版本下的运行编译,相比vue 2.6
版本,编译性能至少提升30%;且项目越复杂,编译性能提升越明显,可以达到40% ~ 50%。
对uni-app
的三个项目模板继续运行到App平台,多次编译测试,并求其均值后,获得如下数据:
从上图对比数据来看,我们可以得出结论:App平台,vue 3.x
版本下的运行编译,相比vue 2.6
版本,编译性能提升将近50%。
虽没有H5平台的十倍效率提升那么刺激,但将近50%的速度提升,经常开发小程序/App的小伙伴,还不心动?
除了采用不同版本的uni-app
进行纵向对比外,我们还使用业内优秀的跨端框架Taro
,创建空的项目模板,进行横向对比测试。
具体测试方案:
Taro
的最新cli,本文测试时使用的版本为"@Tarojs/Taro": "3.3.16"Taro init
命令,分别选择react
、vue
、vue3
框架,创建三个默认项目模板,三个项目名称分别为taro3-react
、taro3-vue
、taro3-vue3
,如下图: npm run dev:h5
,运行到H5平台进行预览,记录每次预览编译时间,重复执行,求其均值关于Taro
编译时间的计算方案:
Taro
扩展插件,插件规范参考Taro官网 - 插件功能ctx.onBuildStart
中记录开始编译时间ctx.onBuildFinish
中记录编译结束时间然后使用uni-app
的cli
命令行,创建基于vue3.x
的空项目模板,项目命名为uni-app-vue3
。
我们使用各自框架的命令行,将如上创建的5个项目分别编译到H5平台和小程序平台,多次测试,并求其均值。
同框架版本在H5平台上的编译时间,结果如下:
从图中可以看出,uni-app
的vue3
版本,在H5平台上的首页编译预览性能是遥遥领先的。这个遥遥有多远呢?这么讲吧,你都编译20次了,友商第一次还没完呢。
继续编译到小程序平台,多次测试,求其均值,结果如下:
从图中可以看出,uni-app
的vue3
版本,在小程序平台上的编译性能也是遥遥领先的,这个遥遥也不近。
开发环节编译快了,那面向最终用户的软件,运行性能怎么样?
我们进入性能测试章节。
测试方案:
测试计时方式:
在小米手机上进行多次测试,求其平均值,结果如下:
记录条数 | 200 | 400 | 600 | 800 | 1000 |
---|---|---|---|---|---|
vue2 | 30ms | 43ms | 56ms | 72ms | 90ms |
vue3 | 8ms | 9ms | 9ms | 8ms | 9ms |
从表格中可以看出:
vue 2.6
版本的uni-app
项目,点赞组件响应时间快速增加,响应越来越慢;vue 3.x
的uni-app
项目,点赞组件的响应时间跟页面条数无关,一直保持极高的响应灵敏度,性能体验远高于vue 2.6
版本。从这个常见的长列表组件响应实验来看,vue 3.x
的性能体验要远高于vue 2.6
版本。
项目发行后的代码体积,是一个很重要的考量指标:
为了测试vue 3.x
新版升级后,代码体积的变化,我们同样做了两个维度的测试:
uni-app
常用项目模板,在H5、小程序、App平台,分别测试vue 2.6
和vue 3.x
的编译包大小uni-app
版本进行对比Tips:
npm run dev
操作npm run build
操作我们复用之前创建的uni-app默认模板
、uni-starter
、hello-uniapp
三个项目模板,分别测试vue 2.6
和vue 3.x
的编译包体积。
uni-app
项目编译包体积的采集方式:编译到对应平台后,记录编译后文件夹的大小。
H5平台编译后代码体积记录如下:
从统计结果来看,uni-app
的vue3.x
版本,在H5平台上的编译包体积至少瘦身30%以上。
H5平台的瘦身优化,主要得益于uni-app
框架的底层全面重构,实现了更彻底的摇树优化。
小程序平台编译后代码体积记录如下:
从统计结果来看,uni-app
的vue3.x
版本,在小程序平台上也有大幅瘦身。
App平台编译后代码体积记录如下:
从统计结果来看,uni-app
的vue3.x
版本,在App平台上根据项目不同,会有不同幅度的瘦身。
从理论上来讲,项目中的页面模板越复杂,App平台的瘦身效果越明显。
关于编译后的代码体积,我们也和业内优秀的跨端框架Taro
进行了对比,复用前面章节创建的三个Taro
项目,分别编译到H5平台和小程序平台,计算其编译后的源码文件夹大小。
从图中可以看出,uni-app
的vue3版本,在H5平台上编译包体积是最小的,只有友商的十分之一左右。
我们继续测试,不同版本框架发行到微信小程序平台,记录其编译包大小:
从图中可以看出,uni-app
的vue3版本,在小程序平台上编译包体积也是最小的。
**Tips:**细心的开发者会发现,所有框架版本编译到小程序上的代码包体积都远小于其在H5平台上的包体积,这是因为小程序由平台厂商提供内置组件及接口实现,而H5平台则需跨端框架自己实现内置组件及接口,故H5平台的代码包普遍要大一些。
综上,我们以数字说话,阐述了vue3版本uni-app
开发的诸多好处,再回顾一遍:
你还不赶紧升级新版uni-app
来试试吗?
对文本测试过程及结果有疑问的同学,欢迎到github上提交issue,欢迎指正。
|