淺談微信頁面入口文件被緩存解決方案
緩存對(duì)于前端頁面來說,是加速頁面加載的利器之一,但也同時(shí)帶來了很多問題,比如新版本發(fā)布之后,怎么替換客戶端上的緩存文件呢?大家一般的的解決方案主要有以下幾種形式,
一般情況
1、添加版本號(hào),在靜態(tài)資源文件的引用鏈接后面添加版本號(hào),這樣每次發(fā)布的時(shí)候更新版本號(hào),就能讓叫客戶端加載新的資源文件,避免再次使用緩存的老文件,如
<script src="http://m.test.com/build/activity/js/commons.js?v=20170608"></script>
2、文件名使用hash形式,webpack中打包文件可直接生成,這樣每次打包發(fā)布的時(shí)候都會(huì)產(chǎn)生新的hash值,區(qū)別于原有的緩存文件
<script src="http://m.test.com/build/activity/js/activity/201807/schoolbeauty/main.19315e5.js"></script>
3、服務(wù)器及緩存頭設(shè)置,不使用緩存,如
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
root /mnt/dat1/test/tes-app;
#### kill cache
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
}
4、在html的meta標(biāo)簽添加緩存設(shè)置
<!-- cache control: no cache --> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" />
微(keng)信(die)瀏覽器
微信瀏覽器下比較特殊,這個(gè)bug一樣的存在居然把入口文件html給緩存下來了,這就意味著通過版本號(hào)和hash號(hào)的形式避免緩存的方案失效了。同時(shí)html的meta設(shè)置依舊沒能生效。
方案一(部分框架無效)
最開始碰到這個(gè)問題,我在想是不是可以給入口文件的html加一個(gè)版本號(hào),比如https://m.test.com/views/index?v=1538208193491
理論上來說,這樣應(yīng)該是可以的,但發(fā)現(xiàn)沒有用。分析原因可能是vue+nginx的形式下,所有的路由都被try_files解析到index.html
location / {
root /mnt/dat1/test/tes-app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
這個(gè)解析的過程中版本號(hào)已經(jīng)失效了,因此沒能達(dá)到替換緩存的目的。至于其他的框架下,比如ftl、jsp那種模版編譯的有可能生效,不過需要大家自己去驗(yàn)證了。
方案二(有效)
再換一種方案,更改服務(wù)器配置,強(qiáng)制不緩存入口文件,其他靜態(tài)正常緩存,比如在nginx中對(duì)靜態(tài)部分如下
location / {
root /mnt/dat1/test/tes-app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
#### kill cache
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
root /mnt/dat1/test/tes-app;
access_log off;
expires 30d;
}
最終經(jīng)過測(cè)試,這種方式可以解決微信下入口文件被緩存的問題,問題解決~~
題外話
說到這里,微信瀏覽器為什么要緩存html文件呢?
1、難道也是加速頁面加載?并不見得是這個(gè)原因,因?yàn)檫@可能帶來的問題大于帶來的優(yōu)化效果。
2、緩存入口頁面和保留上次瀏覽位置是否有關(guān)聯(lián)呢?感覺關(guān)聯(lián)度也不是那么大
補(bǔ)充:微信瀏覽器取消緩存的方法
一、通過url參數(shù)避免html文件緩存
請(qǐng)求同一個(gè)頁面的時(shí)候,如果url后面的參數(shù)不一樣,則不會(huì)調(diào)用微信緩存中的html頁面,由此可以解決html頁面的緩存問題。例如加個(gè)版本號(hào)或時(shí)間戳
www.xxx.com/home.html?v=1.0
二、避免css和js的緩存
以上工作完成之后,我們解決了html的緩存問題,但是通過訪問nginx(或是其他工具)的日志發(fā)現(xiàn),雖然帶上了不同的參數(shù),html確實(shí)不會(huì)緩存了,但是卻沒有js和css文件的請(qǐng)求。
猜測(cè)在這里,微信發(fā)現(xiàn)我們所請(qǐng)求的js和css文件在他的緩存里面有了,所以就直接打開緩存中的文件返回給了頁面上。(所以這就坑爹了?。。。?/p>
所以我們要在html文件的頭部(head)處加上一些meta:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" />
ps,網(wǎng)上很多答案都提供了添加在head處的meta,但是有的人說沒有用。目測(cè)是因?yàn)閙eta只能保障js和css等資源不會(huì)被緩存,但是無法保障html不被緩存。所以,要和url參數(shù)方法于meta方法一起使用,才能保障毫無側(cè)漏!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript注冊(cè)監(jiān)聽事件和清除監(jiān)聽事件方式詳解
js中事件監(jiān)聽就是利用addEventListener來綁定一個(gè)事件,這個(gè)用法在jquery中非常常用并且簡(jiǎn)單,但在原生js中比較復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于JavaScript注冊(cè)監(jiān)聽事件和清除監(jiān)聽事件方式的相關(guān)資料,需要的朋友可以參考下2023-05-05
JavaScript函數(shù)的4種調(diào)用方法詳解
了解函數(shù)的調(diào)用過程有助于深入學(xué)習(xí)與分析JavaScript代碼。本文是JavaScript高級(jí)這個(gè)系列中的第三篇文章,主要介紹JavaScript中函數(shù)的四種使用形式2014-04-04
用JavaScript調(diào)用WebService的示例
JavaScript用htc實(shí)現(xiàn)WebService的調(diào)用2008-04-04
js列舉css中所有圖標(biāo)的實(shí)現(xiàn)代碼
最近在做一個(gè)通用的配置模塊。配置模塊中必然要對(duì)系統(tǒng)的菜單、功能模塊、權(quán)限資源等進(jìn)行配置,為了更好的用戶體驗(yàn),圖標(biāo)是必不可少的!2011-07-07
javascript比較兩個(gè)日期相差天數(shù)的方法
這篇文章主要介紹了javascript比較兩個(gè)日期相差天數(shù)的方法,涉及javascript針對(duì)日期的轉(zhuǎn)換與數(shù)學(xué)運(yùn)算相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07

