最近使用 Uni-App 的感受。
从团队成员和成本来考虑,团队从 React 转向了 Vue 技术栈。
使用体验
没用之前以为真和 Vue 一样,用了之后才知道。这喵的是 Vue 和 小程序的结合体吖。写类似小程序的标签,Vue 的语法。对比 Uni-App 文档和微信小程序的文档,不差多少,只是将 wx => uni,熟悉 Vue 和 小程序可以直接上手。
需要注意看注意事项,给出了和 Vue 使用的区别。例如动态的 Class 与 Style 绑定,在 H5 能用,APP 和小程序就挂了。
路由
Uni-App 的路由全部配置在 pages.json
文件里,就会导致多人开发的时候,路由无法拆分,如果处理的不好,经常发生冲突。
里面其他的配置项,见官方文档就可以处理了。
导航
导航栏需要注意的一个问题就是不同端的展示形式会不同,所以要处理兼容问题,导航栏可以自定义,用原生,框架,插件但是兼容性都不同,多端需求一定要在不同设备跑一下看效果。
例如在小程序和 APP 中,原生导航栏取消不了,就不能用自定义的导航栏,要在 pages.json
中配置原生导航栏。
兼容方法就是用 Uni-App 提供的条件编译,处理各端不同的差异。支付的业务也是通过条件编译,区分不同端调用不同的支付方式。
生命周期
分 应用的生命周期
、页面的生命周期
、组件的生命周期
。大致上和 Vue 的差不多,页面生命周期针对当前的页面,应用生命周期针对小程序、APP。这些坑的过程都要踩一下!
网络请求
官方的 uni.request
虽然封装好了基本的请求,但是没有拦截,我们开始也是自己在这基础上加了层壳,简单的封装发送请求。后面是选择了第三方库的使用,如 flyio、axios。
资源优化
- 不涉及 Webpack 之类的资源打包优化,但是文档中有提到资源预取、预加载、treeShaking 只需要在配置文件中设置即可,或者在开发工具勾上。小程序也是勾选自动压缩混淆。
- 删除没用到文件和图片资源,因为打包的时候是会算进去的,比如
static
目录下的资源文件都会被打包,而且图片资源太大也不好。 - Uni-App 运行时的框架主库
chunk-vendors.js
文件是经过处理的,部署做gZip
。
Web-View
在 Uni-App 中使用 WebView,可以使用本地的资源和网络的资源,不同平台也是有差异的,小程序不支持本地 HTML,且小程序端 WebView 组件一定有原生导航栏。
需要注意的是网页向应用 postMessage
的时候需要引入 uni.web-view.js
,不然是没办法通信拿不到数据。
全局状态
小程序中要在每一个页面中添加使用共有的数据,可以有三种方式解决。
Vue.prototype
它的作用是可以挂载到 Vue 的所有实例上,供所有的页面使用。
// main.js
Vue.prototype.$globalVar = "Hello";
然后在 pages/index/index 中使用:
<template>
<view>{{ useGlobalVar }}</view>
</tempalte>
<script>
export default {
data (){
return {
useGlobalVar: $globalVar
}
}
}
</script>
globalData
<!-- App.vue -->
<script>
export default {
globalData:{
data:1
}
onShow() {
getApp().globalData.data; // 使用
getApp().globalData.data = 1; // 更新
};
</script>
Vuex
Vuex 是 Vue 专用的状态管理模式。能够集中管理其数据,并且可观测其数据变化,以及流动。
之前看到一个通俗化比喻:用交通工具来比喻项目中这几种描述全局变量的方式。
下面列举这些方式通俗的理解状态:
Vue 插件 vue-bus
可以来管理一部分全局变量(叫应用状态吧),学习后发现,bus(中文意思:公交车)这名字取得挺形象的。
先罗列一下这些方式,不过这种分类并不严谨。
1、VueBus:公交车
2、Vuex:飞机
3、全局 import
- a.
new Vue()
:专车 - b.
Vue.use
:快车 - c.
Vue.prototype
:顺风车
4、globalData:地铁
首先 VueBus
,像公交车一样灵活便捷,随时都可以乘坐;表现在代码里,很轻便,召之即来,缺点就是不好维护,没有一个专门的文件去管理这些变量。想象平时等公交车的心情,知道它回来,但不知道它什么时候来,给人一种很不安的感觉。
而 Vuex
,它像飞机,很庄重,塔台要协调飞机运作畅顺,飞机随时向地面报告自己的位置,适合用在大型项目。表现代码中,就是集中式管理所有状态,并且以可预测的方式发生变化。也对应着飞机绝对不能失联的特点。
第三种方式是全局 import
,分三种类型,分别是:new Vue()
、Vue.use()
、Vue.prototype
。可以用网约车来比喻,三种类型分别对应:专车、快车、顺风车。都足够灵活,表现在代码里:一处导入,处处可用。
再分别说明:
new Vue()
就像滴滴的礼橙专车,官方运营,安全可靠。表现在代码里,就是只有 Vue 官方维护的库才能使用这种方式。
Vue.use()
就像快车,必须符合滴滴的规范,才能成为专职司机。表现在代码中,就是导入的插件(或者库)必须符合 Vue 的写法(即封装了 Vue 插件写法)。
Vue.prototype
像顺风车,要求没上面两个那么严,符合一般 js 写法就行,就像顺风车的准入门槛稍稍低一点。
当然,Uni-App 的项目里还有可以用 globalData
定义全局变量,非要比喻,可以用地铁,首先比 vue-bus
更好管理维护,想象地铁是不是比公交更可靠;其次比 Vuex 更简单,因为 globalData 真的就是简单的定义一些变量。
globalData 是微信小程序发明的,Vue 项目好像没有对应的概念,但是在 Uni-App 中一样可用。
上面说到,这种分类方式不严谨,主要体现在原理上,并不是简单的并列关系或包含关系。
插件市场
用得比较好的组件:
ColorUI-UniApp:是个样式库,不是组件库。
答题模版:左右滑答题模版,单选题、多选项,判断题,填空题,问答题。基于 ColorUI 做的。
uCharts 高性能跨全端图表:
最后:各端的差异性,很多东西,H5 挺好的,上真机就挂了,真机好着的,换小程序就飘了,不同小程序之间也有差异,重点是仔细阅读文档。
云打包限制,云打包(打 APK) 的每天做了限制,超出次数需要购买。
虽然可能一些原生可以实现的功能 Uni-App 实现不了,不过整体开发下来还行,很多的坑还是因为多端不兼容,除了写起来麻烦一点,基本上都还是有可以解决的策略。比之前用 Weex 写 APP 开发体验好一点。