uniApp分析
1、优势
- 自带HBuilder 开发工具,使用起来方便,可视化程度高。
- 增加条件编译,可以使用平台特有的api
- 生态丰富,拥有插件市场、DCloed管理后台。
- 基于Vue框架开发,对于使用Vue框架的开发工程师来说友好。
2、缺点
- api更新频繁,不稳定,会出现因api版本更新出现的bug。
- 很多vue内置的方法实现不了。
- 基于vue开发,需要继承vue API, 打包后体积过大。
- 开发阶段,热更新效率慢。
- 采用运行时机制,执行效率不如原生小程序高
3、实现原理
原理:编译器 + 运行时 配合使用。
1、编译器
- 利用 babel 工具通过 AST 进行转译
- uniApp 采用vue.js 语法规范,uniApp 在编译阶段将 .vue 格式的文件拆分为小程序的多文件。
2、运行时: 实现vue与小程序的 数据同步,事件同步,生命周期管理。
- runtime 将小程序的数据绑定,托管给Vue,Vue数据变化后,通过uni-app Runtime 的数据同步机制将数据传递给小程序。
- 当小程序视图层 事件触发、滚动等操作后,先触发小程序的事件函数,uni-app Runtime的事件代理机制触发vue的函数。
- 小程序的生命周期纳入到vue的生命周期中。
4、性能优化
- renders/wxs: 减少setData的调用次数
- Vue 瘦身: 提升了加载性能和运行性能
- vue.nextTick: 减少setData的调用次数
- Diff data : 减少setData传递的数据量。
- 自定义组件:减少 data diff 范围
1、定制 Vue,移除 vnode
Vue.js 负责数据管理,小程序负责数据渲染
- 小程序负责数据渲染,页面DOM由小程序生成,小程序只负责页面渲染。
- Vue 的 vnode 遍历对比维度复杂,但 Vue 维护的 vnode 无法和小程序的真实 DOM 对应
vue的执行流程优化:
- compile:optimize过程取消,,因为该环节是为了标注静态文本节点,而 Vue 只负责数据,不需要关注 DOM 节点;
- render function:不生成 vnode
- patch:不比对 vnode,因为 setData 仅能传递数据,所以我们只比对 data。
2、减少 setData 调用次数
- 合并响应数据