最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端常見的數(shù)據(jù)緩存方案及其實現(xiàn)細(xì)節(jié)

 更新時間:2025年07月09日 09:47:31   作者:Heidi__  
緩存機制隨處可見,優(yōu)秀的緩存機制可以縮短網(wǎng)頁請求資源的事件,減少延遲,這篇文章主要介紹了前端常見的數(shù)據(jù)緩存方案及其實現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

前端數(shù)據(jù)緩存機制是提升應(yīng)用性能、減少網(wǎng)絡(luò)請求、優(yōu)化用戶體驗的關(guān)鍵技術(shù)手段。以下是前端常見的數(shù)據(jù)緩存方案及其實現(xiàn)細(xì)節(jié),涵蓋瀏覽器緩存、本地存儲、內(nèi)存緩存等多種策略:

1. 瀏覽器緩存(HTTP 緩存)

通過 HTTP 協(xié)議頭控制緩存,適用于靜態(tài)資源(如 JS、CSS、圖片)和接口響應(yīng)。

1.1 強緩存

  • 原理:瀏覽器直接使用本地緩存,不向服務(wù)器發(fā)送請求。
  • 實現(xiàn)方式
    Cache-Control: max-age=3600  # 資源有效期 1 小時(優(yōu)先級高)
    Expires: Wed, 21 Oct 2024 07:28:00 GMT  # 過期時間(HTTP/1.0)
    

1.2 協(xié)商緩存

  • 原理:瀏覽器攜帶緩存標(biāo)識詢問服務(wù)器資源是否更新。
  • 實現(xiàn)方式
    # 服務(wù)器返回標(biāo)識
    ETag: "33a64df551425fcc55e4d42a148795d9"
    Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT
    
    # 瀏覽器請求時攜帶標(biāo)識
    If-None-Match: "33a64df551425fcc55e4d42a148795d9"
    If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT
    

2. Web Storage

適用于存儲結(jié)構(gòu)化數(shù)據(jù),容量約 5~10MB,分為 localStoragesessionStorage。

2.1 基本使用

// 存儲數(shù)據(jù)(注意:只能存字符串)
localStorage.setItem('user', JSON.stringify({ name: 'Alice' }));

// 讀取數(shù)據(jù)
const user = JSON.parse(localStorage.getItem('user'));

// 刪除數(shù)據(jù)
localStorage.removeItem('user');

2.2 緩存策略示例

async function fetchWithCache(url, cacheKey, ttl = 3600) {
  const cachedData = localStorage.getItem(cacheKey);
  if (cachedData) {
    const { data, timestamp } = JSON.parse(cachedData);
    if (Date.now() - timestamp < ttl * 1000) {
      return data; // 返回有效緩存
    }
  }
  const response = await fetch(url);
  const newData = await response.json();
  localStorage.setItem(cacheKey, JSON.stringify({
    data: newData,
    timestamp: Date.now()
  }));
  return newData;
}

3. IndexedDB

適用于存儲大量結(jié)構(gòu)化數(shù)據(jù)(支持索引、事務(wù)),容量可達數(shù)百 MB。

3.1 基本操作

// 打開數(shù)據(jù)庫
const request = indexedDB.open('myDB', 1);

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  const store = db.createObjectStore('apiCache', { keyPath: 'url' });
  store.createIndex('timestamp', 'timestamp', { unique: false });
};

// 存儲數(shù)據(jù)
function saveToIndexedDB(url, data) {
  const transaction = db.transaction('apiCache', 'readwrite');
  const store = transaction.objectStore('apiCache');
  store.put({ url, data, timestamp: Date.now() });
}

// 查詢數(shù)據(jù)
async function getFromIndexedDB(url) {
  return new Promise((resolve) => {
    const transaction = db.transaction('apiCache', 'readonly');
    const store = transaction.objectStore('apiCache');
    const request = store.get(url);
    request.onsuccess = (e) => resolve(e.target.result?.data);
  });
}

4. 內(nèi)存緩存

適用于單頁應(yīng)用(SPA)中短期數(shù)據(jù)緩存,隨頁面刷新失效。

