1. 程式人生 > >[ 前端工程 ] 靜態資源快取的處理方式

[ 前端工程 ] 靜態資源快取的處理方式

原問題是:
一般瀏覽器對靜態資源的快取導致的更新不及時問題,我們是怎麼處理的?有哪幾種方式?
為什麼會產生這些方式?(其實就是各種方式的優劣)

之前大家可能都知道 一般的公司對於靜態資源以及快取的處理方式無非就這麼幾種。
1 在靜態資源後面加一個版本號 v=1.111
這裡寫圖片描述
類似於上面這種方式。

2 為了準確的確定檔案是否修改,將後面的版本號修改為檔案摘要(主要根據檔案內容生成的一個值)。
這裡寫圖片描述
類似於上面這種,後面的紅框表示的部分就是根據檔案的摘要生成的key.

3 直接將資原始檔名使用檔案摘要或者說某個固定的字串加上一個檔案摘要拼接成一個檔名。
這裡寫圖片描述
類似上面這種方式,最後面紅圈內表示的程式碼是根據檔案摘要來生成的,這裡需要區別和第二種方式,第二種方式是拿來放在url後面作為一個引數,但檔名沒有改變。而這裡直接選擇修改了檔名。

(彩蛋:有意思的,找了幾個TX的網站,發現其實並不是所有的網站都採用了最後一種方式。我想應該技術都是用來追求完美的,但實現還是人實現的,畢竟人的天性是喜歡偷懶的。)

那麼問題來了? 以上三種方式的區別是什麼?為什麼最後會最終演變為第三種方式?

1 第一種方式,需要維護版本號,如果在一個檔案中,存在多個資源,那麼沒有被修改過的資原始檔也會被修改版本號,導致不必要的資源載入。(當然,如果需要加上時間戳之類的,就已經不屬於第一個的範圍了)

2 第二種方式,可以精確的發現哪一個檔案被修改過。從而要求客戶端進行重新載入。但是同樣會存在一些問題。
一般能做到第二種方式的公司,網頁流量自然可以想像(小公司請自動忽略)。
那麼當在釋出版本的時候,會存在兩個型別的檔案需要釋出:
1) html檔案,上面有資原始檔的引用
2 )資原始檔

那麼釋出以上兩個檔案的順序就成問題了。

如果先發 html檔案:
那麼會導致重新載入資源,但一樣還是無法訪問到最新的特性。(畢竟資原始檔還沒有真正的更新。),如是Html頁面的結構有更新,但載入了舊的資源,很有可能導致頁面結構的錯亂。並且會快取資源,直到資源過期,否則除非強制重新整理,會一直是錯誤頁面。(這裡要注意到,由於第一次載入了舊的資源,版本號又是新的版本號,所以即使在這之後上了資源,這裡依舊會讀取舊的資源.)

如果先發資原始檔:
如果之前訪問過頁面,那就會有儲存有本地快取,那麼由於訪問的還是快取檔案,不會出現問題。但如果是新使用者,那麼就會訪問到新的資原始檔,很有可能導致頁面錯亂。而等到頁面html也釋出之後,頁面又恢復了正常。

PS: 當然有的人可能會說,釋出就那麼一會的時間,有必要那麼在乎這些一點點時間麼?
如果你這麼想,那麼我只能說,我無話可說。

發上兩種都是屬於覆蓋式資源釋出,不管如何處理,都會存在這樣的問題。那麼解決方案就是第三種。非覆蓋式釋出。

3 第三種方式,應該是最完美的解決方案:
1 首先發資原始檔,由於檔名已經不一樣了,所以不會覆蓋掉之前存在的資原始檔,客戶端依舊可以安全的訪問。
2 再發客戶端檔案,在客戶端檔案一旦釋出成功,那麼就會立馬切成新的特性,中間可以做到無縫銜接。
這就是所謂的非覆蓋釋出的方案。

相關推薦

[ 前端工程 ] 靜態資源快取處理方式

原問題是: 一般瀏覽器對靜態資源的快取導致的更新不及時問題,我們是怎麼處理的?有哪幾種方式? 為什麼會產生這些方式?(其實就是各種方式的優劣) 之前大家可能都知道 一般的公司對於靜態資源以及快取的處理方式無非就這麼幾種。 1 在靜態資源後面加一個版本

前端靜態資源快取處理

張玉龍大神的兩篇詳細講解: 由此可見,對於靜態資源的快取處理一般有兩種方式: 1.在靜態資源連結後面加版本號引數 2.通過前端構建工具生成檔案hash摘要拼接在檔名後,常用的工具有gulp、fis

架構優化之高效能:web前端效能優化,靜態資源快取,檔案壓縮

