日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

基于vue的移动web app页面缓存解决方案

發(fā)布時間:2025/7/14 vue 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于vue的移动web app页面缓存解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

  • 識別前進后退行為
  • 后退時恢復之前的頁面

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

識別前進后退

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

  • 沒有提供前進后退的事件
  • 不允許開發(fā)者讀取瀏覽記錄
  • 用戶可以手動輸入地址,或使用瀏覽器提供的前進后退來改變url

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

  • url存在于瀏覽記錄中即為后退
  • url不存在于瀏覽記錄中即為前進
  • url在瀏覽記錄的末端即為刷新

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

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

后退時恢復之前的頁面

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

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

另一種方案是將數(shù)據(jù)緩存到內(nèi)存中,開發(fā)者需要將頁面的數(shù)據(jù)存儲起來,當返回到該頁面時,再根據(jù)數(shù)據(jù)將頁面恢復。但是這樣每個頁面存儲的數(shù)據(jù)不通,一般需要進行額外的編碼,如果有一種更底層的方案能解決這個問題,并且對開發(fā)者是透明的,就最好了,所以嘗試并開發(fā)了vue-navigation。

在vue-navigation 0.x版本的時候,借助了vue的keep-alive來緩存頁面,但是keep-alive是根據(jù)組件的name或tag來決定緩存的,所以帶來了很多限制。

通過拜讀keep-alive的源碼,了解到它的緩存機制后,就自己實現(xiàn)了一個管理緩存的組件,來靈活地緩存子組件,實現(xiàn)思路如下:

  • 每次render時,先取到子組件的vnode(vue的虛擬dom)
  • 計算出vnode的key,把key值賦給vnode避免vue-router復用組件實例
  • 根據(jù)key值判斷該節(jié)點是否已緩存

    • 已緩存:將緩存的實例賦給componentInstance,這樣vue就會根據(jù)這個實例來恢復組件
    • 未緩存:將vnode存儲到內(nèi)存中,下次返回到該頁面時可以從內(nèi)存中恢復

另外還需要添加一個清除緩存的邏輯,當自己維護的瀏覽記錄變化時,根據(jù)瀏覽記錄清除不需要的緩存(例如當前的路由是:A->B->C,用戶從C直接返回到了A,那么B和C都需要從緩存中刪除)。

最后

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

還是安利一下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}) // 啟動你的應(yīng)用...

App.vue

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

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

總結(jié)

以上是生活随笔為你收集整理的基于vue的移动web app页面缓存解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。