整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端項(xiàng)目如何防止瀏覽器緩存舊版js和css

          迎關(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ì)大家有幫助。

          1. 路徑后面加時(shí)間戳或者隨機(jī)數(shù)的方式
          2. 采用hash(md5)重命名文件

          路徑后面加時(shí)間戳或者隨機(jī)數(shù)的方式

          時(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)速度。

          采用hash(md5)重命名文件

          可以利用 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命名:

          • http://xxx.com/main.5eas34fa.js
          • http://xxx.com/main.js?5eas34fa
          • http://xxx.com/5eas34fa/main.js

          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ù)線,刷好之后是這樣的:


          主站蜘蛛池模板: 国产精品成人一区无码| 麻豆精品久久久一区二区| 亚洲欧美日韩中文字幕在线一区 | 在线观看一区二区三区视频| 免费国产在线精品一区| 国产亚洲综合一区二区三区| 国产一区二区在线观看app| 三级韩国一区久久二区综合| 国产精品无码一区二区三区免费| 亚洲综合一区二区三区四区五区| 精品一区二区三区在线成人| 国产精品第一区揄拍| 自慰无码一区二区三区| 亚洲色偷偷偷网站色偷一区| 蜜臀Av午夜一区二区三区| 亚洲日韩国产一区二区三区在线| 亚洲中文字幕在线无码一区二区| 韩国美女vip福利一区| 亚洲欧美日韩国产精品一区| 亚洲日韩一区二区一无码| 国产一区二区三区不卡观| 无码人妻精品一区二区三18禁| 无码日韩精品一区二区免费暖暖 | 日韩一区精品视频一区二区| 亚洲AV无码一区二区三区电影| 日韩国产一区二区| 日韩精品一区二区亚洲AV观看| 在线观看国产一区亚洲bd| 国产一区美女视频| 在线视频一区二区三区三区不卡| 精品人伦一区二区三区潘金莲| 无码人妻久久一区二区三区| 韩国理伦片一区二区三区在线播放| 国产裸体舞一区二区三区| 久久99精品国产一区二区三区| 成人中文字幕一区二区三区| 日韩人妻无码一区二区三区久久 | AA区一区二区三无码精片| 国产成人一区在线不卡| 波多野结衣中文字幕一区二区三区 | 精品一区二区三区自拍图片区|