4.1 全局變量緩存

const memoryCache = new Map();

async function fetchWithMemoryCache(url) {
  if (memoryCache.has(url)) {
    return memoryCache.get(url);
  }
  const response = await fetch(url);
  const data = await response.json();
  memoryCache.set(url, data);
  return data;
}

4.2 LRU 緩存策略

class LRUCache {
  constructor(maxSize = 100) {
    this.cache = new Map();
    this.maxSize = maxSize;
  }

  get(key) {
    if (!this.cache.has(key)) return null;
    const value = this.cache.get(key);
    this.cache.delete(key);
    this.cache.set(key, value);
    return value;
  }

  set(key, value) {
    if (this.cache.size >= this.maxSize) {
      const oldestKey = this.cache.keys().next().value;
      this.cache.delete(oldestKey);
    }
    this.cache.set(key, value);
  }
}

5. Service Worker 緩存

實現(xiàn)離線緩存和網(wǎng)絡(luò)請求攔截,適合 PWA 應(yīng)用。

5.1 緩存接口數(shù)據(jù)

// sw.js
self.addEventListener('fetch', (event) => {
  if (event.request.url.includes('/api/')) {
    event.respondWith(
      caches.match(event.request).then((cachedResponse) => {
        return cachedResponse || fetch(event.request).then((response) => {
          const clone = response.clone();
          caches.open('api-cache-v1').then((cache) => {
            cache.put(event.request, clone);
          });
          return response;
        });
      })
    );
  }
});

6. 現(xiàn)代框架緩存方案

6.1 React Query

import { useQuery } from 'react-query';

function UserProfile() {
  const { data } = useQuery('userData', () =>
    fetch('/api/user').then(res => res.json()), {
      staleTime: 5 * 60 * 1000, // 5分鐘緩存有效期
      cacheTime: 30 * 60 * 1000 // 30分鐘保留時間
    });
  // ...
}

6.2 SWR (Stale-While-Revalidate)

import useSWR from 'swr';

function Profile() {
  const { data } = useSWR('/api/user', fetcher, {
    revalidateOnFocus: false, // 窗口聚焦時不刷新
    dedupingInterval: 60000   // 60秒內(nèi)相同請求去重
  });
  // ...
}

7. 緩存策略關(guān)鍵問題處理

