最新的 Google Android 用戶行爲分析中,獲得如下幾個數據css
PWA(Progressive Web App)給用戶原生APP的體驗,其實不難發現PWA核心就是創建在離線緩存和後臺數據交互基礎上構建的嶄新的Web app,使其具有了Native App的部分特性。那麼從緩存開始咱們一步步在技術上組裝PWA服務。爲了使本篇教程更多的朋友能舉一反三,咱們技術棧儘可能從淺入深。前端
前端工程化的發展,意味着產品的重點從原來的功能體驗,愈來愈升級到用戶體驗。從早期的代碼壓縮,到減小http請求,異步加載,經過CDN的內容分發,緩存等技術的綜合應用,從幾十秒到幾十毫秒的優化而費盡心思。這些應用體驗只是爲了「秒開」頁面。node
爲了達到秒開的效果,必然要在客戶端作持久的離線緩存,HTML5的離線緩存就是最主要的特性之一,2014年W3C就開始提倡ServiceWorker,爲了更好的理解ServiceWorker咱們就要從離線緩存控制環節一步步揭開它的面紗,先讓咱們回顧一下HTML5控制離線緩存的各類方式吧。nginx
隨着HTTP1.1的協議最先使用的緩存機制,經過HTTP頭來控制用戶代理(瀏覽器)是否把頭對應的文件進行緩存,緩存多長時間。經過HTTP RESPONSE HEADERS屬性來控制頁面加載的元素緩存。web
Cache-Control 服務端緩存控制來控制元素的加載後端
課程中咱們使用Chrome瀏覽器,前端工程化
1. 打開 [baidu.com](https://baidu.com)瀏覽器
2. 打開開發者工具 Ctrl+Shift+i緩存
3. 點擊頂部NetWork服務器
4. 選擇下面的加載列表
能夠看到頁面加載的全部URI資源的屬性,固然咱們如今更關注的是緩存,那麼請注意右側的Cache-Control的屬性:
Cache-Control 屬性告訴用戶代理緩存機制是否能夠緩存及哪一種類型。他包含如下值:
– public 全部內容都將被緩存(客戶端和代理服務器均可緩存)
– private 內容只緩存到私有緩存中(僅客戶端能夠緩存,瀏覽器不可緩存)
– no-cache 不緩存
– no-store 全部內容都不會被緩存
– must-revalidation/proxy-revalidation 若是緩存的內容失效,請求必須發送到服務器/代理以進行從新驗證
– max-age=xxx (xxx is numeric) 緩存的內容將在 xxx 秒後失效
咱們能夠發現百度首頁把經常使用的資源,都進行了緩存,咱們經過選擇左側的屬性列表也能夠看到幾個不緩存的案例。固然Cache-Control屬性不止這些,推薦你們閱讀如下文檔更多的理解Cache-Control
一、百度百科:[https://baike.baidu.com/item/Cache-control/1885913?fr=aladdin](https://baike.baidu.com/item/Cache-control/1885913?fr=aladdin)
二、MDN: [https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control)
咱們若是查看Google或者Facebook等國外站點不難發現headers頭部沒有cache-control屬性,而變成了strict-transport-security。其實這也是緩存的一種機制,更有利https緩存介入,國內從去年剛剛纔大量普及https,可是用戶習慣輸入http,服務器通常直接作了強制跳轉https資源,這樣存在中間人攻擊潛在威脅,跳轉過程可能被惡意網站利用來直接接觸用戶信息,而不是原來的加密信息。網站經過HTTP Strict Transport Security通知瀏覽器,這個資源禁止使用HTTP方式加載,瀏覽器應該自動把全部嘗試使用HTTP的請求自動替換爲HTTPS請求。
爲了更好的兼容性考慮,如建議使用:
固然在常常修改的內容上咱們也能夠加入這樣的方式進行緩存
但使用這種方式必定要注意,緩存時間是服務器時間,並非用戶代理(瀏覽器)時間。因此若是多個資源都使用了從新加載,咱們沒法保證在同一時間某個資源是沒有被加載的。多個資源間不匹配。頁面崩塌。固然咱們繼續學習下去,後續咱們學習serviceWorker就能夠杜絕這個問題出現。
當下多數公司網站的圖片,js,css等文件的緩存會選擇Nginx的web緩存服務。Nginx的Web緩存服務主要由proxy_cache相關指令集和fastcgi_cache相關指令集構成。
1. proxy_cache相關指令集用於反向代理時,對後端內容源服務器進行緩存.Nginx的proxy_cache緩存功能,十分穩定。
2. fastcgi相關指令集主要用於對FastCGI的動態程序進行緩存.二者功能基本同樣.
固然咱們最後一個問題,這個Headers是怎麼配置的,若是你是前端工程師,你必定會選用Nginx+node的反向代理和負載均衡的方式處理你的業務。一個簡單KOA2的header的配置吧,只須要set一下就ok了,你能夠經過nginx的反向代理控制服務器緩存。甚至咱們會把須要緩存的資源獨立一個Koa進行處理,這樣能發揮更多CDN的能力。
轉載: https://wosclass.com/2019/03/07/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A6%BB%E7%BA%BF%E7%BC%93%E5%AD%98%E6%8A%80%E6%9C%AF/