前言最近手上剛剛拆掉石膏,去樓下房友幫忙。樓下房友領(lǐng)導來自阿里,前端用的是阿里的ant-design,設(shè)計將設(shè)計圖上傳到藍湖,聊天工具也采用阿里的釘釘。有時間我也多多去樓下房友交流學習,多交流,就會有提升。最近也比較忙,好久沒有更新博客了。閑言少敘,今天主要談談前端性能優(yōu)化之瀏覽器緩存。 瀏覽器緩存我前面寫過瀏覽器緩存的文章,也寫過html5離線緩存,關(guān)于這些緩存,我們很容易搞不清,例如:200 OK (FROM MemoryCache、FROM DiskCache) 及 304 NOT MODIFIED 還有 application cache (離線緩存)等等。 200 from memory cache 不訪問服務器,直接讀緩存,從內(nèi)存中讀取緩存。此時的數(shù)據(jù)時緩存到內(nèi)存中的,當kill進程后,也就是瀏覽器關(guān)閉以后,數(shù)據(jù)將不存在。但是這種方式只能緩存派生資源 200 from disk cache 不訪問服務器,直接讀緩存,從磁盤中讀取緩存,當kill進程時,數(shù)據(jù)還是存在。這種方式也只能緩存派生資源 304 Not Modified 訪問服務器,發(fā)現(xiàn)數(shù)據(jù)沒有更新,服務器返回此狀態(tài)碼。然后從緩存中讀取數(shù)據(jù)。 三級緩存原理
一般瀏覽圖片,如下流程:
application cache和上面緩存有點區(qū)別,是離線緩存,就是資源可以從硬盤上讀取而不用聯(lián)網(wǎng),即使斷網(wǎng),用戶也可以瀏覽。 設(shè)置瀏覽器緩存304是協(xié)商緩存還是要和服務器通信一次,要想斷絕服務器通信,就要強制瀏覽器使用本地緩存(cache-control/expires), 一般有如下幾種方式設(shè)置瀏覽器緩存。 1、通過HTTP的META設(shè)置expires和cache-control http-equiv="Cache-Control" content="max-age=7200" /> http-equiv="Expires" content="Sun Oct 15 2017 20:39:53 GMT+0800 (CST)" /> 這樣寫的話僅對該網(wǎng)頁有效,對網(wǎng)頁中的圖片或其他請求無效。 2、apache服務器配置圖片,css,js,flash的緩存 這個主要通過服務器的配置來實現(xiàn)這個技術(shù),如果使用apache服務器的話,可以使用mod_expires模塊來實現(xiàn): 編譯mod_expires模塊: Cd /root/httpd-2.2.3/modules/metadata /usr/local/apache/bin/apxs -i -a -c mod_expires.c //編譯 先打開httpd.conf文件,然后查找expires這個模塊,找到后,刪除左邊的#號,表示打這個模塊,并重啟apache服務器 編輯httpd.conf配置:添加下面內(nèi)容 mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 month" ExpiresByType text/html "access plus 1 months" ExpiresByType text/css "access plus 1 months" ExpiresByType image/gif "access plus 1 months" ExpiresByType image/jpeg "access plus 1 months" ExpiresByType image/jpg "access plus 1 months" ExpiresByType image/png "access plus 1 months" EXpiresByType application/x-shockwave-flash "access plus 1 months" EXpiresByType application/x-javascript "access plus 1 months" #ExpiresByType video/x-flv "access plus 1 months" 3、php等設(shè)置
php
header("Cache-Control: public");
header("Pragma: cache");
$offset = 30*60*60*24; // cache 1 month
$ExpStr = "Expires: ".gmdate("D, d M Y H:i:s", time() + $offset)." GMT";
header($ExpStr);
?>
或者
$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
header("Expires: $ts"); header("Pragma: cache");
header("Cache-Control: max-age=$seconds_to_cache");
緩存情況下前端代碼部署問題一:有了緩存,如何進行前端代碼更新呢? 我們可以在資源文件或者圖片后面添加版本號,如下圖。
問題二:但是所有文件都加了版本號之后,我們只更改了一個文件,其他文件的緩存不是浪費了嗎? 解決這個問題,我們可以用 數(shù)據(jù)摘要要算法,對文件求摘要信息,摘要信息與文件內(nèi)容一一對應。如下圖:
這樣就解決了這個問題。 問題三:新的問題又來了,文件發(fā)布怎么辦?
如何解決這些問題呢? 這個問題,起源于資源的 覆蓋式發(fā)布,用 待發(fā)布資源 覆蓋 已發(fā)布資源,就有這種問題。解決它也好辦,就是實現(xiàn) 非覆蓋式發(fā)布,如下圖:
看上圖,用文件的摘要信息來對資源文件進行重命名,把摘要信息放到資源文件發(fā)布路徑中,這樣,內(nèi)容有修改的資源就變成了一個新的文件發(fā)布到線上,不會覆蓋已有的資源文件。上線過程中,先全量部署靜態(tài)資源,再灰度部署頁面,整個問題就比較完美的解決了。 總結(jié)如下:
|