7.1 緩存失效

  • 時間戳失效:存儲數(shù)據(jù)時記錄時間戳,定期檢查過期
  • 版本號控制:緩存鍵名包含版本號(如 user-v2
  • 主動清除:當(dāng)數(shù)據(jù)變更時觸發(fā)緩存更新

7.2 緩存一致性

  • 數(shù)據(jù)更新廣播:通過 WebSocket 或 EventSource 通知前端更新緩存
  • 手動刷新機制:提供用戶手動刷新按鈕(如 pull-to-refresh

7.3 敏感數(shù)據(jù)處理

  • 避免緩存隱私數(shù)據(jù)(如 token、密碼)
  • 使用 sessionStorage 替代 localStorage 存儲會話數(shù)據(jù)

緩存方案選型建議

場景推薦方案容量有效期
靜態(tài)資源HTTP 強緩存無上限長期
低頻變動的接口數(shù)據(jù)localStorage5~10MB自定義
大量結(jié)構(gòu)化數(shù)據(jù)IndexedDB數(shù)百MB長期
實時性要求高的數(shù)據(jù)內(nèi)存緩存內(nèi)存限制頁面會話
離線優(yōu)先應(yīng)用Service Worker50~250MB自定義

最佳實踐

  1. 分層緩存:結(jié)合 HTTP 緩存 + 內(nèi)存緩存 + 持久化存儲
  2. 緩存降級:優(yōu)先從內(nèi)存讀取,其次本地存儲,最后網(wǎng)絡(luò)請求
  3. 監(jiān)控指標(biāo):跟蹤緩存命中率、存儲使用量、數(shù)據(jù)新鮮度
  4. 安全清理:定時清理過期緩存,避免存儲空間溢出

通過合理設(shè)計緩存機制,可顯著提升前端性能,但在實際應(yīng)用中需平衡以下關(guān)系:
? 新鮮度 vs 性能
? 存儲空間 vs 用戶體驗
? 開發(fā)成本 vs 維護成本

到此這篇關(guān)于前端常見的數(shù)據(jù)緩存方案及其實現(xiàn)細(xì)節(jié)的文章就介紹到這了,更多相關(guān)前端數(shù)據(jù)緩存機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序復(fù)選框組件使用詳解

    微信小程序復(fù)選框組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序復(fù)選框組件使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS查找字符串中出現(xiàn)最多的字符及個數(shù)統(tǒng)計

    JS查找字符串中出現(xiàn)最多的字符及個數(shù)統(tǒng)計

    最近在項目中遇到這樣的需求:求字符串'nininihaoa'中出現(xiàn)次數(shù)最多字符。怎么實現(xiàn)呢?下面小編給大家分享具體實現(xiàn)代碼,需要的朋友參考下吧
    2017-02-02
  • JS獲取年月日時分秒的方法分析

    JS獲取年月日時分秒的方法分析

    這篇文章主要介紹了JS獲取年月日時分秒的方法,結(jié)合實例形式分析了JS獲取具體時間的常犯錯誤與相應(yīng)解決方法,需要的朋友可以參考下
    2016-11-11
  • Taro集成Redux快速上手的方法示例

    Taro集成Redux快速上手的方法示例

    這篇文章主要介紹了Taro集成Redux快速上手的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • JavaScript中this詳解

    JavaScript中this詳解

    this是javascript的一個關(guān)鍵字,隨著函數(shù)使用場合不同,this的值會發(fā)生變化。但是總有一個原則,那就是this指的是調(diào)用函數(shù)的那個對象。
    2015-09-09
  • js和jquery實現(xiàn)監(jiān)聽鍵盤事件示例代碼

    js和jquery實現(xiàn)監(jiān)聽鍵盤事件示例代碼

    這篇文章主要為大家介紹了js實現(xiàn)監(jiān)聽鍵盤事件示例代碼,監(jiān)聽鍵盤組合鍵CTRL+C,以便做出對應(yīng)的響應(yīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • js substr、substring和slice使用說明小記

    js substr、substring和slice使用說明小記

    關(guān)于substr、substring和slice方法區(qū)別的文章,網(wǎng)上搜到了許多,文章內(nèi)容也基本一致。而后,我將其中一篇文章中的代碼挪到本地進行了測試,發(fā)現(xiàn)測試結(jié)果和原文中的有些出入。
    2011-09-09
  • js實現(xiàn)對table動態(tài)添加、刪除和更新的方法

    js實現(xiàn)對table動態(tài)添加、刪除和更新的方法

    這篇文章主要介紹了js實現(xiàn)對table動態(tài)添加、刪除和更新的方法,涉及javascript針對html中table表格節(jié)點的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • HTML5附件拖拽上傳drop & google.gears實現(xiàn)代碼

    HTML5附件拖拽上傳drop & google.gears實現(xiàn)代碼

    從gmail 的附件拖拽上傳,到網(wǎng)易郵箱的拖拽上傳,我們看到了html 5 為我們帶來了新的web體驗。
    2011-04-04
  • js實現(xiàn)旋轉(zhuǎn)木馬輪播圖效果

    js實現(xiàn)旋轉(zhuǎn)木馬輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)旋轉(zhuǎn)木馬輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評論

宝丰县| 安仁县| 千阳县| 左权县| 武强县| 柞水县| 石嘴山市| 福州市| 大英县| 镇宁| 绥芬河市| 石屏县| 马尔康县| 义乌市| 潮州市| 图木舒克市| 高碑店市| 多伦县| 定西市| 长兴县| 吉林市| 南郑县| 阜康市| 独山县| 白朗县| 哈密市| 绥阳县| 金阳县| 宁强县| 青神县| 漠河县| 江安县| 兰溪市| 旺苍县| 成都市| 东光县| 长汀县| 潞城市| 慈溪市| 化州市| 文山县|