小程序无限层级路由方案

小程序无限层级路由方案

小程序原生页面存在层级限制,超过一定层数就会无法打开新页面。一开始这个限制为不超过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

实现

 

主要难点及实现方案:

  • 如何接管路由过程

    • 要求所有页面不使用<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 在小程序性能调优上做出的探究](https://segmentfault.com/a/1190000008975448?winzoom=1) 
    - 引入:参见模块使用说明
    

效果

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

【小程序源码网资源版权风险说明】:
本站为避免不必要的纷争,分享的所有资源中一切可能有版权风险的资源将全部转载自第三方网站或平台,站长只为大家提供相关资源的介绍和跳转引导。 因可能有疏忽大意,所以如有遗漏资源侵犯了您的合法权利,请联系站长删除。
【小程序源码网资源下载使用说明】:
本站所分享的一切QQ小程序源码,thinkphp整站源码,微信小程序源码,图文教程等资源仅供用户学习参考使用,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网毫无人看的介绍】:
本站又称Z站,原名贼娘网,开站于2018年,换过三任站长,目前站长是第四任站长,本站是一个主要分享免费开源小程序源码/网站源码/免费素材/教程资源的网站,主要小程序资源有用于学习的小程序源码,也有正版原创可商用的小程序源码,是一个公益博客型网站。
【小程序源码网原创源码版权申明】:
未经小程序源码网许可,任何人不得擅自使用本站原创首发源码进行商业行为(除本站VIP用户在期限内,版权无使用限制),否则将依法承担相应赔偿责任。
【小程序源码网转载文章版权申明】:
本站所转载的QQ小程序或微信小程序源码与其他资源仅供学习,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网站长最后的屁话】:
如有您认为本站有任何侵犯您合法权益的文章,或者您有什么疑问需求,欢迎联系站长QQ,站长24小时在线,备注公司名称和源码版权问题或者需要小程序定制开发等站长业务类型可急速处理,如果您只是交流小程序的一些开发问题或源码问题可以加入QQ群讨论,就不用加站长啦,对于白嫖党,QQ群才是处理问题的天堂,当然站长也欢迎大家骚扰~
小程序源码网 » 小程序无限层级路由方案
嘿,投喂下嘛!