面試官:Cache-Control 等緩存機制一般是前端配置還是后端配置?
回答思路:
- 靜態(tài)資源緩存(Cache-Control、ETag、Last-Modified) 通常是后端(或 CDN)配置的,因為 HTTP 頭部是由服務(wù)器返回的,前端無法直接修改服務(wù)器響應(yīng)頭。
- 前端可以通過 <meta> 標(biāo)簽、Service Worker 以及 Web Storage(如 localStorage)對部分資源進行緩存控制,但對于 HTTP 級別的緩存,通常依賴后端或 CDN。
1. Cache-Control 配置(通常由后端或 CDN 設(shè)置)
Cache-Control 頭部用于控制瀏覽器和 CDN 的緩存行為,前端無法直接修改 HTTP 頭部,而是由后端服務(wù)器(如 Nginx、Apache、Node.js)或 CDN 進行配置。
location /static/ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}
- public:允許任何人(包括 CDN)緩存資源。
- max-age=31536000(1年):靜態(tài)資源緩存 1 年,避免重復(fù)請求。
- immutable:表示該資源不會改變,即使用戶刷新頁面也不會重新請求。
2. ETag 和 Last-Modified(后端控制)
這兩個 HTTP 頭用于判斷資源是否發(fā)生變化,以避免不必要的下載:
- ETag(實體標(biāo)簽): 服務(wù)器給資源生成一個唯一的標(biāo)識符(哈希值),如果內(nèi)容未變,返回 304 Not Modified。
- Last-Modified(最后修改時間): 瀏覽器請求時帶上 If-Modified-Since 頭,如果資源沒有更新,服務(wù)器返回 304。
Nginx 服務(wù)器啟用 ETag 和 Last-Modified(默認(rèn)開啟):
location /images/ {
expires 30d;
etag on;
add_header Last-Modified $date_gmt;
}
3. 前端可以做的緩存優(yōu)化
雖然 HTTP 緩存通常由 后端/CDN 負(fù)責(zé),但前端也可以通過一些方式優(yōu)化緩存:
(1) meta 頭部(限制頁面緩存)
前端可以用 <meta> 標(biāo)簽來控制頁面緩存,例如:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
- no-cache:瀏覽器必須向服務(wù)器驗證資源是否過期(但仍可用 ETag 和 Last-Modified)。
- no-store:瀏覽器不會緩存該資源,每次都重新下載。
- must-revalidate:如果緩存過期,必須重新請求。
(2) 使用 Service Worker(前端緩存資源)
前端可以使用 Service Worker 在 Cache Storage 里緩存 API 數(shù)據(jù)或靜態(tài)資源,實現(xiàn)離線訪問:
self.addEventListener("fetch", event => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request);
})
);
});
(3) 利用 LocalStorage 存儲 API 數(shù)據(jù)
如果是 API 數(shù)據(jù),前端可以用 localStorage 進行緩存:
const data = localStorage.getItem("userData");
if (data) {
console.log("從緩存加載數(shù)據(jù)", JSON.parse(data));
} else {
fetch("/api/user")
.then(res => res.json())
.then(data => {
localStorage.setItem("userData", JSON.stringify(data));
});
}
4. 一般是前端還是后端配置?
優(yōu)化方案 | 前端負(fù)責(zé) | 后端/CDN 負(fù)責(zé) |
| ? | ? 服務(wù)器/CDN 配置 |
/ | ? | ? 服務(wù)器生成哈?;驎r間戳 |
標(biāo)簽緩存控制 | ? | ? |
Service Worker | ? | ? |
LocalStorage 緩存 | ? | ? |
5. 面試官最佳回答
Cache-Control、ETag 和 Last-Modified 等 HTTP 緩存機制通常由后端服務(wù)器或 CDN 配置,因為它們是 HTTP 頭的一部分,前端無法直接修改服務(wù)器響應(yīng)。但前端可以通過 <meta> 頭、Service Worker 和 LocalStorage 來優(yōu)化緩存,比如攔截請求、緩存 API 數(shù)據(jù)或控制頁面緩存策略。
在實際項目中,我們通常讓 CDN 或后端設(shè)置 Cache-Control: max-age=31536000, immutable 來緩存靜態(tài)資源,同時用 ETag / Last-Modified 讓瀏覽器避免重復(fù)下載已緩存的資源。此外,前端也可以使用 Service Worker 來緩存數(shù)據(jù),提高離線訪問能力。
這樣回答能展示你的 緩存機制理解 + 實戰(zhàn)經(jīng)驗,面試官會認(rèn)可你的能力!