JavaScript 的請求快取主要發生在以下幾個地方:
1. 瀏覽器快取: 這是最常見的快取處理位置。瀏覽器會根據 HTTP 響應頭中的快取指令(例如 Cache-Control
,Expires
,Pragma
等)決定是否快取請求結果。如果瀏覽器判斷可以快取,下次相同的請求就會直接從快取中讀取,而不會傳送實際的網路請求。
- Cache-Control: 最常用的快取指令,可以控制快取的各種行為,例如
max-age
(快取有效時間)、public
(可以被任何快取儲存)、private
(只能被瀏覽器快取)、no-cache
(需要驗證快取)、no-store
(不快取)等。 - Expires: 指定快取的過期時間,是一個絕對時間點。但由於客戶端時間可能不準確,
Cache-Control: max-age
更常用。 - Pragma: 主要用於 HTTP/1.0,
Pragma: no-cache
等效於Cache-Control: no-cache
。
2. Service Worker: Service Worker 是一個執行在瀏覽器後臺的指令碼,可以攔截網路請求,並實現自定義的快取邏輯。它可以實現更靈活的快取策略,例如離線快取、快取優先等。 透過 Service Worker API,開發者可以完全控制快取的行為,例如:
caches.open(cacheName).then(cache => cache.add(request))
: 快取請求caches.match(request)
: 查詢快取
3. CDN 快取: CDN(內容分發網路)會快取靜態資源(例如圖片、JS 檔案、CSS 檔案等),並將這些資源快取在離使用者更近的伺服器上,從而加快訪問速度。CDN 的快取機制與瀏覽器快取類似,也是根據 HTTP 響應頭中的快取指令進行控制。
4. 應用層快取: 在一些情況下,前端應用本身也可以實現快取機制。例如,可以使用 JavaScript 變數或 Local Storage 來儲存一些請求結果,避免重複請求。 不過,應用層快取通常用於快取一些不經常變化的資料,例如配置資訊等。
5. 代理伺服器快取: 代理伺服器也可以快取請求結果,與 CDN 類似,可以減少伺服器負載並提高訪問速度。
如何控制快取:
前端開發者可以透過以下方式控制快取行為:
- 設定 HTTP 響應頭: 這是最常用的方式,透過伺服器端設定
Cache-Control
等響應頭來控制瀏覽器和 CDN 的快取行為。 - 使用 Service Worker: 實現更靈活的快取策略,例如離線快取、快取優先等。
- 在請求 URL 中新增查詢引數: 透過在 URL 中新增時間戳或版本號等引數,可以強制瀏覽器重新請求資源,避免使用快取。 例如:
https://example.com/style.css?v=1.0.0
- 清除瀏覽器快取: 使用者可以透過瀏覽器設定清除快取。
總結:
瞭解不同層級的快取機制對於前端開發者至關重要,可以幫助我們最佳化網站效能,提高使用者體驗。 選擇合適的快取策略需要根據具體場景進行考慮,例如資料的更新頻率、資料的重要性等。