使用uniapp开发呢好多人说坑很多,不使用nvue还好吧,本身uniapp就是基于vue、小程序的,上手可谓 0 难度,但是有些细节还是需要注意的。

H5正常但App异常的可能性

1.css异常:

2.不支持的选择器

非H5端不支持*选择器;

body的元素选择器请改为page,同样,div和ul和li等改为view、span和font改为text、a改为navigator、img改为image…

组件和页面样式相互影响
非H5端默认并未启用 scoped,如需要隔离组件样式可以在 style 标签增加 scoped 属性,H5端为了隔离页面间的样式默认启用了 scoped

webview浏览器兼容性
vue页面在App端,默认是被系统的webview渲染的(不是手机自带浏览器,是rom的webview),在较老的手机上,比如Android4.4、5.0或iOS8,很多css是不支持的,所以不要使用太新的css,会导致界面异常。

注意这不意味着不能使用flex,Android4.4也支持flex,只是不要使用太新的css。

可以找Android4.4手机或使用pc模拟器实际测试下,大多数国产Android模拟器都是4.4或5.0。

从 uni-app 2.5.3 起,Android端支持引入腾讯x5浏览器内核,可以抹平低端Android的浏览器兼容性问题,详见x5使用指南

小程序不存在浏览器兼容问题,它自带了一个很大的Webview。所以如果你的H5和小程序界面正常,而Android低端机App界面异常,且App没有使用x5引擎,那基本就可以判定是因为css兼容性。

app端nvue页面,不存在浏览器兼容问题,它自带一个统一的原生渲染引擎,不依赖webview。

Android4.4对应的webview是chrome37。各端浏览器内核的详情查阅,参考:关于手机webview内核、默认浏览器、各家小程序的渲染层浏览器的区别和兼容性

原生组件层级问题 H5没有原生组件概念问题,非H5端有原生组件并引发了原生组件层级高于前端组件的概念,要遮挡video、map等原生组件,请使用cover-view组件。

使用了非H5端不支持的API 小程序和App的js运行在jscore下而不是浏览器里,没有浏览器专用的js对象,比如document、xmlhttp、cookie、window、location、navigator、localstorage、websql、indexdb、webgl等对象。

如果你的代码没有直接使用这些,那很可能是引入的三方库使用了这些。如果是后者,去插件市场搜索替代方案。要知道非H5端的js是运行在一个独立的js core或v8下,并不是运行在浏览器里。

从HBuilderX 2.6起,App端新增了renderjs,这是一种运行在视图层的js,vue页面通过renderjs可以操作浏览器对象,进而可以让基于浏览器的库直接在uni-app的App端运行,诸如echart、threejs,详见:https://uniapp.dcloud.io/frame?id=renderjs

