首頁  >  文章  >  web前端  >  解決vue行動web app頁面緩存

解決vue行動web app頁面緩存

巴扎黑
巴扎黑原創
2018-05-24 15:49:042260瀏覽

這篇文章主要介紹了詳解基於vue的行動web app頁面快取解決方案,非常具有實用價值,需要的朋友可以參考下

現在行動web app越來越熱門了,許多公司開始嘗試使用angular、react、vue等MVVM框架來開發單頁架構的web app。但在開發web app時,如果希望頁面的導航體驗也接近原生應用,那麼一般都會遇到這兩個問題:

  • 識別前進後退行為

  • #後退時恢復之前的頁面

筆者開發了一個基於vue與vue-router的導航庫vue-navigation,來幫助開發者來解決這些問題,下面是問題的解決思路。

辨識前進後退

先說第一個問題。和原生app不一樣,瀏覽器中主要有這幾個限制:

  • 沒有提供前進後退的事件

  • 不允許開發者讀取瀏覽記錄

  • 使用者可以手動輸入地址,或使用瀏覽器提供的前進後退來改變url

解決方案是自行維護一份瀏覽記錄,每次url改變時,透過與記錄的瀏覽記錄作對比,從而判斷出前進後退行為:

  • url存在於瀏覽記錄中即為後退

  • url不存在於瀏覽記錄中即為前進

  • #url在瀏覽記錄的末端即為刷新

#另外,應用的路由路徑中可能允許相同的路由出現多次(例如A->B->A),所以給每個路由添加一個key值來區分相同路由的不同實例。

這個瀏覽記錄需要儲存在sessionStorage中,這樣使用者刷新後瀏覽記錄也可以恢復。

後退時恢復先前的頁面

識別出後退行為後,下一步就是像原生一樣恢復之前的頁面了。

一種方案是頁面繼續儲存在DOM中,加入樣式display: none來告訴瀏覽器不渲染該元素,但是快取的頁面多了DOM就會變得很大,會影響頁面的效能,本文不討論這個方案。

另一種方案是將資料快取到記憶體中,開發者需要將頁面的資料儲存起來,當返回到該頁面時,再根據資料將頁面恢復。但是這樣每個頁面儲存的資料不通,一般需要進行額外的編碼,如果有一種更底層的方案能解決這個問題,並且對開發者是透明的,就最好了,所以嘗試並開發了vue-navigation 。

在vue-navigation 0.x版本的時候,借助了vue的keep-alive來快取頁面,但是keep-alive是根據元件的name或tag來決定快取的,所以帶來了很多限制。

透過拜讀keep-alive的源碼,了解到它的快取機制後,就自己實作了一個管理快取的元件,來靈活地快取子元件,實現想法如下:

  1. 每次render時,先取到子元件的vnode(vue的虛擬dom)

  2. 計算vnode的key,把key值賦給vnode避免vue-router重複使用元件實例

  3. 根據key值判斷該節點是否已快取

    1. #已快取:將快取的實例賦給componentInstance ,這樣vue就會根據這個實例來恢復元件

    2. 未快取:將vnode儲存到記憶體中,下次回傳到該頁面時可以從記憶體中恢復

另外還需要加入一個清除快取的邏輯,當自己維護的瀏覽記錄變更時,根據瀏覽記錄清除不需要的快取(例如當前的路由是:A->B- >C,使用者從C直接回到了A,那麼B和C都需要從快取中刪除)。

最後

雖然是基於vue來開發的,但是思路是不變的,使用其他框架也可以做到同樣的事情。

還是安麗一下vue和vue-navigation。使用外掛後,再將router-view放在navigation下就有快取功能了。

main.js

import Vue from 'vue'
import router from './router' // vue-router 实例
import Navigation from 'vue-navigation'
Vue.use(Navigation, {router})
// 启动你的应用...

App.vue

<template>
 <navigation>
  <router-view></router-view>
 </navigation>
</template>

最後歡迎大家討論或提供更好的解決方案。

以上是解決vue行動web app頁面緩存的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn