多次论证、数月研发,我们重写部分Vue底层、重构uni-app框架,实现了微信端性能翻倍及更多Vue语法支持。

背景

uni-app在初期借鉴了mpvue,实现了微信小程序端的快速兼容,感谢美团点评团队对于开源社区的贡献!

随着使用uni-app的开发者愈来愈多,业务复杂度不断增加,不少开发者抱怨uni-app支持的vue语法少,某些场景性能有问题(特别是页面存在复杂组件的情况),这些问题其实是由mpvue的实现机制导致的,我们以复杂组件的性能问题为例简要说明。

mpvue/wepy 诞生之初,微信小程序尚不支持自定义组件,无法进行组件化开发;mpvue/wepy 为解决这个问题,创造性的将用户编写的Vue组件,编译为WXML中的模板(template),这样变相实现了组件化开发能力,提高代码复用性,这在当时的技术条件下是很棒的技术方案。但如此方案,也导致Vue组件中的数据会被编译为Page中的数据,对组件进行数据更新也会基于路径映射调用Page.setData。特别是组件较多、数据量交大的页面中,每个组件的局部更新会引发页面级别的全局更新,产生极大的性能开销。

微信后来推出的自定义组件,其实支持组件级别的局部更新,经验证,我们发现组件级别的数据更新,相比页面全局更新,有大幅性能提升。

另外,mpvue在Vue层进行的vnode对比及数据diff计算不彻底,也会消耗部分性能。

基于这些原因,我们开始了微信端的框架重写工作。

新版特性

性能翻倍

新版 uni-app 调整重写了部分Vue.js底层实现,主要包括:

  • 基于小程序自定义组件实现 Vue.js 的组件化开发
  • Vue层取消vnode对比
  • 更彻底的diff计算,setData()通讯数据量更少

新框架重写后,我们构造了如下测试模型:

  • 构造一个列表界面,每个列表项为一个自定义组件
  • 上拉加载触发数据更新,每次从本地读取静态数据,屏蔽网络差异
  • 触发数据更新计时开始,页面渲染完毕计时结束,求其时间差作为对比指标(耗时,单位为毫秒)

然后分别使用新、老框架,在同一台手机(vivo nex)上进行多次测试,求其平均值,获取如下结果:

从测试数据来看,新框架在复杂页面下,性能有翻倍提升!特别是数据越多、组件越复杂的页面,性能提升越大!

更多 Vue 语法支持

我们同时增强了uni-app编译器,支持了更多 Vue 语法,详细如下:

  • 支持过滤器 filter
  • 支持比较复杂的 JavaScript 渲染表达式
  • 支持在 template 内使用 methods 中的函数
  • 支持 v-html (同 rich-text 的解析)
  • 组件支持原生事件绑定,如:@tap.native

体验方式

目前新框架在微信端已完成开发,其他小程序和App的编译器仍为旧版。我们放出群测版,邀请开发者在微信端抢鲜体验。

开发者可按照如下方式创建vue-cli并创建uni-app项目,编译发行到微信小程序:

# npm script
# 全局安装vue-cli
$ npm install -g @vue/cli
# 创建uni-app项目,会提示选择项目模板,初次接触建议选择 hello uni-app 模板
$ vue create -p dcloudio/uni-preset-vue my-project
# 进入项目目录
$ cd my-project
# dev 模式,编译预览
$ npm run dev:mp-weixin
# build 模式,发行打包
$ npm run build:mp-weixin

新老版本切换

为了不影响老项目,uni-app群测版目前同时内置新、老两个框架,且默认使用老框架,开发者可通过配置 manifest.json -> mp-weixin -> usingComponents节点启用新编译框架,如下:

// manifest.json
{// .../* 小程序特有相关 */"mp-weixin": {"usingComponents":true //启用新框架编译,默认为false}
}

如果你使用了新增的vue语法,请注意只有h5和微信支持这些新语法,编译到其他平台时,要用条件编译处理。

Tips: - 为保证自定义组件兼容性,运行到微信开发者工具时,建议将微信基础库设置为最新版本。 - 体验新框架时,有任何问题或者建议,欢迎到github提交 issue

现状与未来

春节过后,uni-app1.6版本发布,新增字节跳动小程序平台支持;至此,实现一套代码、7端发布!7端分别包括:App(iOS/Android)、小程序(微信/支付宝/百度/字节跳动)、H5平台,见下图:

大量开发者热情涌入 uni-app 社区,目前已有几十个uni-app交流群,下图为一个500人的QQ交流群,创建2天即满群,开发者的热情可见一斑。

目前,每天新创建的uni-app项目(包括测试项目)达数千个,案例早已过万,部分案例见https://uniapp.dcloud.io/case。与Taro等框架清一色微信小程序案例相比,uni-app跨端案例要丰富很多。

在小程序跨端框架中,uni-app也许是使用人数最多、跨端案例最丰富的前端框架。

