-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
在實際當(dāng)中,只有 10%~20% 的最終用戶響應(yīng)時間是花在從 Web 服務(wù)器獲取 HTML 文檔并傳送到瀏覽器中的。如果希望能夠有效地減少頁面的響應(yīng)時間,就必須關(guān)注剩下的 80%~90% 的最終用戶體驗。這 80%~90%的時間大部分花在等待組件(圖片、樣式表、腳本 等)的下載,還有一小部分時間花在解析 HTML、腳本和樣式表上面。
如果我們將后端的響應(yīng)時間縮短一半,整體響應(yīng)時間只能減少 5%~10%;而如果關(guān)注前端性能,同樣是將其響應(yīng)時間減少一半,則整體響應(yīng)時間可以減少 40%~45%。改進前端通常只需要較少的時間和資源;而減少后端延遲會帶來很大的改動,比如重新設(shè)計架構(gòu)啥的,這些改動需要花數(shù)周或數(shù)月。
前端性能優(yōu)化(前端性能優(yōu)化有哪些方法)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于前端性能優(yōu)化的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、前端性能優(yōu)化之路——圖片篇。
本人是一名前端開發(fā)者,在公司負責(zé)目前負責(zé)信息流服務(wù),為五大手機廠商和各大App提供服務(wù),每天的請求就是以億計算,加上我們又做了SSP和DSP,就是類似于百度廣告聯(lián)盟,騰訊廣點通這種。接觸過的應(yīng)該知道,所以前端優(yōu)化一直是我頭痛的問題,不僅要注重用戶體驗,同時要兼顧收益,有時候必須犧牲一些用戶體驗,但是作為一名有思想的前端,還是努力規(guī)避掉,希望能和從事相同業(yè)務(wù)的同學(xué)一起學(xué)習(xí)交流一下,話不多說,就來分享我的性能優(yōu)化之路,有什么不對的知識點,麻煩大家指出批評。
yahoo軍規(guī)把大部分的前端優(yōu)化都提到了,而在js優(yōu)化這一塊如果有興趣的額,推薦大家去看《 高性能javascript 》,書里講的非常詳細。 https://segmentfault.com/a/1190000008481413
Media Queries 調(diào)用高清背景圖
通過 devicePixelRatio的值,就可以區(qū)分普通顯示屏和高清屏,當(dāng)devicePixelRatio值等于1時(也就是最小值),那么它普通顯示屏,當(dāng)devicePixelRatio值大于1(通常是1.5、2.0),那么它就是高清顯示屏。這時候我們可以讓UI準(zhǔn)備2套圖片,甚至是3套圖片,不同像素的圖利用媒體查詢結(jié)合 devicePixelRatio 可以區(qū)分普通顯示屏和高清顯示屏,并給出了如下CSS設(shè)計方案:
也可以用less或者sass
如果省時間通用性高,就像我們是服務(wù)端用nginx對圖片進行處理,想要什么樣尺寸的圖片自己裁切,我們提供了按比例縮放和自定尺寸的裁切方法,地址后拼接字符串就行。
與其他圖片格式相比,在肉眼無法分辨圖片質(zhì)量差異的情況下,WebP的空間占用是最小的,目前國內(nèi)外各大互聯(lián)網(wǎng)公司都已經(jīng)開始應(yīng)用這一圖片格式。比如美團
想實現(xiàn)首先是判斷,即識別單次訪問的來源瀏覽器是否支持 webp 格式,其次是執(zhí)行,如果該瀏覽器支持,則將原圖替換為 webp 格式,并返回。如果不支持,則顯示原格式圖片。 http://caniuse.mojijs.com/Home/Html/item/key/webp/index.html
在識別階段,我們有兩種方法:
1. Server 處理
只要有請求,服務(wù)端就能拿到你的User-Agent信息,通過對瀏覽器進行分類,支持webp放在白名單里,不支持的則為黑名單。判斷為白名單,則直接調(diào)用,返回webp格式圖片;反之,則顯示原圖。這種方式的優(yōu)點在于,只需定期維護白名單即可,邏輯簡單;缺點則在于不可擴展、不可測試、UA判斷會出現(xiàn)不準(zhǔn)確的情況。
Server處理中的另一種方式是通過讀取 JavaScript 種下的 cookie來實現(xiàn)判斷。這種方式的優(yōu)點是表現(xiàn)穩(wěn)定,訪問速度更快,切換無壓力。但缺點是,頁面靜態(tài)化會導(dǎo)致用戶切換瀏覽器時不能自主更新,圖片服務(wù)失效。比如用戶用支持webp的瀏覽器A請求頁面,這時緩存的靜態(tài)頁面均使用webp圖片,但當(dāng)該用戶使用不支持webp的瀏覽器B時,訪問網(wǎng)頁則會出現(xiàn)請求不到圖片的報錯。
Client 處理,是美團云為美團主站提供的處理方式。在這種處理方式中,瀏覽器端發(fā)送的beacon webp 請求后,通過檢測其加載情況來判定 webp 支持情況,然后瀏覽器寫一個cookie。之后通過讀取瀏覽器cookie判斷是否支持webp,就可以進行下一步替換操作了。
2.替換圖片過程中也是有兩種處理方式:
在 server 端處理的優(yōu)點是對下游開發(fā)者透明,缺點是靜態(tài)頁面的緩存數(shù)量會翻倍。
替換方式如下:
在 client 端處理可以比較好地應(yīng)對頁面靜態(tài)化的情況,主要針對懶加載(非首屏)的圖片進行處理,直接通過修改懶加載器來實現(xiàn)。
對非懶加載的圖片暫時沒有特別好的辦法。目前,可用替換路徑的方式來處理。
Client 處理實際上效果也是不錯的,美團頁面里90%以上的圖片都是懶加載的,基本上都可以滿足需求。對于大多數(shù)用戶來說,采用Client 處理實現(xiàn)webp轉(zhuǎn)換是個不錯的選擇。
既然提到圖片這一塊,我有忍不住想扯寫些題外的tracking Pixel(像素追蹤),幾乎所有網(wǎng)站都會做數(shù)據(jù)的采集,上報統(tǒng)計。特別是我們做SSP、DSP廣告這塊需要獲取例如
數(shù)據(jù)永遠說的是實話,數(shù)據(jù)證明一切可能。如facebook廣告投放的跨境電商朋友都會使用facebook Pixel(像素追蹤)以獲得各環(huán)節(jié)的精準(zhǔn)數(shù)據(jù)。這樣追蹤數(shù)據(jù)后,我們才能投放廣告后銷量上去了,哪個才是效果最好的,哪個效果不好,進而通過多個數(shù)據(jù)對比,對廣告進行合理的調(diào)整優(yōu)化。
國內(nèi)搜狗、百度、360、新浪都是用這種 tracking Pixel 方法,實際就是利用1px 的圖片,在圖片地址后綴拼接你需要的信息參數(shù),瀏覽器在請求任何資源的時候會發(fā)送當(dāng)前系統(tǒng)的數(shù)據(jù),比如瀏覽器信息,操作系統(tǒng)信息,作為http請求頭送過去,他們就能統(tǒng)計了。
為什么不用js請求統(tǒng)計?
并不是所有的頁面都支持JS的!NoJSStats的實現(xiàn)機制就是網(wǎng)站分析中點擊流數(shù)據(jù)獲取的方式之一——Web Beacons,即在頁面中嵌入一個1像素的透明圖片,當(dāng)該頁面被瀏覽時,圖片就會被請求加載,于是在后端的服務(wù)器日志中就會記錄該圖片的請求日志,這樣就可以獲得日志記錄。
例如百度:
本文引用@美團云 提供的webP方法,感謝。
二、為什么要關(guān)注前端性能優(yōu)化
三、如何進行網(wǎng)站性能優(yōu)化
一、前端優(yōu)化
網(wǎng)站性能優(yōu)化是一個很綜合的話題,涉及到服務(wù)器的配置和網(wǎng)站前后端程序等各個方面,我只是從實際經(jīng)歷出發(fā),分享一下自己所嘗試過的網(wǎng)站性能優(yōu)化方法。之所以在標(biāo)題上掛一個web2.0,是因為本文更偏重于中小網(wǎng)站的性能優(yōu)化,我所使用的系統(tǒng)也是典型web2.0的LAMP架構(gòu)。
首先講講前端的優(yōu)化,用戶訪問網(wǎng)頁的等待時間,有80%是發(fā)生在瀏覽器前端,特別是頁面和頁面中各種元素(圖片、CSS、Javascript、 flash…)的下載之上。因此在很多情況下,相對于把大量的時間花在艱苦而繁雜的程序改進上,前端的優(yōu)化往往能起到事半功倍的作用。雅虎最近將內(nèi)部使用的性能測試工具yslow向第三方公開,并發(fā)布了著名的網(wǎng)站性能優(yōu)化的十三條規(guī)則,建議你下載并安裝yslow,并作為測評網(wǎng)站優(yōu)化效果的工具。下面我挑其中特別有價值的具體說明一下優(yōu)化的方法:
對于第一次訪問您網(wǎng)站,尚未在瀏覽器cache中緩存您網(wǎng)站內(nèi)容的用戶,我們可以做的事情包括:
1)減少一個頁面訪問所產(chǎn)生的http連接次數(shù)
對于第一次訪問你網(wǎng)站的用戶,頁面所產(chǎn)生的http連接次數(shù)是影響性能的一個關(guān)鍵瓶頸。
對策:
- 盡量簡潔的頁面設(shè)計,最大程度減少圖片的使用,通過放棄一些不必要的頁面特效來減少javascript的使用。
- 使用一些優(yōu)化技巧,比如利用圖片的背景位移減少圖片的個數(shù);image map技術(shù);使用Inline images將css圖片捆綁到網(wǎng)頁中。
- 盡量合并js和css文件,減少獨立文件個數(shù)。
2) 使用gzip壓縮網(wǎng)頁內(nèi)容
使用gzip來壓縮網(wǎng)頁中的靜態(tài)內(nèi)容,能夠顯著減少用戶訪問網(wǎng)頁時的等待時間(據(jù)說可達到60%)。主流的web服務(wù)器都支持或提供gzip壓縮,如果使用apache服務(wù)器,只需要在配置文件中開啟 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是靜態(tài)的頁面,使用gzip壓縮都能夠顯著提高服務(wù)器效率并減少帶寬支出,注意圖片內(nèi)容本身已經(jīng)是壓縮格式了,務(wù)必不要再進行壓縮。
3)將CSS放在頁面頂端,JS文件放在頁面底端
CSS的引用要放在html的頭部header中,JS文件引用盡量放在頁面底端標(biāo)簽的后面,主要的思路是讓核心的頁面內(nèi)容盡早顯示出來。不過要注意,一些大量使用js的頁面,可能有一些js文件放在底端會引起一些難以預(yù)料的問題,根據(jù)實際情況適當(dāng)運用即可。
4)使JS文件內(nèi)容最小化
具體來說就是使用一些javascript壓縮工具對js腳本進行壓縮,去除其中的空白字符、注釋,最小化變量名等。在使用gzip壓縮的基礎(chǔ)上,對js內(nèi)容的壓縮能夠?qū)⑿阅茉偬岣?%。
5)盡量減少外部腳本的使用,減少DNS查詢時間
不要在網(wǎng)頁中引用太多的外部腳本,首先,一次dns的解析過程會消耗20-120毫秒的時間;其次,如果在頁面中引用太多的外部文件(如各種廣告、聯(lián)盟等代碼),可能會因為外部文件的響應(yīng)速度而將你的網(wǎng)站拖得很慢。如果不得不用,那么就盡量將這些腳本放在頁腳吧。不過有一點需要提及,就是瀏覽器一般只能并行處理同一域名下的兩個請求,而對于不同子的域名則不受此限制,因此適當(dāng)將本站靜態(tài)內(nèi)容(css,js)放在其他的子域名下(如 static.xxx.com)會有利于提高瀏覽器并行下載網(wǎng)頁內(nèi)容的能力。
對于您網(wǎng)站的經(jīng)常性訪問用戶,主要的優(yōu)化思路就是最大限度利用用戶瀏覽器的cache來減少服務(wù)器的開銷。
1)在header中添加過期時間(Expires Header)
在header中給靜態(tài)內(nèi)容添加一個較長的過期時間,這樣可以使用戶今后訪問只讀取緩存中的文件,而不會與服務(wù)器產(chǎn)生任何的交互。不過這樣做也存在一些問題,當(dāng)圖片、CSS和js文件更新時,用戶如果不刷新瀏覽器,就無法獲得此更新。這樣,我們在對圖片、css和js文件修改時,必須要進行重命名,才能保證用戶訪問到最新的內(nèi)容。這可能會給開發(fā)造成不小的麻煩,因為這些文件可能被站點中的許多文件所引用。flickr提出的解決辦法是通過url rewrite使不同版本號的URL事實上指向同一個文件,這是一個聰明的辦法,因為url級別的操作效率是很高的,可以給開發(fā)過程提供不少便利。
要理解為什么這樣做,必須要了解瀏覽器訪問url時的工作機制:
a. 第一次訪問url時,用戶從服務(wù)器段獲取頁面內(nèi)容,并把相關(guān)的文件(images,css,js…)放在高速緩存中,也會把文件頭中的expired time,last modified, ETags等相關(guān)信息也一同保留下來。
b. 用戶重復(fù)訪問url時,瀏覽器首先看高速緩存中是否有本站同名的文件,如果有,則檢查文件的過期時間;如果尚未過期,則直接從緩存中讀取文件,不再訪問服務(wù)器。
c. 如果緩存中文件的過期時間不存在或已超出,則瀏覽器會訪問服務(wù)器獲取文件的頭信息,檢查last modifed和ETags等信息,如果發(fā)現(xiàn)本地緩存中的文件在上次訪問后沒被修改,則使用本地緩存中的文件;如果修改過,則從服務(wù)器上獲取最新版本。
我的經(jīng)驗,如果可能,盡量遵循此原則給靜態(tài)文件添加過期時間,這樣可以大幅度減少用戶對服務(wù)器資源的重復(fù)訪問。
2)將css和js文件放在獨立外部文件中引用
將css和js文件放在獨立文件中,這樣它們會被單獨緩存起來,在訪問其他頁面時可以從瀏覽器的高速緩存中直接讀取。一些網(wǎng)站的首頁可能是例外的,這些首頁的自身瀏覽可能并不大,但卻是用戶訪問網(wǎng)站的第一印象以及導(dǎo)向到其他頁面的起點,也可能這些頁面本身使用了大量的ajax局部刷新及技術(shù),這時可以將 css和js文件直接寫在頁面中。
3)去掉重復(fù)的腳本
在IE中,包含重復(fù)的js腳本會導(dǎo)致瀏覽器的緩存不被使用,仔細檢查一下你的程序,去掉重復(fù)引用的腳本應(yīng)該不是一件很難的事情。
4)避免重定向的發(fā)生
除了在header中人為的重定向之外,網(wǎng)頁重定向常在不經(jīng)意間發(fā)生,被重定向的內(nèi)容將不會使用瀏覽器的緩存。比如用戶在訪問,服務(wù)器會通過301轉(zhuǎn)向到/,在后面加了一個“/”。如果服務(wù)器的配置不好,這也會給服務(wù)器帶來額外的負擔(dān)。通過配置apache的 alias或使用mod_rewrite模塊等方法,可以避免不必要的重定向。
還有一些,比如使用CDN分發(fā)機制、避免CSS表達式等、避免使用ETags等,因為不太常用,這里就不再贅述了。
做完了上述的優(yōu)化,可以試著用yslow測試一下網(wǎng)頁的性能評分,一般都可以達到70分以上了。
當(dāng)然,除了瀏覽器前端和靜態(tài)內(nèi)容的優(yōu)化之外,還有針對程序腳本、服務(wù)器、數(shù)據(jù)庫、負載的優(yōu)化,這些更深層次的優(yōu)化方法對技術(shù)有更高的要求。本文的后半部分將重點探討后端的優(yōu)化。
二、后端優(yōu)化
上次寫完web2.0網(wǎng)站前端優(yōu)化篇之后,一直想寫寫后端優(yōu)化的方法,今天終于有時間將思路整理了出來。
前端優(yōu)化可以避免我們造成無謂的服務(wù)器和帶寬資源浪費,但隨著網(wǎng)站訪問量的增加,僅靠前端優(yōu)化已經(jīng)不能解決所有問題了,后端軟件處理并行請求的能力、程序運 行的效率、硬件性能以及系統(tǒng)的可擴展性,將成為影響網(wǎng)站性能和穩(wěn)定的關(guān)鍵瓶頸所在。優(yōu)化系統(tǒng)和程序的性能可以從以下的方面來入手:
1)apache、mysql等軟件的配置的優(yōu)化
盡管apache和mysql等軟件在安裝后使用的默認(rèn)設(shè)置足以使你的網(wǎng)站運行起來,但是通過調(diào)整mysql和apache的一些系統(tǒng)參數(shù),還是可以追求更高的效率和穩(wěn)定性。這個領(lǐng)域中有很多專業(yè)的文章和論壇(比如: ),要想掌握也需要進行深入的研究和實踐,這里就不重點討論了。
2)應(yīng)用程序環(huán)境加速
這里僅以我最常應(yīng)用的php開發(fā)環(huán)境為例,有一些工具軟件可以通過優(yōu)化PHP運行環(huán)境來達到提速的目的,其基本原理大致是將PHP代碼預(yù)編譯并緩存起來,而不需要改變?nèi)魏未a,所以比較簡單,可以將php的運行效率提升50%以上。比較常用的php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( )、php accelebrator(),還有收費的Zend Performance Suite
3)將靜態(tài)內(nèi)容和動態(tài)內(nèi)容分開處理
apache是一個功能完善但比較龐大的web server,它的資源占用基本上和同時運行的進程數(shù)呈正比,對服務(wù)器內(nèi)存的消耗比較大,處理并行任務(wù)的效率也一般。在一些情況下,我們可以用比較輕量級的web server來host靜態(tài)的圖片、樣式表和javascript文件,這樣可以大大提升靜態(tài)文件的處理速度,還可以減少對內(nèi)存占用。我使用的web server是來自俄羅斯的nginx,其他選擇方案還包括lighttpd和thttpd等。
4)基于反向代理的前端訪問負載均衡
當(dāng)一臺前端服務(wù)器不足以應(yīng)付用戶訪問時,通過前端機實現(xiàn)web訪問的負載均衡是最快速可行的方案。通過apache的mod_proxy可以實現(xiàn)基于反向代理的負載均衡,這里推薦使用nginx做代理服務(wù)器,處理速度較apache更快一些。
5)應(yīng)用緩存技術(shù)提高數(shù)據(jù)庫效能,文件緩存和分布式緩存
數(shù)據(jù)庫訪問處理并發(fā)訪問的能力是很多網(wǎng)站應(yīng)用的關(guān)鍵瓶頸,在想到使用主從結(jié)構(gòu)和多farm的方式構(gòu)建服務(wù)器集群之前,首先應(yīng)該確保充分使用了數(shù)據(jù)庫查詢的緩存。一些數(shù)據(jù)庫類型(如mysql的innoDB)自身內(nèi)置對緩存的支持,此外,還可以利用程序方法將常用的查詢通過文件或內(nèi)存緩存起來。比如通過 php中的ob_start和文件讀寫函數(shù)可以很方便的實現(xiàn)文件形式的緩存,而如果你擁有多臺服務(wù)器,可以通過memcache技術(shù)通過分布式共享內(nèi)存來對數(shù)據(jù)庫查詢進行緩存,不僅效率高而且擴展性好,memcache技術(shù)在livejournal和Craigslist.org等知名網(wǎng)站應(yīng)用中都得到了檢驗。
6)服務(wù)器運行狀態(tài)的檢測,找到影響性能的瓶頸所在
系統(tǒng)優(yōu)化沒有一勞永逸的方法,需要通過檢測服務(wù)器的運行狀態(tài)來及時發(fā)現(xiàn)影響性能的瓶頸,以及可能存在的潛在問題,因為網(wǎng)站的性能,永遠取決于木桶中的短板??梢跃帉懸恍┠_本來檢測web服務(wù)的運行,也有一些開源的軟件也提供了很好的功能
7)良好的擴展架構(gòu)是穩(wěn)定和性能的基礎(chǔ)
一些技巧和竅門可以幫你度過眼前的難關(guān),但要想使網(wǎng)站具備應(yīng)付大規(guī)模訪問的能力,則需要從系統(tǒng)架構(gòu)上進行徹底的規(guī)劃,好在很多前人無私的把他們架構(gòu)
網(wǎng)站的經(jīng)驗分享給我們,使我們可以少走甚多彎路。我最近讀到的兩篇有啟發(fā)的文章:
- 從LiveJournal后臺發(fā)展看大規(guī)模網(wǎng)站性能優(yōu)化方法
- Myspace的六次重構(gòu)
最后不得不提到程序編碼和數(shù)據(jù)庫結(jié)構(gòu)對性能的影響,一系列糟糕的循環(huán)語句,一個不合理的查詢語句、一張設(shè)計不佳的數(shù)據(jù)表或索引表,都足以會使應(yīng)用程序運行的速度成倍的降低。培養(yǎng)全局思考的能力,養(yǎng)成良好的編程習(xí)慣,并對數(shù)據(jù)庫運行機制有所了解,是提高編程質(zhì)量的基礎(chǔ)。
四、☆前端優(yōu)化:瀏覽器緩存技術(shù)介紹
在前端開發(fā)中,性能一直都是被大家所重視的一點,然而判斷一個網(wǎng)站的性能最直觀的就是看網(wǎng)頁打開的速度。 其中提高網(wǎng)頁反應(yīng)速度的一個方式就是使用緩存 。緩存技術(shù)一直一來在WEB技術(shù)體系中扮演非常重要角色,是快速且有效地提升性能的手段。
一個優(yōu)秀的緩存策略可以縮短網(wǎng)頁請求資源的距離,減少延遲,并且由于緩存文件可以重復(fù)利用,還可以減少帶寬,降低網(wǎng)絡(luò)負荷。
所以,緩存技術(shù)是無數(shù)WEB開發(fā)從業(yè)人員在工作過程中不可避免的一大問題。 在產(chǎn)品開發(fā)的時候我們總是想辦法避免緩存產(chǎn)生,而在產(chǎn)品發(fā)布之時又在想策略管理緩存提升網(wǎng)頁的訪問速度 。了解瀏覽器的緩存命中原理,是開發(fā)WEB應(yīng)用的基礎(chǔ),本文著眼于此,學(xué)習(xí)瀏覽器緩存的相關(guān)知識,總結(jié)緩存避免和緩存管理的方法,結(jié)合具體的場景說明緩存的相關(guān)問題。希望能對有需要的人有所幫助。
在實際WEB開發(fā)過程中,緩存技術(shù)會涉及到不同層、不同端,比如:用戶層、系統(tǒng)層、代理層、前端、后端、服務(wù)端等, 每一層的緩存目標(biāo)都是一致的,就是盡快返回請求數(shù)據(jù)、減少延遲 ,但每層使用的技術(shù)實現(xiàn)是各有不同,面對不同層、不同端的優(yōu)劣,選用不同的技術(shù)來提升系統(tǒng)響應(yīng)效率。所以,我們首先看下各層的緩存都有哪些技術(shù),都緩存哪些數(shù)據(jù),從整體上,對WEB的緩存技術(shù)進行了解,如下圖所示:
本篇文章重點講的就是上面紅色框部分緩存內(nèi)容。
當(dāng)瀏覽器請求一個網(wǎng)站的時候,會加載各種各樣的資源,比如:HTML文檔、圖片、CSS和JS等文件。對于一些不經(jīng)常變的內(nèi)容,瀏覽器會將他們保存在本地的文件中,下次訪問相同網(wǎng)站的時候,直接加載這些資源,加速訪問。
那么如何知曉瀏覽器是讀取了緩存還是直接請求服務(wù)器?如下圖網(wǎng)站來做個示例:
第一次打開該網(wǎng)站后,如果再次刷新頁面。會發(fā)現(xiàn)瀏覽器加載的眾多資源中,有一部分size有具體數(shù)值,然而還有一部分請求,比如圖片、css和js等文件并沒有顯示文件大小,而是顯示了 from dis cache 或者 from memory cache 字樣。這就說明了,該資源直接從本地硬盤或者瀏覽器內(nèi)存讀取,而并沒有請求服務(wù)器。
瀏覽器啟用緩存至少有兩點顯而易見的好處: (1)減少頁面加載時間;(2)減少服務(wù)器負載;
瀏覽器是否使用緩存、緩存多久,是由服務(wù)器控制的 。準(zhǔn)確來說,當(dāng)瀏覽器請求一個網(wǎng)頁(或者其他資源)時, 服務(wù)器發(fā)回的響應(yīng)的「響應(yīng)頭」部分的某些字段指明了有關(guān)緩存的關(guān)鍵信息 。下面看下,HTTP報文中與緩存相關(guān)的首部字段:
根據(jù)上面四種類型的首部字段不同使用策略, 瀏覽器中緩存可分為強緩存和協(xié)商緩存 :
當(dāng)瀏覽器對某個資源的請求命中了強緩存時, 返回的HTTP狀態(tài)為200 ,在chrome的開發(fā)者工具的network里面 size會顯示為from cache ,比如:京東的首頁里就有很多靜態(tài)資源配置了強緩存,用chrome打開幾次,再用f12查看network,可以看到有不少請求就是從緩存中加載的:
Expires是HTTP 1.0提出的一個表示資源過期時間的header,它描述的是一個絕對時間,由服務(wù)器返回,用GMT格式的字符串表示 ,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT,包含了Expires頭標(biāo)簽的文件,就說明瀏覽器對于該文件緩存具有非常大的控制權(quán)。
例如,一個文件的Expires值是2020年的1月1日,那么就代表,在2020年1月1日之前,瀏覽器都可以直接使用該文件的本地緩存文件,而不必去服務(wù)器再次請求該文件,哪怕服務(wù)器文件發(fā)生了變化。
所以, Expires是優(yōu)化中最理想的情況,因為它根本不會產(chǎn)生請求 ,所以后端也就無需考慮查詢快慢。它的緩存原理,如下:
Expires是較老的強緩存管理header, 由于它是服務(wù)器返回的一個絕對時間 ,在服務(wù)器時間與客戶端時間相差較大時,緩存管理容易出現(xiàn)問題, 比如:隨意修改下客戶端時間,就能影響緩存命中的結(jié)果 。所以在HTTP 1.1的時候,提出了一個新的header, 就是Cache-Control,這是一個相對時間,在配置緩存的時候,以秒為單位,用數(shù)值表示 ,如:Cache-Control:max-age=315360000,它的緩存原理是:
Cache-Control描述的是一個相對時間 ,在進行緩存命中的時候, 都是利用客戶端時間進行判斷 ,所以相比較Expires,Cache-Control的緩存管理更有效,安全一些。
這兩個header可以只啟用一個,也可以同時啟用, 當(dāng)response header中,Expires和Cache-Control同時存在時,Cache-Control優(yōu)先級高于Expires :
此外,還可以為 Cache-Control 指定 public 或 private 標(biāo)記。 如果使用 private,則表示該資源僅僅屬于發(fā)出請求的最終用戶,這將禁止中間服務(wù)器(如代理服務(wù)器)緩存此類資源 。對于包含用戶個人信息的文件(如一個包含用戶名的 HTML 文檔),可以設(shè)置 private,一方面由于這些緩存對其他用戶來說沒有任何意義,另一方面用戶可能不希望相關(guān)文件儲存在不受信任的服務(wù)器上。需要指出的是,private 并不會使得緩存更加安全,它同樣會傳給中間服務(wù)器(如果網(wǎng)站對于傳輸?shù)陌踩砸蠛芨?,?yīng)該使用傳輸層安全措施)。 對于 public,則允許所有服務(wù)器緩存該資源 。通常情況下,對于所有人都可以訪問的資源(例如網(wǎng)站的 logo、圖片、腳本等), Cache-Control 默認(rèn)設(shè)為 public 是合理的 。
當(dāng)瀏覽器對某個資源的請求沒有命中強緩存, 就會發(fā)一個請求到服務(wù)器,驗證協(xié)商緩存是否命中,如果協(xié)商緩存命中,請求響應(yīng)返回的http狀態(tài)為304并且會顯示一個Not Modified的字符串 ,比如你打開京東的首頁,按f12打開開發(fā)者工具,再按f5刷新頁面,查看network,可以看到有不少請求就是命中了協(xié)商緩存的:
查看單個請求的Response Header, 也能看到304的狀態(tài)碼和Not Modified的字符串,只要看到這個就可說明這個資源是命中了協(xié)商緩存,然后從客戶端緩存中加載的 ,而不是服務(wù)器最新的資源:
【Last-Modified,If-Modified-Since】的控制緩存的原理,如下 :
【Last-Modified,If-Modified-Since】都是根據(jù)服務(wù)器時間返回的header,一般來說, 在沒有調(diào)整服務(wù)器時間和篡改客戶端緩存的情況下,這兩個header配合起來管理協(xié)商緩存是非常可靠的,但是有時候也會服務(wù)器上資源其實有變化,但是最后修改時間卻沒有變化的情況 ,而這種問題又很不容易被定位出來,而當(dāng)這種情況出現(xiàn)的時候,就會影響協(xié)商緩存的可靠性。 所以就有了另外一對header來管理協(xié)商緩存,這對header就是【ETag、If-None-Match】 。它們的緩存管理的方式是:
Etag和Last-Modified非常相似,都是用來判斷一個參數(shù),從而決定是否啟用緩存。 但是ETag相對于Last-Modified也有其優(yōu)勢,可以更加準(zhǔn)確的判斷文件內(nèi)容是否被修改 ,從而在實際操作中實用程度也更高。
協(xié)商緩存跟強緩存不一樣,強緩存不發(fā)請求到服務(wù)器, 所以有時候資源更新了瀏覽器還不知道,但是協(xié)商緩存會發(fā)請求到服務(wù)器 ,所以資源是否更新,服務(wù)器肯定知道。大部分web服務(wù)器都默認(rèn)開啟協(xié)商緩存,而且是同時啟用【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】,比如apache:
如果沒有協(xié)商緩存,每個到服務(wù)器的請求,就都得返回資源內(nèi)容,這樣服務(wù)器的性能會極差。
【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】一般都是同時啟用,這是為了處理Last-Modified不可靠的情況。有一種場景需要注意:
比如,京東頁面的資源請求,返回的repsonse header就只有Last-Modified,沒有ETag:
協(xié)商緩存需要配合強緩存使用,上面這個截圖中,除了Last-Modified這個header,還有強緩存的相關(guān)header, 因為如果不啟用強緩存的話,協(xié)商緩存根本沒有意義 。
如果資源已經(jīng)被瀏覽器緩存下來,在緩存失效之前,再次請求時,默認(rèn)會先檢查是否命中強緩存,如果強緩存命中則直接讀取緩存,如果強緩存沒有命中則發(fā)請求到服務(wù)器檢查是否命中協(xié)商緩存,如果協(xié)商緩存命中,則告訴瀏覽器還是可以從緩存讀取,否則才從服務(wù)器返回最新的資源。其瀏覽器判斷緩存的詳細流程圖,如下:
以上就是關(guān)于前端性能優(yōu)化相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
杭州的前端開發(fā)好找嗎(杭州的前端開發(fā)好找嗎工資高嗎)
前端好學(xué)嗎(前端培訓(xùn)班出來能找到工作嗎)
前端開發(fā)培訓(xùn)一般幾個月(前端開發(fā)培訓(xùn)機構(gòu)推薦)
優(yōu)居跟吉屋網(wǎng)的關(guān)系是什么(優(yōu)居跟吉屋網(wǎng)的關(guān)系是什么呢)