前端緩存策略及其應(yīng)用場(chǎng)景詳解
前端緩存是提升網(wǎng)站性能和用戶體驗(yàn)的關(guān)鍵技術(shù),主要分為 瀏覽器緩存、應(yīng)用層緩存、CDN緩存、內(nèi)存緩存。以下是常見(jiàn)策略及其應(yīng)用場(chǎng)景:
一、瀏覽器緩存(HTTP 緩存)
1. 強(qiáng)緩存(Cache-Control/Expires)
- 原理:直接使用本地緩存,無(wú)需請(qǐng)求服務(wù)器。
- 控制頭:
Cache-Control: max-age=3600
(優(yōu)先)Expires: Wed, 21 Oct 2025 07:28:00 GMT
(舊版,受本地時(shí)間影響)
- 適用場(chǎng)景:靜態(tài)資源(如 JS、CSS、圖片)。
- 示例配置(Nginx):
location ~* \.(js|css|png|jpg|gif|svg)$ { expires 7d; # 緩存 7 天 add_header Cache-Control "public"; }
2. 協(xié)商緩存(ETag/Last-Modified)
- 原理:發(fā)送請(qǐng)求到服務(wù)器驗(yàn)證緩存是否可用,若未修改則返回 304。
- 控制頭:
ETag: "123456789"
(文件哈希值)Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
(文件修改時(shí)間)
- 適用場(chǎng)景:可能變化但需精確控制的資源(如用戶頭像)。
- 示例代碼(Node.js):
const http = require('http'); const fs = require('fs'); const crypto = require('crypto'); http.createServer((req, res) => { fs.readFile('index.html', (err, data) => { const hash = crypto.createHash('md5').update(data).digest('hex'); if (req.headers['if-none-match'] === hash) { res.statusCode = 304; return res.end(); } res.setHeader('ETag', hash); res.end(data); }); }).listen(3000);
二、應(yīng)用層緩存
1. LocalStorage/SessionStorage
- 特點(diǎn):
- 存儲(chǔ)大?。?-10MB(不同瀏覽器)。
- 數(shù)據(jù)類(lèi)型:字符串(需 JSON 序列化)。
- 有效期:
localStorage
永久,sessionStorage
會(huì)話結(jié)束清除。
- 適用場(chǎng)景:用戶偏好設(shè)置、臨時(shí)數(shù)據(jù)(如購(gòu)物車(chē))。
- 示例代碼:
// 存儲(chǔ) localStorage.setItem('user', JSON.stringify({ name: 'John', age: 30 })); // 讀取 const user = JSON.parse(localStorage.getItem('user'));
2. IndexedDB
- 特點(diǎn):
- 存儲(chǔ)大?。簾o(wú)明確限制(受硬盤(pán)空間約束)。
- 支持事務(wù)和索引,適合存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。
- 異步 API,避免阻塞主線程。
- 適用場(chǎng)景:大量數(shù)據(jù)緩存(如離線地圖、郵件客戶端)。
- 示例代碼:
const request = indexedDB.open('myDatabase', 1); request.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction(['users'], 'readwrite'); const store = transaction.objectStore('users'); store.put({ id: 1, name: 'John' }); };
3. Service Worker
- 特點(diǎn):
- 運(yùn)行在瀏覽器后臺(tái)的獨(dú)立線程。
- 攔截網(wǎng)絡(luò)請(qǐng)求,實(shí)現(xiàn)離線緩存和推送通知。
- 適用場(chǎng)景:離線應(yīng)用(如 PWA)、靜態(tài)資源預(yù)緩存。
- 示例代碼(注冊(cè) Service Worker):
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(registration => { console.log('Service Worker 注冊(cè)成功'); }); }
// service-worker.js self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request) .then(cachedResponse => cachedResponse || fetch(event.request)) ); });
三、CDN 緩存
- 原理:內(nèi)容分發(fā)網(wǎng)絡(luò)在全球多個(gè)節(jié)點(diǎn)緩存資源,用戶就近訪問(wèn)。
- 優(yōu)勢(shì):
- 加速靜態(tài)資源加載(如 JS 庫(kù)、圖片)。
- 減輕源服務(wù)器壓力。
- 示例配置(使用 UNPKG CDN):
<script src="https://unpkg.com/react@18.2.0/umd/react.production.min.js"></script>
四、內(nèi)存緩存(Runtime Cache)
- 特點(diǎn):
- 存儲(chǔ)在 JS 變量中,讀取速度極快。
- 頁(yè)面刷新后失效。
- 適用場(chǎng)景:高頻訪問(wèn)數(shù)據(jù)(如用戶信息)。
- 示例代碼:
const cache = new Map(); function getData(key) { if (cache.has(key)) { return cache.get(key); } const data = fetchDataFromServer(key); cache.set(key, data); return data; }
五、緩存策略選擇指南
場(chǎng)景 | 推薦緩存方案 |
---|---|
靜態(tài)資源(JS/CSS/ 圖片) | HTTP 強(qiáng)緩存 + CDN |
動(dòng)態(tài)數(shù)據(jù)(如 API 響應(yīng)) | 協(xié)商緩存 + LocalStorage |
離線應(yīng)用 | Service Worker + IndexedDB |
高頻數(shù)據(jù)訪問(wèn) | 內(nèi)存緩存(如 Map 對(duì)象)、vuex、pina |
用戶會(huì)話信息 | SessionStorage |
總結(jié)
到此這篇關(guān)于前端緩存策略及其應(yīng)用場(chǎng)景詳解的文章就介紹到這了,更多相關(guān)前端緩存策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
9個(gè)JavaScript評(píng)級(jí)/投票插件
在訪問(wèn)某個(gè)網(wǎng)站或者博客時(shí),如果該站點(diǎn)為用戶提供內(nèi)容的評(píng)級(jí)或投票功能的話,可以增強(qiáng)用戶參與的交互性之外,更可以給用戶一種“主人”的親切感,使得用戶可以切實(shí)地參與到網(wǎng)站內(nèi)容的評(píng)價(jià)體系中來(lái)。2010-01-01JavaScript隊(duì)列結(jié)構(gòu)Queue實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了JavaScript隊(duì)列結(jié)構(gòu)Queue實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03JavaScript單線程和任務(wù)隊(duì)列原理解析
這篇文章主要介紹了JavaScript單線程和任務(wù)隊(duì)列原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02js實(shí)現(xiàn)根據(jù)身份證號(hào)自動(dòng)生成出生日期
這篇文章主要介紹了js實(shí)現(xiàn)根據(jù)身份證號(hào)自動(dòng)生成出生日期,需要的朋友可以參考下2015-12-12IScroll5實(shí)現(xiàn)下拉刷新上拉加載的功能實(shí)例
本篇文章主要介紹了IScroll5實(shí)現(xiàn)下拉刷新上拉加載的功能實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08深入理解JavaScript創(chuàng)建對(duì)象的多種方式以及優(yōu)缺點(diǎn)
本篇文章主要介紹了JavaScript創(chuàng)建對(duì)象的多種方式以及優(yōu)缺點(diǎn),主要介紹了5種方式,有興趣的可以了解下2017-06-06基于javascript html5實(shí)現(xiàn)3D翻書(shū)特效
這篇文章主要介紹了基于javascript html5實(shí)現(xiàn)翻書(shū)特效的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03js隱藏與顯示回到頂部按鈕及window.onscroll事件應(yīng)用
現(xiàn)在大多數(shù)網(wǎng)站都會(huì)添加這種功能:當(dāng)滾動(dòng)條滾動(dòng)到頁(yè)面的下方時(shí),頁(yè)面的右下角會(huì)顯示出來(lái)一個(gè)“回到頂部”的按鈕或連接;那么,如何控制“回到頂部”按鈕的顯示或隱藏呢;本文介紹詳細(xì)實(shí)現(xiàn)方法,感興趣的你可不要走開(kāi)哦2013-01-01