web前端效能優化 內容主要來自阿里架構一書。自己總結以及進行實踐 一.瀏覽器訪問優化 1.減少http請求 合併css,合併JS,合併圖片:圖片也可以進行合併,多張圖片合併成一張, 現在的瀏覽器會自動的複用tcp連結,不會剛用完就關閉 2.設定使用瀏覽器快取 靜態資源(如何設定?可

前端靜態資源快取最優解以及max-age的陷阱

原文地址:點這裡 合理的使用快取可以極大地提高網站資源的利用率,還可以節約頻寬從而降低伺服器成本。但是很多站點針對快取的策略並不合理,甚至是完全無作為,如果是這樣,就完全沒有發揮出快取的優勢,而不合理的策略反而很大程度上會導致網站在訪問時會發生由於靜態資源的競

SpringMVC攔截靜態資源處理辦法

gmv css 無法 ring 攔截 配置 無法加載 app htm SpringMVC攔截靜態資源導致 JS CSS 無法加載 可以在配置文件中加入以下代碼 <mvc:resources location="/statices/" mapping="/

Vue打包項目圖片等靜態資源處理

引用 字體 html clas 設置 需要 vendor 出錯 AS   項目打包,默認是打包在根目錄下面的。當然我們可以通過設置,打包到任意子目錄中去。 但是,當項目中引入資源的,比如:引入圖片資源、js資源、或者字體圖標之類的。那麽可能在這個中間又會踩坑。 1、在vue

spring springmvc 展示圖片,靜態資源處理

jsp中顯示一張照片 <img alt="靜態圖片" src="static/目錄.png"> 然後在springmvc的配置中加上 <!--對靜態資源的處理--> <mvc:resources mapping="/static/**" locati

全註解以及靜態資源處理

  全註解的使用方式 application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

nginx之expires靜態資源快取

nginx.conf檔案配置: server { listen 80; server_name xxx.xxx.com; # 通過此語句來對映靜態資源 root /app/xxx/html/; location ~ .*

Nginx靜態資源快取策略配置

1. 問題-背景 以前也經常用nginx,但用的不深,通常是簡單的設定個location用來做反向代理。直到今天給客戶做專案碰到快取問題:客戶有個app,只是用原生做了個殼,裡面的內容都是用h5寫的,我們半途接手將新版本靜態資源部署到伺服器上後,發現手機端一直顯示老的頁

Kubernetes 針對資源緊缺處理方式的配置_Kubernetes中文社群

如何在資源緊缺的情況下,保證 Node 的穩定性,是 Kubelet 需要面對的一個重要的問題。尤其對於記憶體和磁碟這種不可壓縮的資源,緊缺就相當於不穩定。 驅逐策略 Kubelet 能夠監控資源消耗,來防止計算資源被耗盡。一旦出現資源緊缺的跡象,Kubelet 就會主動終止一或多個 Pod

構建多頁面應用——靜態資源處理

load sync icon 矢量圖 limit -o pts web頁面 font 在之前的系列文章中,我已經介紹了如何用webpack實現多頁面應用的js,html,css的處理。今天就主要介紹如何處理靜態資源,在web開發中最常見的靜態資源就是圖片。 圖片的引用方式

springboot下靜態資源處理

在SpringBoot中有預設的靜態資原始檔相關配置,需要通過如下原始碼跟蹤: WebMvcAutoConfiguration-->configureResourceChain(method)-->ResourceProperties中配置了預設的靜態資源路徑:

Springmvc知識三------重定向&表單標籤&靜態資源處理

重定向 在一般情況下,我們的控制器方法返回字串型別值,會被封裝成一個ModelAndView,然後被當做邏輯檢視名稱進行處理。但是如果返回的字串中以“forward:”和“redirect:”開頭時,Springmvc將會對他們做特殊處理,將redirect當

springmvc對靜態資源處理

<servlet>     <servlet-name>mvc</servlet-name>     <servlet-class>org.s

Nginx + Apache 配置反向代理和靜態資源快取

Nginx處理靜態內容是把好手,Apache雖然佔用記憶體多了點,效能上稍遜,但一直比較穩健。倒是Nginx的FastCGI有時候會出現502 Bad Gateway錯誤。一個可選的方法是Nginx做前端代理,處理靜態內容,動態請求統統轉發給後端Apache。Ngi

VUE 爬坑之旅 -- 引入靜態資源的正確方式

在 Vue 專案中,靜態資原始檔有二個位置可以存放,分別為 src 裡面的 assets 資料夾和外層的 static 資料夾,從資料夾名字上面就可以大概的看出有何區別。 assets :資產,資源 static :靜態的 同樣都是放資源的位置,為什麼會有二

springMVC攔截靜態資源處理方法

由於web.xml的攔截器配置如下:<!-- springmvc前臺的控制器 --> <servlet> <servlet-name>taotao-manage</servlet-name> <servlet-c

變態的靜態資源快取與更新(超詳細好文)

這是一個非常有趣的 非主流前端領域,這個領域要探索的是如何用工程手段解決前端開發和部署優化的綜合問題,入行到現在一直在學習和實踐中。 在我的印象中,facebook是這個領域的鼻祖,有興趣、有梯子的同學可以去看看facebook的頁面原始碼,體會一下什麼叫工程化。

Spring MVC 攔截器配置及使用(包括靜態資源處理)

springmvc攔截器能夠對請求的資源路徑進行攔截,極大的簡化了攔截器的書寫。但是,千萬千萬要注意一點:靜態資源的放行。 關於靜態資源的放行,主要有三種方式: 1、修改請求的url地址。  如果請求的url地址都是以*.do結尾,那麼攔截器中的配置可以變為攔截以do