閱讀時間 約 8min. 關注最終方案請點擊目錄 => 方案輸出 (掘金老油條第一次發文, 但願獲得您的評論)前端
深鏈(深度連接, DeepLinking
) 在互聯網的語境中的含義是指: 使用超連接,連接到一個特定的、一般可搜索的或索引的網站內容 ( 例如: http://example.com/path/page
),而不是網站的主頁( 例如: http://example.com
).vue
深度連接方案在移動互聯網時代發光發熱, 有很是多的應用場景, 也已經養成了深入的用戶習慣.git
以下 GIF 是谷歌頁面狀態持久化到 URL 上的演示github
Deep linking - Wikipediavue-router
深度連接的起源與發展 (知乎介紹文章, 沒有深刻考究): Universal Link & Deep Linkvuex
在過去非單頁面應用的時代, 單個頁面可交互的操做很少, 頁面狀態的轉換基本要靠路由跳轉, 從新加載新頁面完成. 咱們能夠認爲頁面狀態和 url 是綁定關係.npm
而在單頁面應用時代, 單頁面應用的頁面狀態是隨時發生變化的, 但 URL 不是. URL 的狀態靠頁面邏輯進行維護.前端框架
在當下各類單頁面應用中, 前端 Router 方案就是一種深鏈方案的實現, 覆蓋了大部分應用的場景.app
然而有一個問題是 Router 組件沒有解決的問題, Router 的顆粒度仍是太粗糙了, 只能作到頁面組件的級別, 不能作到更精細的控制頁面的狀態持久化, 而且不能作到頁面狀態和 url 同步更新.框架
深度連接在單頁面應用語境下的含義必然要有一個更高層次的要求:
實際 Vue 項目開發過程當中, 咱們或多或少, 都接觸過相似的功能開發: 1. 經過跳轉到一個新的 url 改變頁面的狀態 (跳轉新路由, 很是廣泛的操做) 2. 從 url 獲取頁面的初始化狀態 (獲取單據號碼) 3. 監聽數據變化, 從將頁面狀態寫入 url (這個不常見, 但在有分享要求的頁面必然遇到)
我認識到這些特性就是深鏈方案的實現, 或者深鏈方案的子集實現. 所以但願對這部分邏輯進行抽象封裝. 當前基於 Vue 前端框架進行開發實現, 更快實現, 更契合團隊業務.
抽象邏輯 | 初始化 | 頁面狀態更新 | URL 更新 |
---|---|---|---|
文字描述 | 1. 以 URL 數據優先, 初始化 VM | 頁面狀態回寫 URL | 從 URL 同步數據到 VM |
2. 以 VM 的當前的數據校準 URL | |||
難點 | 1. 避免頁面狀態和 URL 循環更新 | ||
2. 在 url 上保持正確的數據類型 | |||
時序圖 |
![]() |
![]() |
![]() |
vue-route-sync-mixin 是基於 vue 和 vue-router 的深鏈方案實現, 它使用一種簡單直接的手段完成 URL 和 VM data 之間的 雙向綁定, 讓它們實時進行同步.
它看起來實在太棒了, 讓咱們實時同步頁面的狀態到 URL 上, 讓咱們能夠隨時分享關鍵詞 "teeeemoji" 的第四頁搜索結果給咱們的朋友.
vue-route-sync-mixin URL 與頁面狀態雙向綁定
已經有的稍微成型的方案 vuex-router-sync 略微有 vm data 和 url 的雙向綁定概念但僅僅完成了數據的初始化部分, 連 vm data 單向同步到 url 的操做都沒有完成.
目前並無更可靠的開源方案能夠對比, 所以僅僅選取vuex-router-sync 方案進行對比.
對比緯度 | vue-route-sync-mixin | vuex-router-sync |
---|---|---|
學習成本 | ︎✅ 開箱即用 | ❌ 須要學習 vuex 的 submodule |
外部依賴 | ✅vue+vue-router | ❌vue+vue-router+vuex |
代碼侵入性 | ✅不污染全局, 不污染 dom 節點 | ❌須要全局配置 |
可用性 | ✅ 有 demo, 文檔可用, 測試數據優秀 | ❌demo 不可用,文檔簡陋,無測試 |