1.使用了非H5端不支持的vue语法,受小程序自定义组件限制的写法,详见 2.不要在引用组件的地方在组件属性上直接写 style=“xx”,要在组件内部写样式
3.url(//alicdn.net)等路径,改为url(https://alicdn.net)因为在App端//是file协议 4.很多人在H5端联网时使用本地测试服务地址(localhost或127.0.0.1),这样的联网地址手机App端是无法访问的,请使用手机可访问的IP进行联网
H5正常但小程序异常的可能性

H5正常但小程序异常的可能性
1.同上
2.v-html在h5和app-vue(v3编译模式)均支持,但小程序不支持
3.小程序要求连接的网址都要配白名单

小程序正常但App异常的可能性
vue页面在App端的渲染引擎默认是系统webview(不是手机自带浏览器,是rom的webview),在较老的手机上,比如Android4.4、5.0或iOS8,一些新出的css语法是不支持的。注意这不意味着不能使用flex,Android4.4也支持flex,只是不要使用太新的css。可以找Android4.4手机或使用pc模拟器实际测试下,大多数国产Android模拟器都是4.4或5.0。

小程序不存在浏览器兼容问题,它内置了几十M自己的定制webview。所以如果你的H5和小程序界面正常,而App界面异常,大多是因为css兼容性。

解决这类问题:

1.放弃老款手机支持
2.不用使用太新的css语法,可以在caniuse查询
3.从 uni-app 2.5.3 起,Android端支持引入腾讯x5浏览器内核,可以抹平低端Android的浏览器兼容性问题,详见x5使用指南

小程序或App正常,但H5异常的可能性
1.在 uni-app 2.4.7 以前,H5端不支持微信小程序自定义组件,即wxcomponets下的组件,此时可能产生兼容问题。从 2.4.7 起,H5也支持微信自定义组件,不再存在这这方面兼容问题。
2.App端使用了App特有的API和功能,比如plus、Native.js、subNVue、原生插件等
3.使用了小程序专用的功能,比如微信卡卷、小程序插件、微信小程序云开发。对于云开发,建议使用可跨端的uniCloud。

App正常,小程序、H5异常的可能性
1.代码中使用了App端特有的plus、Native.js、subNVue、原生插件等功能

App(v2)与App(v3)差异说明
1.App(v2)默认template中使用了未定义或未初始化的数据,运行不会报错,且不影响后续节点渲染。App(v3)运行时,会直接告警,并报错(标准的vue渲染逻辑,同H5),且影响后续节点数据的渲染,错误信息通常显示为undefined is not an object, evaluating(xxx.xxx.xxx) 2.App(v2)默认隔离组件样式(组件间样式不会互相影响),App(v3)版本默认不隔离。目前发现开发者v2升级v3反馈的样式问题大多由此导致,v3版本将于2.6.14-alpha进行调整默认隔离组件间样式。

使用 Vue.js 的注意 (熟练vue的直接忽略)
1.uni-app 基于Vue 2.0实现,开发者需注意Vue 1.0 -> 2.0 的使用差异,详见 从Vue 1.x 迁移 2.data 属性必须声明为返回一个初始数据对象的函数;否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据

//正确用法,使用函数返回对象
   data() {
       return {
           title: 'Hello'
       }
   }
   //错误写法,会导致再次打开页面时,显示上次数据
   data: {
       title: 'Hello'
   }

3.在微信小程序端,uni-app 将数据绑定功能委托给Vue,开发者需按Vue 2.0的写法实现数据绑定,不支持微信小程序的数据绑定写法,故如下写法不支持:

<view id="item-{{id}}"></view>

需修改为:

<view v-bind:id="'item-' + id "></view>

区别于传统 web 开发的注意
你之前可能习惯自由的web开发,但目前各家小程序都有很多限制。 当然限制是为了在框架层更好的优化用户体验,所以小程序的体验要优于web。 并且这些限制只是写法的限制,并不影响功能。 如果你做过微信小程序开发,对这些限制应该已经很了解了。如果没有做过小程序,请仔细瞅瞅。
1. JS注意
非H5端,不能使用浏览器自带对象,比如document、window、localstorage、cookie等,更不能使用jquery等依赖这些浏览器对象的框架。因为各家小程序快应用都不支持这些对象。

没有这些浏览器自带对象并不影响业务开发,uni提供的api足够完成业务。

uni的api在编译到web平台运行时,其实也会转为浏览器的js api。
· App端若要使用操作window、document的库,需要通过renderjs来实现。

uni的api是多端可用的。在条件编译区,每个平台的专有api也可以使用,比如wx.、plus.等api可以分别在微信下和app下使用。

出于降低小程序向uni-app迁移成本的考虑,wx的api在app里也可以直接运行,比如写wx.requst和uni.requst是一样的,但仍然建议仅在微信的条件编译区使用wx的api。

2. Tag注意
uni-app的tag同小程序的tag,和HTML的tag不一样,比如div要改成view,span要改成text、a要改成navigator。

出于降低h5应用向uni-app迁移成本的考虑,写成div、span也可以运行在app和小程序上,因为uni-app编译器会把这些HTML标签编译为小程序标签。但仍然建议养成新习惯。

3. Css注意
虽然大部分css样式在微信小程序和app中都可以支持,但推荐使用flex布局模型,这种布局更灵活高效且支持更多平台(比如nvue、快应用只支持flex布局)

单位方面,uni-app默认为rpx。这是一种可跨端的通用单位 详见4.工程目录注意
每个要显示的页面,都要放到pages目录下,新建一个页面所在的目录,然后放同名目录的vue文件,比如project/pages/lista/lista.vue,并且在pages.json里配置。这与小程序的策略相同。

自定义组件,放到component目录

静态资源如图片,固定放到static目录下。这是webpack、mpvue的规则

数据绑定方式的注意
uni-app 基于Vue 2.0实现,开发者需注意Vue 1.0 -> 2.0 的使用差异,详见从 Vue 1.x 迁移

6.每个页面支持使用原生title,首页支持使用原生底部tab,这些是要在pages.json里配置,这些并不是vue页面的一部分。当然vue里的js api也可以动态修改原生title

7.虽然使用vue,但在app和小程序里,不是spa而是mpa

8.位置坐标系统一为国测局坐标系gcj02,这种坐标系可以被多端支持。老版5+的百度定位和百度地图使用的是百度私有坐标系bd09ll,这种坐标系需要转换。新版uni-app里的百度地图已经默认改为gcj02。高德地图不受影响,一直是gcj02
其余详见官网uniapp跨端开发注意事项

总结:
只要之前有vue、小程序开发经验,uniapp开发就是手到擒来了~