迎關(guān)注我的頭條號(hào):Wooola,專注于Java、Golang、微服務(wù)架構(gòu),致力于每天分享原創(chuàng)文章、快樂編碼和開源技術(shù)。
最近發(fā)版前端項(xiàng)目,用戶經(jīng)常反饋新添加功能在線上環(huán)境不好用,常出現(xiàn)新老頁面并存的狀況。經(jīng)前端同事排查法發(fā)現(xiàn),實(shí)際上只需要重新刷新一下頁面就沒事了。但是每次去通知用戶肯定不現(xiàn)實(shí),所以需要對(duì)前端的js和css等文件采取一定的緩存失效的措施,強(qiáng)制瀏覽器重新去服務(wù)器獲取新的js代碼以及css文件。
樓主經(jīng)過實(shí)際的項(xiàng)目情況反饋,總結(jié)以下兩點(diǎn)切實(shí)可行的辦法,分享給大家,希望對(duì)大家有幫助。
時(shí)間版本號(hào)
如果每次發(fā)布,針對(duì)修改過的js或者css文件路徑加上時(shí)間的版本號(hào),一般以年月日拼寫。
<script type="text/javascript" src="lib/common.js?v=20190719"></script> <link rel="stylesheet" type="text/css" href="assets/css/ie/ie8.css?v=20190719" />
如果發(fā)生緊急情況,需要在一天當(dāng)中對(duì)某些css或者js文件多次發(fā)版,可以把時(shí)間精確到時(shí)分秒。
目前樓主主推采用加版本號(hào)的方式,因?yàn)槲募啵荒茏鲈隽啃薷摹:锰幨菦]有做任何修改js或者css文件可以不用加版本號(hào)。
采用隨機(jī)數(shù)
document.write('<script src=\".lib/common.js?r=' + Math.random() + "\"" + '><\/script>');
一般不建議用隨機(jī)數(shù)的方式,因?yàn)槊看嗡⑿马撁妫S機(jī)數(shù)都會(huì)變化,那么瀏覽器認(rèn)為一個(gè)新的url需要重新請(qǐng)求服務(wù)端獲取js或css文件,不會(huì)在使用瀏覽器本地緩存。同時(shí)占用網(wǎng)絡(luò)帶寬,影響服務(wù)器響應(yīng)速度。
可以利用 gulp-rev或者webpack
entry: { main: './src/common.js', slove: './src/ie8.js' }, output: { filename: '[name].[hash].js', path: path.resolve(__dirname, 'dist') }
例如百度搜索首頁,就是利用hash給js和css文件重命名。
. 前端緩存概述
前端緩存主要是分為HTTP緩存和瀏覽器緩存。其中HTTP緩存是在HTTP請(qǐng)求傳輸時(shí)用到的緩存,主要在服務(wù)器代碼上設(shè)置;而瀏覽器緩存則主要由前端開發(fā)在前端js上進(jìn)行設(shè)置。下面會(huì)分別具體描述。
2. 前端緩存分類
2.1 HTTP緩存
整體流程
HTTP緩存都是從第二次請(qǐng)求開始的。
第一次請(qǐng)求資源時(shí),服務(wù)器返回資源,并在respone header頭中回傳資源的緩存參數(shù);第二次請(qǐng)求時(shí),瀏覽器判斷這些請(qǐng)求參數(shù),擊中強(qiáng)緩存就直接200,否則就把請(qǐng)求參數(shù)加到request header頭中傳給服務(wù)器,看是否擊中協(xié)商緩存,擊中則返回304,否則服務(wù)器會(huì)返回新的資源。
HTTP緩存分為強(qiáng)緩存和協(xié)議緩存,它們的區(qū)別如下:
200 from disk or 200 from memory
強(qiáng)緩存的200也有兩種情況:200 from disk和200 from memory。現(xiàn)在我沒有找到明確的文檔來描述這種區(qū)別的發(fā)生條件。知乎這個(gè)問題中提到了一些情景,可以自行取用。
2.1.1 強(qiáng)緩存
2.1.2 協(xié)商緩存
協(xié)商緩存都是成對(duì)出現(xiàn)的。
2.1.3 最佳優(yōu)化策略——消滅304
最佳優(yōu)化策略:因?yàn)閰f(xié)商緩存本身也有http請(qǐng)求的損耗,所以最佳優(yōu)化策略是要盡可能的將靜態(tài)文件存儲(chǔ)為較長(zhǎng)的時(shí)間,多利用強(qiáng)緩存而不是協(xié)商緩存,即消滅304。
但是給文件設(shè)置一個(gè)很長(zhǎng)的Cacha-Control也會(huì)帶來其他的問題,最主要的問題是靜態(tài)內(nèi)容更新時(shí),用戶不能及時(shí)獲得更新的內(nèi)容。這時(shí)候就要使用hash的方法對(duì)文件進(jìn)行命名,通過每次更新不同的靜態(tài)文件名來消除強(qiáng)緩存的影響。
Hash命名:
2.2 瀏覽器緩存
2.2.1 本地存儲(chǔ)小容量
Cookie主要用于用戶信息的存儲(chǔ),Cookie的內(nèi)容可以自動(dòng)在請(qǐng)求的時(shí)候被傳遞給服務(wù)器。
LocalStorage的數(shù)據(jù)將一直保存在瀏覽器內(nèi),直到用戶清除瀏覽器緩存數(shù)據(jù)為止。
SessionStorage的其他屬性同LocalStorage,只不過它的生命周期同標(biāo)簽頁的生命周期,當(dāng)標(biāo)簽頁被關(guān)閉時(shí),SessionStorage也會(huì)被清除。
2.2.2 本地存儲(chǔ)大容量
WebSql和IndexDB主要用在前端有大容量存儲(chǔ)需求的頁面上,例如,在線編輯瀏覽器或者網(wǎng)頁郵箱。
2.2.3 應(yīng)用緩存與PWA
應(yīng)用緩存全稱為Offline Web Application,它的緩存內(nèi)容被存在瀏覽器的Application Cache中。它也是一個(gè)被W3C標(biāo)準(zhǔn)廢棄的功能,主要是通過manifest文件來標(biāo)注要被緩存的靜態(tài)文件清單。但是在緩存靜態(tài)文件的同時(shí),也會(huì)默認(rèn)緩存html文件。這導(dǎo)致頁面的更新只能通過manifest文件中的版本號(hào)來決定。而且,即使我們更新了version,用戶的第一次訪問還是會(huì)訪問到老的頁面,只有下一次再訪問才能訪問到新的頁面。所以,應(yīng)用緩存只適合那種常年不變化的靜態(tài)網(wǎng)站。如此的不方便,也是被廢棄的重要原因。
PWA全稱是漸進(jìn)式網(wǎng)絡(luò)應(yīng)用,主要目標(biāo)是實(shí)現(xiàn)web網(wǎng)站的APP式功能和展示。盡管PWA也有manifest文件,但是與應(yīng)用緩存卻完全不同。不同于manifest簡(jiǎn)單的將文件通過是否緩存進(jìn)行分類,PWA用manifest構(gòu)建了自己的APP骨架。另外,PWA用Service Worker來控制緩存的使用。這一塊的內(nèi)容較多,在這里就不詳細(xì)展開了。
2.2.4 往返緩存
往返緩存又稱為BFCache,是瀏覽器在前進(jìn)后退按鈕上為了提升歷史頁面的渲染速度的一種策略。BFCache會(huì)緩存所有的DOM結(jié)構(gòu),但是問題在于,一些頁面開始時(shí)進(jìn)行的上報(bào)或者請(qǐng)求可能會(huì)被影響。這個(gè)問題現(xiàn)在主要會(huì)出現(xiàn)在微信h5的開發(fā)中。
總結(jié):本文梳理了前端所有可能涉及的緩存,希望能從整體層面建立起系統(tǒng)的緩存知識(shí)體系。描述都比較簡(jiǎn)略,起到拋磚引玉之用。如有錯(cuò)誤,還望見諒。
.14號(hào)上午11點(diǎn),MIUI 7已全面支持開放升級(jí)。支持的機(jī)型有:小米手機(jī)2/2S、小米手機(jī)3、小米手機(jī)4、小米Note/頂配版、紅米手機(jī)系列、紅米Note 系列,下面讓我們一起來看下如何進(jìn)行升級(jí)呢?
1、不雙清卡刷
這個(gè)非常簡(jiǎn)單,只要下載好對(duì)應(yīng)機(jī)型的卡刷包放在手機(jī)存儲(chǔ)在系統(tǒng)更新里面選擇刷機(jī)包即可,以下是詳細(xì)的圖文教程:
根據(jù)自己機(jī)型下載好官方卡刷包,下載地址:http://www.miui.com/download.html
下載好后把刷機(jī)包放在手機(jī)內(nèi)置存儲(chǔ)或者SD卡內(nèi),打開“系統(tǒng)升級(jí)”,點(diǎn)擊升級(jí)界面右上角的三點(diǎn)。如下圖:
在彈出的菜單選擇“手動(dòng)選擇安裝包”,然后會(huì)跳到文件管理器,選擇存包的位置選擇刷機(jī)包就可以了,這里會(huì)提示重啟,點(diǎn)重啟就OK。接下來就讓ROM飛一會(huì)吧,手機(jī)會(huì)自動(dòng)安裝刷機(jī)包,安裝完后會(huì)自動(dòng)重啟進(jìn)系統(tǒng)。
小結(jié):這就是不雙清卡刷的方法,但是要注意的是,只有安裝比手機(jī)當(dāng)前系統(tǒng)版本高的刷機(jī)包才不用雙清,如果是降級(jí)或者系統(tǒng)有問題的還是看看雙清的刷機(jī)方法吧。另外,紅米系列選擇刷機(jī)包后直接提示重啟,然后在Rec里面自動(dòng)完成刷機(jī)包的安裝,小米系列(1,2,3,4)是在系統(tǒng)更新內(nèi)完成安裝然后直接重啟進(jìn)系統(tǒng)的,那是因?yàn)樾∶紫盗兄С蛛p系統(tǒng)。(紅米手機(jī)1不適用)
2、雙清卡刷:
這個(gè)也不難,和上面刷機(jī)過程差不多,只是方法不一樣
?雙清前要先備份好個(gè)人數(shù)據(jù),不如然清除后就沒有了。首先給卡刷包改名,改成“update.zip”,記住后綴是".zip",改完名后放在手機(jī)“內(nèi)置”存儲(chǔ),然后關(guān)機(jī),手機(jī)在關(guān)機(jī)狀態(tài)下同時(shí)按住"音量加"和"電源鍵"進(jìn)入Rec(恢復(fù)模式),官方Rec操作方法:音量加減是選擇鍵,電源鍵是確認(rèn)。中間的圖就是Rec主界面,這里選擇簡(jiǎn)體中文(看得懂英文也可以選英文啦),選擇清除數(shù)據(jù)。如下圖所示:
這里我們只說雙清,雙清就是清除”系統(tǒng)緩存“和”用戶數(shù)據(jù)“兩項(xiàng),選擇進(jìn)去確定清除就OK,兩項(xiàng)操作方法一樣的,清除這兩項(xiàng)之后回到主菜單,選擇"將update.zip安裝至系統(tǒng)",這也就是剛剛要給刷機(jī)包改名的原因了,這里只能識(shí)別叫做"update.zip"的包。如下圖:
選擇"將update.zip安裝至系統(tǒng)"后還會(huì)有一個(gè)確認(rèn)提示,這里選擇確認(rèn)就OK。接下來又是ROM飛的時(shí)候了,待進(jìn)度條走到100會(huì)自動(dòng)重啟進(jìn)入系統(tǒng)。
小結(jié):這就是雙清卡刷了,雙清時(shí)要注意其他的項(xiàng)目不能清除,否則之前放在存儲(chǔ)里面的刷機(jī)包也會(huì)被清掉。
3、MiFlash線刷:
這個(gè)超級(jí)簡(jiǎn)單,但是需要一臺(tái)電腦。要準(zhǔn)備的東西有:
Miflash刷機(jī)工具,下載地址:http://www.xiaomi.cn/content-19-10672-1.html
官方線刷包,下載地址:http://rom.xiaomi.cn??或:http://www.miui.com/shuaji-393.html
下載好刷機(jī)工具后先安裝到系統(tǒng),如下圖(步驟按圖片順序):
這是安裝完成后的提示,直接點(diǎn)擊結(jié)束:
打開Miflash,然后要到手機(jī)端操作了,手機(jī)關(guān)機(jī)狀態(tài)下同時(shí)按住"音量減"加"電源鍵",會(huì)出現(xiàn)一只米兔和Fastboot字樣,這里就進(jìn)入到Fastboot模式了,接著手機(jī)用數(shù)據(jù)線連接到電腦,電腦端Miflash中點(diǎn)擊”刷新“按鈕,就會(huì)看到有一個(gè)設(shè)備在列表里面了,如下圖:
把下載好的線刷包解壓出來,解壓后我們得到一個(gè)這樣的文件夾,刷機(jī)包名字根據(jù)機(jī)型來定的,反正都是一串英文。如下圖:
接著點(diǎn)擊"瀏覽"按鈕,選擇解壓好的刷機(jī)包路徑:
選擇好后是是這個(gè)樣子的:
點(diǎn)擊刷機(jī)就可以了,刷機(jī)期間手機(jī)端的Fastboot不會(huì)有反應(yīng),但是電腦端有進(jìn)度條和時(shí)間顯示,刷完一樣自動(dòng)重啟進(jìn)系統(tǒng),刷機(jī)過程不能拔數(shù)據(jù)線,刷好之后是這樣的:
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。