自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:Cache-Control 等緩存機制一般是前端配置還是后端配置?

開發(fā)
在實際項目中,我們通常讓 CDN 或后端設(shè)置 Cache-Control: max-age=31536000, immutable 來緩存靜態(tài)資源,同時用 ETag / Last-Modified 讓瀏覽器避免重復(fù)下載已緩存的資源。

回答思路:

  • 靜態(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é)

Cache-Control

?

? 服務(wù)器/CDN 配置

ETag

 / Last-Modified

?

? 服務(wù)器生成哈?;驎r間戳

meta

 標(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)可你的能力!

責(zé)任編輯:趙寧寧 來源: 大遷世界
相關(guān)推薦

2023-09-12 14:56:13

MyBatis緩存機制

2010-09-26 08:46:06

HTML 5Cache Manif

2025-03-10 07:05:07

2023-11-15 09:14:27

Java值傳遞

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2023-09-01 15:27:31

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2021-08-16 18:52:09

同步異步React

2021-09-07 10:44:33

Java 注解開發(fā)

2024-03-12 10:44:42

2019-06-05 15:23:09

Redis緩存存儲

2022-01-26 00:01:00

Casbin配置權(quán)限

2024-10-24 09:22:30

2020-09-14 06:57:30

緩存穿透雪崩

2025-03-05 08:04:31

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2021-01-06 17:28:00

MySQL數(shù)據(jù)庫緩存池

2023-02-18 13:34:14

Nacos健康檢查機制

2022-08-18 20:02:04

JSLRU緩存

2021-12-08 06:53:29

面試動態(tài)代理
點贊
收藏

51CTO技術(shù)棧公眾號