力软框架移动端支持运行到6个平台,包括 H5、安卓 App、iOS App、微信小程序、支付宝小程序、钉钉小程序。
这些平台各自存在不同的 API 差异、组件差异、页面渲染差异,甚至存在不同的 bug,需要开发者特别注意。
App 平台:
H5 平台:
小程序平台:
不同平台存在差异,代码无法直接通用。例如:H5 平台不能扫码,其他平台可以;H5 平台涉及到跨域通讯限制,其他平台无此问题等。
uni-app 允许使用条件编译来为每一种平台单独编写一部分代码:uni-app 条件编译官方文档。
**注意:**钉钉小程序的条件编译是 MP-DINGTALK
,文档里没有写;
**注意:**如果写成 MP-ALIPAY
,那么这一块的代码支付宝小程序、钉钉小程序都会编译进去;
只编译到支付宝小程序而不想编译到钉钉小程序,则需要写成嵌套形式。
// #ifdef MP-ALIPAY
// 【注意】这里面的代码,支付宝小程序和钉钉小程序都会编译进来
// #endif
// #ifdef MP-DINGTALK
// 这里面的代码,只有钉钉小程序会编译进来
dd.httpRequest()
// #endif
// #ifdef MP-ALIPAY
// #ifndef MP-DINGTALK
// 这里面的代码,只有支付宝小程序会编译进来
my.request()
// #endif
// #endif
// #ifdef MP-WEIXIN
// 这里面的代码,只有微信小程序会编译进来
wx.getWeRunData()
// #endif
// #ifdef MP
// 这里面的代码只会编译到所有小程序平台
uni.scanCode()
// #endif
// #ifdef H5
// 这里面的代码只会编译到 H5 平台
window.document.getElementById()
// #endif
// #ifdef APP-VUE
// 这里面的代码只会编译到 App 平台
uni.preloadPage()
plus.io.requestFileSystem()
// #endif
通用注意点:
<canvas>
组件在不同端的 API 不同,因此需要使用条件编译来进行处理(可以参考 /pages/nworkflow/myflow/sign.vue 中的做法);微信小程序的注意点:
<textarea>
、<map>
,任何页面内容都无法覆盖原生组件(除了 <cover-view>
,但是限制太多),因此在使用诸如 <textarea>
的原生组件时,需要特别处理覆盖显示问题;my-component
,那么运行时组件外面会包裹一层 <my-component>
的节点;因此在编写涉及到组件的样式时,请慎用 >
这个父子级 CSS 选择器,慎用父子级百分比定位,慎用 flex 布局;:host { }
这个选择器,给这个选择器设置的样式适用于组件包裹的标签本身(在上个例子中,如果设置了 :host { }
的样式,这些样式适用到 <my-component>
这个节点上),注意这个选择器在标记了 scoped
的样式块中无效;阿里小程序(阿里=支付宝+钉钉)的注意点:
v-if="$slots.$default"
来判断(其他平台默认插槽位于 $slots.default
,阿里系小程序多了一个 $ 符号);具名插槽无此问题;global
或 globalThis
,会导致直接引入 lodash 报错,使用 lodash 时请使用部分引入;力软框架在使用 lodash 的代码文件中均做了部分引入处理(常规方式 import _ from 'lodash'
在阿里小程序中报错,需要把 lodash 中用到每一种方法分别写成 import get from 'lodash/get'
这种形式);page { }
这个选择器;可以为页面根节点 <view>
赋予一个 class 或者 id,然后使用对应的选择器来设置页面样式;height: 100%; position: absolute;
这两条样式;env(safe-area-inset-bottom)
在阿里系小程序中获取不到,请使用条件编译额外判断;this.RELAUNCH_TO
或 uni.reLaunch
来跳转页面会导致重新加载整个小程序,SET_GLOBAL
中的数据等都将被清空;因此开发钉钉小程序时需要特别注意处理调用 this.RELAUNCH_TO
或 uni.reLaunch
的情形;this.$refs
会获取不到子组件,请避免使用(本条请真机调试测试,模拟器上运行正常)。App 平台的注意点:
plus.*
开头,涵盖了文件操作、推送、设备硬件操作等紧密结合手机系统的 API,也是 uni-app 公司开发的;注意小程序平台、H5 平台调用均会报错,因此如果开发多端 App,这一块的代码请使用条件编译;<map>
,任何页面内容都无法覆盖原生组件(除了 <cover-view>
,但是限制太多),因此在使用诸如 <map>
的原生组件时,需要特别处理覆盖显示问题。H5 平台的注意点:
Access-Control-*
相关的响应头;<div>
模拟标题栏和底边栏,这时使用 top
、bottom
属性获取的相对窗口的定位是不准确的,需要分别替换成 var(--window-top)
和 var(--window-bottom)
;例如某个元素如果需要距离窗口顶部10像素,应该写成 top: calc(10px + var(--window-top))
;<uni-view>
的元素,请慎用 >
这个父子级 CSS 选择器。