在 Service Worker 中處理 CORS 和不透明響應

Service Worker 和非 CORS(不透明)響應

Service Worker 攔截非 CORS 響應并使用 Cache API 將其緩存為不透明響應。這些響應會以狀態(tài)碼 0 被攔截符相。由于其不透明特性,JavaScript 無法檢查這些響應勾缭,使得 Service Worker 無法根據(jù)狀態(tài)碼、頭部或其他條件對這些響應進行有條件緩存。

Workbox 緩存策略和不透明響應

Workbox 建議(并默認為)在“優(yōu)先緩存”策略中僅緩存狀態(tài)碼為 200 的響應颠通。這意味著在這種情況下蚓庭,不透明響應不會被緩存致讥。然而,“stale-while-revalidate”(舊緩存優(yōu)先器赞,再重新驗證)策略會緩存狀態(tài)碼為 200 和 0 的響應垢袱。

將不透明響應用作頁面資源

通過 HTML 元素的 src 屬性加載的資源(如 imgvideo 等)默認作為 no-cors 請求發(fā)出港柜,因此它們的響應會是不透明的请契。在瀏覽器允許非 CORS 跨域資源的情況下,不透明響應可用作網(wǎng)頁資源夏醉。以下是可以使用非 CORS 跨域資源(即不透明響應)的元素子集:

  • <script>
  • <link rel="stylesheet">
  • <img>姚糊、<video><audio>
  • <object><embed>
  • <iframe>

可以通過添加 crossorigin 屬性將這些元素的請求變?yōu)?CORS。

需要注意的是授舟,不透明響應對字體資源無效救恨。

要確定是否可以將不透明響應用作頁面上的特定類型資源,可以查閱相關(guān)規(guī)范释树。例如肠槽,HTML 規(guī)范解釋了非 CORS 跨域(即不透明)響應可用于 <script> 元素,但存在一些限制奢啥,以防止泄露錯誤信息秸仙。

不透明響應的限制

  • 檢查:Service Worker(或 JavaScript 通常情況下)無法檢查不透明響應,包括其大小桩盲。
  • 訪問頭部和主體:不能從 Response 類的大多數(shù)屬性中獲取有效信息寂纪,例如 headers,也不能調(diào)用 Body 接口中的 json()text() 等方法。

重寫 no-cors 請求以檢查不透明響應

作為應對不透明響應限制的解決方法捞蛋,可以在 Service Worker 中攔截 no-cors 請求并將其重寫為 CORS 請求孝冒。這樣可以檢查并根據(jù)狀態(tài)碼有條件地緩存這些響應。

例如拟杉,使用 Workbox 可以這樣實現(xiàn):

const forceCorsRequestPlugin = {
  requestWillFetch: async ({ request }) => {
    // 如果請求不是 no-cors庄涡,則不修改請求(例如包含憑證的請求)。
    if (request.mode !== "no-cors") {
      return request;
    }
    return new Request(request, { mode: "cors", credentials: "omit" });
  },
};

不透明響應與 Cache Storage API

關(guān)于 Cache Storage API(Service Worker 用于處理緩存的 API)行為的一個小細節(jié):當使用不透明響應時搬设,add()addAll() 方法會拒絕狀態(tài)碼不在 2XX 范圍內(nèi)的響應穴店。因此,使用 add()addAll() 方法將無法將不透明響應添加到緩存中拿穴。要解決此問題泣洞,可以顯式執(zhí)行 fetch() 請求,然后使用 put() 方法存儲不透明響應默色。

不透明響應與 navigator.storage API

為防止跨域信息泄露球凰,瀏覽器在計算存儲配額限制時會對不透明響應的大小進行顯著填充。在 Google Chrome 中该窗,單個緩存的不透明響應對總體存儲使用的最低貢獻大小約為 7 MB。請記住這一點蚤霞,以便在決定緩存多少不透明響應時避免超出存儲配額限制酗失,這樣可能會比預期更快達到上限。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昧绣,一起剝皮案震驚了整個濱河市规肴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夜畴,老刑警劉巖拖刃,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贪绘,居然都是意外死亡兑牡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門税灌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來均函,“玉大人,你說我怎么就攤上這事菱涤“玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵粘秆,是天一觀的道長如迟。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么殷勘? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任此再,我火速辦了婚禮,結(jié)果婚禮上劳吠,老公的妹妹穿的比我還像新娘引润。我一直安慰自己,他們只是感情好痒玩,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布淳附。 她就那樣靜靜地躺著,像睡著了一般蠢古。 火紅的嫁衣襯著肌膚如雪奴曙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天草讶,我揣著相機與錄音洽糟,去河邊找鬼。 笑死堕战,一個胖子當著我的面吹牛坤溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘱丢,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼薪介,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了越驻?” 一聲冷哼從身側(cè)響起汁政,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缀旁,沒想到半個月后记劈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡并巍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年目木,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懊渡。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘶窄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出距贷,到底是詐尸還是另有隱情柄冲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布忠蝗,位于F島的核電站现横,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戒祠,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一骇两、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姜盈,春花似錦低千、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至救拉,卻和暖如春难审,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿絮。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工告喊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人派昧。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓黔姜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒂萎。 傳聞我的和親對象是個殘疾皇子秆吵,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容