作者:大转转FE-吴鹏和

小程序原生页面存在层级限制,超过一定层数就会无法打开新页面。一开始这个限制为不超过5层,目前是不超过10层。

这个限制对于体量较大的小程序来说,挺难受的。特别是只能打开5层那会儿,业务流程很容易一不小心就超了,比如:首页-搜索结果页-商品详情页-聊天页-下单页-地址选择页-...;更有访问回路防不胜防,比如:商品详情页-查看更多页-商品详情页-查看更多页-...、商品详情页-聊天页-个人主页-商品详情页-聊天页-个人主页-商品详情页-...、诸如此类。即使后来放宽至了10层,还是很容易遭遇层级溢出。

一种处理思路是调整交互路径,严格控制层级数量。但是这种处理方案,一则很多时候会牺牲用户体验,比如为避免个人主页和商品详情页的访问回路,要么不能在个人主页中访问用户商品,要么不能在商品详情页中访问卖家主页,要么访问时需要替换当前不能返回继续浏览,不管怎么取舍都会牺牲某些用户的浏览诉求;二则维护成本特别高,业务逻辑越来越复杂,交互路径越来越发散,路径的统一梳理和规划就会越来越困难,而且管理过程对业务不透明,业务方在设计需求时要受到交互路径的种种限制,甚至一个需求的交互调整很可能无意中造成另一个需求层级溢出,维护成本高且不断膨胀。

因而本文考虑并实现了另一种处理思路:在小程序中支持不限层级的路由过程。

策略

  • 修改小程序默认导航行为,自行维护完整历史记录
  • 页面层级小于等于10时,导航行为与原生导航行为一致
  • 请求打开第11层及以上时,逻辑层级记录完整历史,实际层级每次都是直接将第10层替换为目标页面
  • 返回时,逻辑层级相应回退;若回退后逻辑层级大于等于10,则实际层级将第10层替换为目标页面,否则实际层级回退到相应页面
  • demo:
  逻辑层级 1 - 2 - ... - 8 - 9 - 10实际层级 1 - 2 - ... - 8 - 9 - 10打开逻辑层级 1 - 2 - ... - 8 - 9 - 10 - 11实际层级 1 - 2 - ... - 8 - 9 - 11打开,打开,打开逻辑层级 1 - 2 - ... - 8 - 9 - 10 - 11 - 12 - 13 - 14实际层级 1 - 2 - ... - 8 - 9 - 14返回逻辑层级 1 - 2 - ... - 8 - 9 - 10 - 11 - 12 - 13实际层级 1 - 2 - ... - 8 - 9 - 13返回,返回,返回逻辑层级 1 - 2 - ... - 8 - 9 - 10实际层级 1 - 2 - ... - 8 - 9 - 10返回逻辑层级 1 - 2 - ... - 8 - 9实际层级 1 - 2 - ... - 8 - 9
复制代码

实现

转转 实现了上述策略,并提供开源使用,地址:github.com/zhuanzhuanf…,欢迎使用或参阅。

主要难点及实现方案:

  • 如何接管路由过程

    • 要求所有页面不使用<navigator>元素,统一使用js触发跳转
    • 要求所有页面不直接调用wx.navigateTo、wx.redirectTo等路由相关接口,统一改用模块封装的相应接口
  • 如何监听返回行为
    • 统一监听页面的onUnload函数,结合路由过程判断是否用户返回
  • 如何兼容系统交互
    • 问题:系统交互会跳出正常路由流程,并且难以接管或监控,如:用户点击右上角返回主页按钮、用户切后台后又从其它入口进入、用户强制关闭小程序进程等
    • 处理:引入校正机制,在合适的时机根据系统路由栈对自行维护的路由栈进行校正。这样可以保证10层以内路由正确性。系统交互多是回到第1层,会被成功校正。
  • 如何避免/兼容代码疏漏
    • 问题:接管&监听过程要求所有页面遵循一些编码约束,如何保证这些约束切实全面生效;万一有页面未遵循约束,能否依然保证健壮性
    • 处理1:编写并配置相应eslint规则,保证约束被切实遵循
    • 处理2:上一条中的校正机制,保证即使有代码疏漏,在10层内也会被校正;10层外可能会影响返回逻辑正确性,但一般不会造成页面功能问题。
  • 如何进行状态恢复
    • 问题:返回后逻辑层级大于等于10时,实际是在第10层重新载入目标页面;用户在前一页面的表单输入等状态信息并不会像系统返回一样正常保留
    • 处理:在合适的时机存储页面的data,返回时予以恢复

成本

  • 接入成本

    • 需要引入并配置路由模块
    • 需要检查并修改项目中所有页面跳转过程,统一使用模块封装的接口
    • 需要统一监听所有页面的onUnload函数
  • 维护成本
    • 新增页面跳转过程,需统一使用模块封装的接口
    • 新增页面onUnload函数需接入统一监听
  • 性能成本
    • 模块执行逻辑相对简单,内存开销相对较小,页面性能暂未发现明显损耗

