小程序原生页面存在层级限制,超过必定层数就会没法打开新页面。一开始这个限制为不超过5层,目前是不超过10层。 git
这个限制对于体量较大的小程序来讲,挺难受的。特别是只能打开5层那会儿,业务流程很容易一不当心就超了,好比:首页-搜索结果页-商品详情页-聊天页-下单页-地址选择页-...;更有访问回路防不胜防,好比:商品详情页-查看更多页-商品详情页-查看更多页-...、商品详情页-聊天页-我的主页-商品详情页-聊天页-我的主页-商品详情页-...、诸如此类。即便后来放宽至了10层,仍是很容易遭遇层级溢出。 github
一种处理思路是调整交互路径,严格控制层级数量。可是这种处理方案,一则不少时候会牺牲用户体验,好比为避免我的主页和商品详情页的访问回路,要么不能在我的主页中访问用户商品,要么不能在商品详情页中访问卖家主页,要么访问时须要替换当前不能返回继续浏览,无论怎么取舍都会牺牲某些用户的浏览诉求;二则维护成本特别高,业务逻辑愈来愈复杂,交互路径愈来愈发散,路径的统一梳理和规划就会愈来愈困难,并且管理过程对业务不透明,业务方在设计需求时要受到交互路径的种种限制,甚至一个需求的交互调整极可能无心中形成另外一个需求层级溢出,维护成本高且不断膨胀。小程序
于是本文考虑并实现了另外一种处理思路:在小程序中支持不限层级的路由过程。segmentfault
逻辑层级 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
转转 实现了上述策略,并提供开源使用,地址:https://github.com/zhuanzhuanfe/fancy-mini,欢迎使用或参阅。 并发
主要难点及实现方案:框架
如何接管路由过程函数
如何监听返回行为性能
如何兼容系统交互编码
如何避免/兼容代码疏漏spa
如何进行状态恢复
接入成本
维护成本
性能成本
无限层级
彻底的路由管控能力
附加功能:实例覆盖自动恢复
详见issue:[两级页面为同一路由时,后者数据覆盖前者](https://github.com/Tencent/wepy/issues/322) - 策略:返回时,若判断目标页面数据已被覆盖,则自动予以恢复 - 引入:参见模块使用说明
附加功能: 免并发
- 问题:用户连续快速点击多个/屡次按钮时,会一次性打开多个窗口,一则形成层级膨胀,二则影响浏览体验 - 策略:第一次点击形成的跳转完成以前无视后续点击产生的跳转请求 - 引入:参见模块使用说明
附加功能:数据预先加载
- 问题:小程序的page1跳转到page2,到page2的onLoad是存在一个300ms ~ 400ms的延时的,在page2的onLoad中才开始获取数据会浪费这个延时 - 策略:在 page1 中预先拿取数据,而后在 page2 中直接使用数据;wepy框架对此有良好的实现,参见[WePY 在小程序性能调优上作出的探究](https://segmentfault.com/a/1190000008975448?winzoom=1) - 引入:参见模块使用说明
无限层级路由方案已在 转转二手交易网 小程序中应用了很长一段时间,欢迎体验:
无限层级路由方案已被抽离封装成独立开源模块,欢迎直接使用:https://github.com/zhuanzhuanfe/fancy-mini