uniapp V3版本新特性介绍

uni-app的App端,历经了最初的模板编译模式、自定义组件编译模式,如今迎来了第三次重大突破。这个版本,被命名为V3。v3立项的目标,要解决App端的7个问题:

  • 运行更快
  • 框架体积更小
  • 开发编译更快
  • 提供视图层调试方案
  • 支持更多vue语法和指令(比如v-html)
  • 解开小程序的限制,提供更灵活的能力(比如视图层通过wxs可操作dom)
  • 规整源码结构,为更大规模的开源共研做准备

如何启用V3版本编译器

  1. 确保HBuilderX 2.5.1以上版本
  2. manifest.json可视化视图-App其他常用设置里勾选v3编译器,或者源码视图里的app-plus节点下添加"compilerVersion": 3即可开启V3,体验畅爽的App端开发。

注意:开启成功之后,编译App时控制台会输出编译器版本:*.*.*(v3)

v3的优势详述

1. 启动速度

以hello uni-app为例,在一款2015年出厂的安卓低端机测试多次

  • 旧版本启动耗时均值: (7493+7261+7343+7151+7313)/5 = 7312
  • v3 版本启动耗时均值:(2499+2371+2385+2487+2356)/5 = 2419

    以上单位为毫秒。

hello uni-app的首页是nvue。如果你的App首页是vue,优化幅度没这么大,但也有明显提升。

欢迎开发者使用v3,并将首页改为nvue以提升启动速度。

2. 框架体积

v3版的App端前端框架体积减少了0.8M。

3. 开发编译速度

  1. 初次点击运行到App,耗时减少58.27%。
  2. 支持二次运行diff更新
  3. 支持保存后diff同步手机

初次点击运行到App耗时测试结果

  • 所用电脑为17款MacBook
  • 所用项目为首页调整为vue后的Hello uni-app
  • 测试时间为从开始编译到应用启动(单位:毫秒)

手机型号:小米2s第一次第二次第三次第四次第五次平均
旧版本120951225612027121181203312105.8
v3版本434145184243427542294321.2

手机型号:红米1第一次第二次第三次第四次第五次平均
旧版本137261480914606141461476114409.6
v3版本838593718238847192848749.8

手机型号:Nexus 5第一次第二次第三次第四次第五次平均
旧版本117351169611809118351180911776.8
v3新版本485946174713496349504820.4

手机型号:一加3T第一次第二次第三次第四次第五次平均
旧版本902890499265915090359105.4
v3新版本345533193281343634153381.2

4. 视图层通过webview调试

老版uni-app一直无法方便的调试视图元素,v3支持webkit remote debug,在视图菜单打开webview调试控制,手机端运行可调试的基座,打开vue页面,即可在控制台看到该页面。点击“Inspect(调试)”。

注意:目前仅支持安卓调试

注意:

  • uni-app 只有v3模式下的vue页面支持webview调试。nvue不支持,原生的tabbar、navigationbar、video、map、subnvue、cover-view等也均无法审查界面
  • webview调试只能调试视图层的dom,方便布局排版。但不能debug js,因为js不运行在webview里。debug js仍然使用之前控制台右上角的debug虫子图标
  • iOS包必须使用自己的测试开发证书打自定义基座包,然后在mac电脑上的safari里才能调试。

5. 更全的vue语法支持

uni-app虽然相较于市面其他多端框架,是对vue支持最全面的。但仍然有部分vue语法不支持。本次在App端拉齐了支持度(小程序端暂未变化)

尤其是很多开发者喜欢的 v-html 指令,终于可以在App端正常运行了。

以下为新增支持vue语法:

全局 API

全局 API说明
Vue.extend不可作为组件使用
Vue.directive-
Vue.filter旧版不可以在class中使用

选项

选项说明
props旧版不可以传递函数
directives-
filters旧版不可以在class中使用
provide/inject旧版部分支持
name旧版不支持递归组件
model-
inheritAttrs-

生命周期钩子

生命周期钩子说明
activated-
deactivated-

实例属性

实例属性说明
vm.$isServerV3总是返回false
vm.$attrs-
vm.$listeners-

模板指令

模板指令说明
v-html-
v-bind旧版不支持v-bind="{who:me}"类似用法
v-pre-
v-once-

特殊属性

特殊属性说明
is-

内置组件

内置组件说明
component-
keep-alive-

目前仍有少部分vue语法未支持。具体见附录。

6. 解禁的视图层js,推出renderjs

  • 大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力

    逻辑层和视图层分离有很多好处,但也有一个副作用是在造成了两层之间通信阻塞。尤其是小程序和App的Android端阻塞问题影响了高性能应用的制作。

    微信小程序推出了wxs缓解此问题。

    uni-app兼容wxs,并且在App和H5端也实现了wxs。但微信定义的wxs限制太多,还是有很多高性能需求无法满足。

    于是renderjs诞生。

    renderjs只有App和H5支持,但它可以极大的提升通信效率。

    来看个基于renderjs的示例,App端流畅的canvas动画,超过了微信小程序的性能。

