前言
你好,我是 PakJeon.
这篇文章记录一下我大半年以来,使用 Taro3 开发钉钉第三方个人小程序过程中遇到的一些问题和经验。
版本控制相关
因为小程序在线上审批通过并发布后,并不是用户就会立即使用到最新版的小程序(参考文档钉钉小程序更新机制)。因此会存在新接口已经在线上运行了,但是用户的客户端版本可能是旧版,由此引发的版本相关问题。
接口字段兼容
线上业务中已经在使用的接口,在后面迭代中需要新增返回字段,需要考虑存量数据是否会正常返回,如果不能的话要提前做好兼容。
缓存
上线新业务如果涉及到缓存的操作,需要考虑老用户客户端中已有的缓存,最好有一套强制让客户端缓存失效的方案,让新业务正常运行。
需要考虑新接口不影响旧版客户端
在测试环境,需要回归测试一遍新接口+旧版客户端功能是否正常。
展示小程序版本号相关信息,减少沟通成本
因为在测试环境频繁发版,为了让测试知道自己手上客户端是否最新版,避免开发跟测试经常 battle 这个不是bug,你用的都不是最新版 之类的低效沟通,需要在小程序某处放置当前发布的版本(比如:我的页面页脚或者一个关于页面)。更好的方法是搭配CI/CD,在测试分支发布时自动向OA发送版本通知。
开发者工具相关
此时笔者使用的是(小程序开发者工具 Version 3.7.13)
- 在真机调试的调试弹窗中,不能清空
Storage
,可以实现一个开发者工具页,在里面实现调用Taro.clearStorageSync()
。而开发者工具页可以通过 cross-env 这个库注入运行的环境变量,判断是在开发、测试环境则开放工具页入口。 - 想要调试特定的页面(比如某二级、三级页面)加特定的访问参数,不用每次都从应用的入口开始逐步跳转,更高效的方法是在开发者工具右上角有"普通编译",下拉可以看到"添加编译模式",可以自定义编译条件,做到指定启动页面、启动参数配置等。
- 调用
Taro.getAuthCode
进行免登,如果报错"请求钉钉失败",请检查开发者工具所选的应用是否跟服务端环境对上(比如用了生产环境的应用,生成的 code 自然不能在 dev 环境使用) - 图片资源存放的路径 不宜过深,建议是统一放在
/src/imgs
或者分包中的第一层(比如/pagesEnterprise/imgs
)曾经因为图片存放路径太深,导致引用后,开发者工具无法构建预览和真机模拟。 - 偶然出现自动退出登录,而且扫码登录不上的情况。无解之只能重启小程序开发者工具。
兼容性、功能性相关
底部安全区域(iOS 底部黑条的手势操作区域)
在第一级页面"tab 标签页"不需要适配(因为页面、抽屉弹窗都在 tab 标签页上面,tab 已经自带适配),在二级页面需要考虑"安全底部"样式进行适配。可以封装一个<SafeArea />
组件,关键样式是 env(safe-area-inset-bottom);
dangerouslySetInnerHTML 属性的使用
需要考虑 script、style、iframe 等标签的影响,建议使用DOMPurify
之类的轮子做一层清洗。
授权弹窗触发时,生命周期函数调用不统一
iOS 弹出手机授权弹窗,会触发页面的 useDidHide
,授权结束(包括拒绝、允许、点击屏幕空白地方)会触发 useDidShow
。但是在 Android 不会。
主包、分包之间页面跳转
当小程序主体体积较大时推荐使用分包
(把首次加载小程序资源体积减少,启动时只加载主包)主包跳转分包页面时,URL 需要用相对路径
Map 地图组件 Label 不显示问题
使用地图组件 Map 的 makers 的 label 属性,关于色号需要填完整,不能像 CSS 里的缩写(比如需要赋值成 #FFFFFF,不能赋值 #FFF),否则在 Android 真机上会无法渲染 makers。
Promise.finally 兼容性问题
不要使用Promise.finally
,iOS会报错。
页面跳转前发起异步请求,Promise 会全部变成 onReject 状态
发起一个异步请求,请求未返回时退出了页面(用navigateTo
或者navigateBack
等)即使异步请求返回了数据,也会走到接口请求的 catch。需要更改顺序为先跳转页面,再发起异步请求。ps: 一般是发生在使用消息通知机制触发其他页面的异步请求的场景。
关于请求方法
请勿使用PUT
请求方法,在 Android 真机上可能会出现传参到后端丢失的情况,跟后端协商使用POST
。
Taro-ui 组件库相关
Tabs 组件灵敏度过高
Taro UI 的 Tabs
组件存在灵敏度太高的问题,上下滑动的时候如果在水平方向有移动,会触发切换 tab,体验不好。目前官方 GitHub 有人提了同样问题的 issue,仍然未解决。建议先禁用水平方向移动切换 tab。
FloatLayout 组件
Taro UI 的 FloatLayout
弹出层组件,无法阻止点击空白地方关闭弹窗;弹出层 z-index 继承于其父元素,其导致如果父元素的兄弟节点的 z-index 比父元素大,则弹出层的遮罩不能遮盖该父元素的兄弟节点。
组件引入后无样式
有时候引入了组件发现没有效果,或者没有组件样式,试试单独引入对应组件的样式文件。
钉钉授权相关
个人基本信息授权
已授权的权限,如果重复调用授权,会继续抽屉底部弹出,但是会提示"该权限已授权"之类,并且抽屉很快就收回去,导致一个黑框一闪而过的感觉,体验不好。解决办法:后端记录授权状态,前端缓存授权状态
文档相关
文档找不到相关资源
提工单 ,不得不说,工单的解决速度还算可以。另,在钉钉小程序开发者文档里找不到,可以尝试到支付宝小程序文档里找找看。
结语
以上是我实际使用 Taro 开发钉钉小程序中碰到的问题以及解决思路,希望能帮助到有需要的人。还有更多实战中总结出来的"最佳"实践,先挖个坑,有空再分享。
感谢阅读。