當(dāng)PageSpeed Insights檢測(cè)到您的服務(wù)器響應(yīng)不包含明確的緩存標(biāo)頭或某些資源被指定只緩存一小段時(shí)間時(shí),就會(huì)觸發(fā)此規(guī)則。
如果用戶會(huì)多次訪問您的網(wǎng)站,那么靜態(tài)資源的瀏覽器緩存可以節(jié)省用戶的時(shí)間。緩存標(biāo)頭應(yīng)當(dāng)應(yīng)用到所有可緩存的靜態(tài)資源中,而不僅僅是應(yīng)用到一小部分靜態(tài)資源(例如,圖片)中??删彺娴馁Y源包括JS和CSS文件、圖像文件及其他二進(jìn)制對(duì)象文件(媒體文件和PDF文件等)。通常情況下,HTML不是靜態(tài)資源,默認(rèn)情況下不應(yīng)被視為可緩存資源。您應(yīng)考慮哪些緩存政策適用于您網(wǎng)站的HTML。
為您的服務(wù)器啟用瀏覽器緩存。靜態(tài)資源應(yīng)該至少有一周的緩存有效期。廣告或小部件這類的第三方資源也應(yīng)該至少有一天的緩存有效期。對(duì)于所有可緩存資源,我們建議您進(jìn)行以下設(shè)置:
Expires
設(shè)為將來日期,至少為一周,最多為一年(我們傾向于設(shè)置Expires
,而不設(shè)置Cache-Control: max-age
,因?yàn)榍罢呤苤С值姆秶鼮閺V泛)。請(qǐng)勿將其設(shè)為超過一年的將來日期,因?yàn)檫@樣就違反了RFC準(zhǔn)則。這些標(biāo)頭用于指定相應(yīng)時(shí)間段,瀏覽器可在指定的這段時(shí)間內(nèi)使用已緩存的資源,而無需查看網(wǎng)絡(luò)服務(wù)器是否提供了新版資源。這些緩存標(biāo)頭功能強(qiáng)大,沒有任何應(yīng)用條件限制。在設(shè)置這些標(biāo)頭并下載資源后,瀏覽器不會(huì)為資源發(fā)出任何GET請(qǐng)求,除非過期日期到期或達(dá)到時(shí)間最大值,亦或是用戶清除了緩存。
這些標(biāo)頭可用于指定瀏覽器應(yīng)如何確定用于緩存的文件是否相同。在Last-Modified
標(biāo)頭中指定的是日期,而在ETag
標(biāo)頭中指定的則可以是唯一標(biāo)識(shí)資源的任意值(通常為文件版本或內(nèi)容哈希值)。Last-Modified
是功能“較弱”的緩存標(biāo)頭,因?yàn)闉g覽器會(huì)使用試探法來確定是否需要從緩存中抓取內(nèi)容。
借助這些標(biāo)頭,瀏覽器可以通過在用戶明確重新加載頁面時(shí)發(fā)出條件式GET請(qǐng)求,有效地更新其已緩存資源。除非您在服務(wù)器端更改資源,否則條件式GET請(qǐng)求不會(huì)返回完整的響應(yīng),因此相較于完整GET請(qǐng)求,此類請(qǐng)求的延遲較小。
Expires
或Cache-Control max-age
以及一個(gè)Last-Modified
或ETag
至關(guān)重要。您沒必要同時(shí)指定Expires
和Cache-Control: max-age
;或同時(shí)指定Last-Modified
和ETag
。
對(duì)于偶爾發(fā)生變化的資源,我們可以讓瀏覽器緩存相應(yīng)的資源,直到該資源在服務(wù)器上出現(xiàn)變化,而服務(wù)器則在此時(shí)通知瀏覽器有新版本可用。我們可以通過為每個(gè)版本的資源指定一個(gè)唯一網(wǎng)址來實(shí)現(xiàn)這一目的。例如,假定我們有一個(gè)名為“my_stylesheet.css”的資源。我們可以將文件重命名為“my_stylesheet_fingerprint.css”。當(dāng)資源發(fā)生變化時(shí),其指紋就會(huì)發(fā)生變化,對(duì)應(yīng)的網(wǎng)址也會(huì)隨之更改。網(wǎng)址一經(jīng)更改,系統(tǒng)就會(huì)強(qiáng)制瀏覽器重新抓取資源。通過指紋,我們甚至可以為變化更為頻繁的資源設(shè)置將來的過期日期。
指紋識(shí)別的常用方法是使用對(duì)文件內(nèi)容的哈希值進(jìn)行編碼的128位十六進(jìn)制數(shù)。
另一個(gè)策略是直接為新版應(yīng)用創(chuàng)建新版目錄,然后為版本目錄中的各個(gè)版本放置所有資源。這樣做的缺點(diǎn)是,如果各個(gè)版本中的資源未發(fā)生變化,則其網(wǎng)址將仍會(huì)更改以強(qiáng)制重新下載。使用內(nèi)容哈希值不會(huì)遇到該問題,但這種方法稍微復(fù)雜一些。
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies.