小程序原生頁面存在層級限制,超過必定層數就會沒法打開新頁面。一開始這個限制爲不超過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