uniapp" target="_blank" rel="noopener noreferrer">hello uni-app示例中可真实体验,对比App端和小程序端的性能差异。下图是App端录屏gif。

  • 在视图层操作dom,运行for web的js库

    官方不建议在uni-app里操作dom,但如果你不开发小程序,想使用一些操作了dom、window的库,其实可以使用renderjs来解决。

    在app-vue环境下,视图层由webview渲染,而renderjs运行在视图层,自然可以操作dom和window。

    这是一个基于renderjs运行echart完整版的示例:renderjs版echart

    同理,f2、threejs等库都可以用了。

戳此查看renderjs的文档

范围注意

  • v3是针对App的改进,尤其是vue页面的改进。与其他平台无关。
  • app-nvue下,仍然无法支持v-html和wxs/renderjs等技术
  • v3模式加速了首页 nvue 的启动速度,当在首页 nvue 中访问 getApp 不一定可以获取真正的 App 对象。对此v3版本提供了const app = getApp({allowDefault: true})用来获取原始的app对象,可以用来在首页对globalData等初始化
  • 同样是由于加速了首页 nvue 的启动速度,视图层启动速度可能快于逻辑层,v3版本在nvue首页使用vuex时也可能遇到不可使用的问题,后续会对此进行优化

附:Vue特性支持表(App端)

全局配置

Vue 全局配置旧版V3说明
Vue.config.silent支持支持-
Vue.config.optionMergeStrategies支持支持-
Vue.config.devtools不支持不支持只在Web环境下支持
Vue.config.errorHandler支持支持-
Vue.config.warnHandler支持支持-
Vue.config.ignoredElements支持支持强烈不推荐,会覆盖uni-app框架配置的内置组件
Vue.config.keyCodes不支持不支持-
Vue.config.performance不支持不支持只在Web环境下支持
Vue.config.productionTip支持支持-

全局 API

Vue 全局 API旧版V3说明
Vue.extend不支持支持不可作为组件使用
Vue.nextTick不支持不支持-
Vue.set支持支持-
Vue.delete支持支持-
Vue.directive不支持支持-
Vue.filter支持支持旧版不可以在class中使用
Vue.component支持支持-
Vue.use支持支持-
Vue.mixin支持支持-
Vue.version支持支持-
Vue.compile不支持不支持uni-app使用的vue只包含运行时的版本

选项

Vue 选项旧版V3说明
data支持支持-
props支持支持旧版不可以传递函数
propsData支持支持-
computed支持支持-
methods支持支持-
watch支持支持-
el不支持不支持
template不支持不支持uni-app使用的vue是只包含运行时的版本
render不支持不支持-
renderError不支持不支持-
directives不支持支持-
filters支持支持旧版不可以在class中使用
components支持支持-
parent支持支持不推荐
mixins支持支持-
extends支持支持-
provide/inject支持支持旧版部分支持
name支持支持旧版不支持递归组件
delimiters不支持不支持-
functional不支持不支持-
model不支持支持-
inheritAttrs不支持支持-
comments不支持不支持-

生命周期钩子

Vue 生命周期钩子旧版V3说明
beforeCreate支持支持-
created支持支持-
beforeMount支持支持-
mounted支持支持-
beforeUpdate支持支持-
updated支持支持-
activated不支持支持-
deactivated不支持支持-
beforeDestroy支持支持-
destroyed支持支持-
errorCaptured支持支持-

实例属性

Vue 实例属性旧版V3说明
vm.$data支持支持-
vm.$props支持支持-
vm.$el不支持不支持-
vm.$options支持支持-
vm.$parent支持支持uni-app里面view等内置标签是以组件方式实现,$parent会获取这些内置组件
vm.$root支持支持-
vm.$children支持支持-
vm.$slots支持不支持旧版获取值为{'slotName':true/false}比如:{"footer":true}
vm.$scopedSlots支持支持旧版获取值为{'slotName':true/false}比如:{"footer":true}
vm.$refs支持支持-
vm.$isServer不支持支持V3总是返回false
vm.$attrs不支持支持-
vm.$listeners不支持支持-

实例方法

Vue 实例方法旧版V3说明
vm.$watch()支持支持-
vm.$set()支持支持-
vm.$delete()支持支持-
vm.$on()支持支持-
vm.$once()支持支持-
vm.$off()支持支持-
vm.$emit()支持支持-
vm.$mount()不支持不支持-
vm.$forceUpdate()支持支持-
vm.$nextTick()支持支持-
vm.$destroy()支持支持-

模板指令

Vue 指令旧版V3说明
v-text支持支持-
v-html不支持支持-
v-show支持支持-
v-if支持支持-
v-else支持支持-
v-else-if支持支持-
v-for支持支持-
v-on支持支持-
v-bind支持支持旧版不支持v-bind="{who:me}"类似用法
v-model支持支持-
v-pre不支持支持-
v-cloak不支持不支持-
v-once不支持支持-

特殊属性

Vue 特殊属性旧版V3说明
key支持支持旧版不支持表达式
ref支持支持-
is不支持支持-

内置组件

Vue 内置组件旧版V3说明
component不支持支持-
transition不支持不支持-
transition-group不支持不支持-
keep-alive不支持支持-
slot支持支持-

以上是 uniapp V3版本新特性介绍 的全部内容, 来源链接: utcz.com/a/9350.html

回到顶部