近期,为活跃Vue多端开发生态,由uni-appmpvue团队联合举办的插件开发大赛正式开始了!欢迎各位开发者踊跃参与,制造轮子、造福社区的同时,顺手再拿个奖品(iphone Xs Max、4K显示器等奖品多多),一举多得^_^,点击了解详情。

接下来,uni-app团队将继续全力奔跑,在如下方面快速完善:

  • uni-app新框架兼容到其它平台
  • uni-ui 跨端UI库精致化
  • App端引入更多原生渲染,提升系能体验
  • 周边生态进一步完善,比如行业模板、跨端统计等

“为开发者而生”,不是口号,而是定位。

uni-app团队将一如既往的为开发者解决开发痛点、提升开发效率!

uni app 录音结束监听_全新重构,uni-app实现微信端性能翻倍相关推荐

  1. flutter复制口令返回app监听粘贴板,类似App助力

    @overridevoid didChangeAppLifecycleState(AppLifecycleState state) {switch (state) {case AppLifecycle ...

  2. html5监听动画结束,css3动画是否结束监听事件

    css3动画是否结束监听事件: var domObj = $("#id"); domObj [0].addEventListener("webkitAnimationEn ...

  3. avplayer播放结束监听

    //添加播放结束监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinishe ...

  4. asterisk konference 视频会议,录音、监听,强插等的extensions.conf的命令 和 Asterisk 几个重要配置文件举例说明

    asterisk konference 视频会议,录音.监听,强插等的extensions.conf的命令 转自:http://www.asteriskcn.com/index.php?q=conte ...

  5. protools监听_给新手写的万元录音设备选择2020系列(六)监听音箱/耳机

    又到了我最爱的挑音箱环节,这次我还加上了两款实测好用的耳机.和2017版一样,音箱/耳机文章预计仍然是业余用户和自封专业用户的重度聚集区,各种不靠谱言论和私信满天飞.这种带有明显主观判断.情绪化.无训 ...

  6. 声卡突然听不到监听_初次玩外置声卡监听与录音 遇到些问题 恳请大神帮忙解决...

    先上两张图片 是我入的外置icon声卡的前后面板图 11111_副本.jpg (83.24 KB, 下载次数: 2) 2016-5-30 12:30 上传 22222_副本.jpg (66.2 KB, ...

  7. Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到...

    ---------------------------!! 转载请注明出处 !!----------------------- 一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能正常 ...

  8. Android 实现录音和监听声音大小实现话筒动画效果

    公司项目做的差不多了,,闲下来了,,就写一篇关于android利用MediaRecorder实现录音的文章吧,并且录音的时候声音的大小可以控制话筒实现动画效果, 效果如图所示: 录音的文件最后保存在S ...

  9. uniapp实战项目 (仿知识星球App) - - 利用computed监听用户操作

    实战项目名称:仿知识星球App 技术栈:前端 => uni-app ( 后端:Node.js + Mysql + Apollo + Graphql ) 已实现功能:微信登录,创建星球,内容管理, ...

最新文章

  1. OpenCV支持的图像格式
  2. 270亿参数、刷榜CLUE,达摩院神作!
  3. 【祝贺】norains同志在这里开《Windows CE大排档》书友会
  4. 数据结构与算法 | 链表
  5. python标识符、命名规则及关键字(含笔记)
  6. QR算法的Matlab 程序,三种实现矩阵QR分解的算法与程序
  7. java中日历类的用法_java日期类的用法
  8. C++操作系统注册表读取默认键值
  9. java进制转换的简单方法
  10. 转调小程序(练口琴时用的)
  11. c语言程序 中断函数示例,单片机中断应用的C语言编程 -解决方案-华强电子网
  12. Win10防火墙放行MySQL3306端口
  13. python的爬虫攻击
  14. 70个经典的 Shell 脚本
  15. org.apache.thrift.transport.TTransportException: SASL authentication not complete
  16. 金蝶EAS,序时簿界面ListUI数据不允许修改、删除
  17. html如何连接外部样式表,怎么链接外部css文件?
  18. 用ros中apriltag码进行定位(记录一下)
  19. Chemical Peel Treatment For Acne Scars
  20. Gitbook 插件安装 - 导航目录折叠 chapter-fold

热门文章

  1. LeetCode-3. 无重复字符的最长子串
  2. 【python基础知识】如何查看pycharm中已经安装的插件
  3. Mac上Java开发环境配置
  4. Visual Studio注释快捷键
  5. spark-OutOfMemory:GC overhead limit exceeded 解决,timelimitexceeded
  6. ES6语法---set
  7. CSS样式引入方式和部分CSS样式的设置
  8. c++二进制转十进制_进制转换:二进制、八进制、十进制、十六进制相互转换
  9. 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
  10. 批量导入时间oracle excel,读取Excel数据、批量导入到Oracle数据库