收益

  • 无限层级

    • 避免复杂/循环访问导致页面无法打开
    • 可以放心地向用户提供适合的访问入口,不必过分担心路径限制
  • 完全的路由管控能力
    • 可以完全监控路由过程并实现或引入一些附加功能
    • 附加功能:实例覆盖自动恢复
      • 问题:wepy框架存在单实例问题,同一路径页面被打开两次时,其数据会相互影响,如:详情页A - 详情页B - 返回A,点击查看大图 - B的图片(而不是A的图片) 详见issue:两级页面为同一路由时,后者数据覆盖前者
      • 策略:返回时,若判断目标页面数据已被覆盖,则自动予以恢复
      • 引入:参见模块使用说明
    • 附加功能: 免并发
      • 问题:用户连续快速点击多个/多次按钮时,会一次性打开多个窗口,一则造成层级膨胀,二则影响浏览体验
      • 策略:第一次点击造成的跳转完成之前无视后续点击产生的跳转请求
      • 引入:参见模块使用说明
    • 附加功能:数据预先加载
      • 问题:小程序的page1跳转到page2,到page2的onLoad是存在一个300ms ~ 400ms的延时的,在page2的onLoad中才开始获取数据会浪费这个延时
      • 策略:在 page1 中预先拿取数据,然后在 page2 中直接使用数据;wepy框架对此有良好的实现,参见WePY 在小程序性能调优上做出的探究
      • 引入:参见模块使用说明

效果

无限层级路由方案已在 转转二手交易网 小程序中应用了很长一段时间,欢迎体验:

无限层级路由方案已被抽离封装成独立开源模块,欢迎直接使用:github.com/zhuanzhuanf…

转载于:https://juejin.im/post/5ba0ab98e51d450e6749406f

小程序无限层级路由方案相关推荐

  1. ZEGO即构科技携小程序连麦直播方案亮相GMIC

    4月26日,GMIC 2018 全球移动互联网大会在北京国家会议中心隆重开幕.作为全球规模最大.最具影响力的移动互联网行业会议,GMIC大会被认为是创新领域的窗口,见证了中国移动互联网十来年的高速发展 ...

  2. 解决微信小程序textarea层级太高遮挡其他组件的问题

    解决微信小程序textarea层级太高遮挡其他组件的问题 参考文章: (1)解决微信小程序textarea层级太高遮挡其他组件的问题 (2)https://www.cnblogs.com/pansid ...

  3. 即构推出小程序连麦直播方案,与iOSAndroid APP互通连麦!

    2017年12 月 26 日,微信小程序正式对外开放了实时音视频录制及播放能力.符合类目要求(见下方表格)的小程序自助开通后,可自建或使用云服务,实现单向和互动的音视频功能,如视频直播.互动直播.在线 ...

  4. 微信小程序echarts层级太高

    项目中因为需求,底部的tab导航栏是自己写的,在开发者工具中一切正常:但是在真机上页面滑动时,echarts的层级比tab高,调过两者的z-index后仍然如此. 经过查找后发现cover-view和 ...

  5. poi生成word不可以修改_操作不懂技术就可以做小程序无限生成平台的创业项目实操教程...

    小程序现在是个风口,很多人都涉足这个行业,不过大部分都是站在用户的角度去接触的小程序,作为创业者,我们有没有机会可以给别人做小程序呢?当然是可以的,今天我们就来操作这样一个小程序无限生成的项目,对于零 ...

  6. 微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由

    前言: 对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的.哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多. 这里就以另外一种方式来详细的介绍小程序的页面栈及路 ...

  7. 微信小程序组件、路由、组件通信、侦听器

    一.微信小程序组件 组件就是小程序页面的组成结构,与html在web网页开发中的作用一样,铺设页面.可以参考其他UI库,像elementUI,vantUI组件 组件是视图层的基本组成单元. 组件自带一 ...

  8. 微信小程序之九宫格布局方案

    2018转眼即将逝去了,由于近期在弄一个小程序的项目的原因,今天在这里记录一下小程序之九宫格布局方案,以备后期需要和相关知识温习. 对于整个小程序项目,原生开发小程序的方式这里就不多说了,官方有确切的 ...

  9. 微信小程序:全局路由登录拦截和分享参数过长的问题

    文档 微信小程序开发文档-获取不限制的小程序码 微信小程序没有提供路由拦截系统,我们可以自己通过应用首页作为入口,拦截所有页面 大致思路如下: 登录拦截 用户进入首页后,判断是否登录,或者执行其他全局 ...

最新文章

  1. Android 模仿微信启动动画
  2. 文档知多少---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十五)[转]...
  3. 老赖凭本事骗钱,你有本事不被骗吗?
  4. mysql8集群的优点_介绍 MySQL 8 中值得关注的新特性和改进。
  5. 你可能过于高估了机器学习算法能力,带你解读鲜为人知的数据泄露问题
  6. saltstack 基础入门文档
  7. 设计模式C++实现 —— 外观模式、组合模式
  8. 解决PCL 编译报错:undefined reference to `pcl::PCLBase<pcl::PointXYZRGBA>:: XXX
  9. 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)
  10. 电脑ps4,人在外心在家,教你用PC/MAC远程打PS4
  11. 【随机信号分析】实验(十三)窄带信号分析——随机信号的DSB分析
  12. 文件相似度比对工具的设计与实现
  13. 用Excel和OutLook实现自动批量发邮件
  14. maya中英文对比_Maya菜单中英文对照总汇
  15. 遍历文件夹将dicom文件转换为nifty文件
  16. BZOJ1135: [POI2009]Lyz
  17. Android微信抢红包功能的实现
  18. 【NOIP2017提高A组冲刺11.5】轰炸
  19. WORD如何设置打印? 三分钟学会WORD打印技巧
  20. 模拟ARP欺骗攻击与防护

热门文章

  1. CKeditor 配置使用
  2. BZOJ 3211 弗洛拉前往国家 树阵+并检查集合
  3. git生成public key
  4. 微服务架构的优势与不足(三)
  5. day15-JavaScript字符串操作以及跑马灯示例
  6. RotateAnimation详解
  7. iOS开发那些事-故事板实现标签导航
  8. Exchange对AD的访问
  9. [论文笔记]Web service composition using markov decision processes (WAIM 2005)
  10. “阿一web标准学堂”选修课:EditPlus高级使用技巧(附视频、课件、代码下载)...