摘要:雖然如此,但是網(wǎng)站前端性能優(yōu)化的思路基本沒(méi)變。為什么前端性能如此重要數(shù)據(jù)顯示只有的最終用戶(hù)響應(yīng)時(shí)間花在了下載文檔上。前端性能優(yōu)化一味奉行最佳實(shí)踐有時(shí)候反而過(guò)而不及,所以針對(duì)項(xiàng)目的實(shí)際情況來(lái)優(yōu)化才是明智的選擇。
前端近幾年變化很大,各種工具,庫(kù),框架并發(fā)。雖然如此,但是網(wǎng)站前端性能優(yōu)化的思路基本沒(méi)變。
為什么前端性能如此重要?數(shù)據(jù)顯示:
只有 10%~20% 的最終用戶(hù)響應(yīng)時(shí)間花在了下載 HTML 文檔上。其余的 80%~90% 時(shí)間花在了下載頁(yè)面中的所有組件中;
另外一點(diǎn)是,優(yōu)化后臺(tái)需要花費(fèi)比較大的成本,優(yōu)化前端只需要適當(dāng)?shù)刈裱恍┓▌t會(huì)有較大的提升,相對(duì)低成本高收益。
最近讀了 Steve Souders 的《高性能網(wǎng)站建設(shè)指南》,覺(jué)得很不錯(cuò)在此做一下總結(jié)。Steve 是 Firebug 和 Yslow 的作者,相信大家都使用過(guò)。雖然書(shū)中的很多手段都已經(jīng)過(guò)時(shí)了,但是思路基本沒(méi)變,取其精華就好。
本書(shū)提出了一套性能黃金法則,優(yōu)先級(jí)越高排名越前,一共14則:
1. 減少HTTP請(qǐng)求 2. 使用內(nèi)容發(fā)布網(wǎng)絡(luò)(CDN) 3. 添加Expires頭 4. 壓縮組件 5. 將樣式表放在頂部 6. 將腳本放在底部 7. 避免使用CSS表達(dá)式 8. 使用外部JavaScript和CSS 9. 減少DNS查找 10. 精簡(jiǎn)JavaScript 11. 避免重定向 12. 刪除重復(fù)的腳本 13. 配置ETag 14. 使Ajax可緩存
以下分別簡(jiǎn)單介紹每條法則的緣由:
1. 減少HTTP請(qǐng)求一般來(lái)說(shuō),使用外鏈的腳本和樣式表更加有利。分別把外鏈腳本和樣式表進(jìn)行合并會(huì)減少HTTP請(qǐng)求,以節(jié)省客戶(hù)端和服務(wù)器之間的通訊次數(shù)來(lái)加快頁(yè)面打開(kāi)速度。但是出于開(kāi)發(fā)的便利,開(kāi)發(fā)的時(shí)候一般會(huì)采取模塊化的方式;這時(shí)候可以在部署前采用一些前端構(gòu)建工具把這些模塊文件合并起來(lái)再發(fā)布。
2. 使用內(nèi)容發(fā)布網(wǎng)絡(luò)(CDN)CDN是一組分布在多個(gè)不同地理位置的Web服務(wù)器,由于距離用戶(hù) 物理距離比較短,所以能夠更加有利于用戶(hù)獲取到靜態(tài)資源;這種服務(wù)通常需要購(gòu)買(mǎi),也有一些免費(fèi)、通用的CDN可使用,國(guó)內(nèi)的可以使用 BootCDN。
3. 添加Expires頭Expires頭是用來(lái)告訴瀏覽器該相應(yīng)的有效期,可以理解為該資源的“保質(zhì)期”,在期限內(nèi)可以使用該資源的緩存不需要重新請(qǐng)求。由于瀏覽器與服務(wù)器存在時(shí)鐘同步問(wèn)題,HTTP1.1還添加胡了Cache-Control和max-age來(lái)彌補(bǔ)Expires頭的不足。通常用于腳本,樣式表、圖片等靜態(tài)資源。
使用這種策略可能會(huì)遇到一個(gè)問(wèn)題是,開(kāi)發(fā)者可能想要在資源過(guò)期前這段時(shí)間更新它們。這時(shí)候,由于瀏覽器的緩存還沒(méi)失效,這就需要通過(guò)更改文件名來(lái)令靜態(tài)資源 強(qiáng)制失效。有很多種方式給靜態(tài)資源打上版本號(hào),可以一本正經(jīng)地打上數(shù)字版本號(hào),根據(jù)內(nèi)容生成哈希碼也行,甚至有人用π來(lái)給自己的資源打版本號(hào)(每次。
4. 壓縮組件本書(shū)介紹的是gzip的方式壓縮靜態(tài)資源,實(shí)際上,這種方式會(huì)消耗額外的CPU資源。這種手段通常能夠使文件大小減少70%。
5. 將樣式表放在頂部如果把樣式表放在底部時(shí),瀏覽器會(huì)延遲顯示任何可視化組件。另外,使用 CSS 的@import 等同于把想要加載的樣式放在底部,所以不建議使用。對(duì)于瀏覽器的渲染機(jī)制,本書(shū)并沒(méi)有過(guò)多提及,只是對(duì)現(xiàn)象做出了描述以及提供了解決辦法。
如果樣式表仍然在加載,構(gòu)建呈現(xiàn)樹(shù)就是一種浪費(fèi),因?yàn)樵谒袠邮奖砑虞d并解析完畢之前無(wú)需繪制任何東西。否則,在其準(zhǔn)備好之前顯示內(nèi)容會(huì)遇到 FOUC(無(wú)樣式內(nèi)容的閃爍,F(xiàn)lash of Unstyled Content)問(wèn)題。
就是說(shuō),如果不把樣式表放在 中,當(dāng)遇到樣式時(shí),瀏覽器就會(huì)阻止頁(yè)面呈現(xiàn),等待樣式表下載完畢。
如果把樣式表放在底部,在 IE 中還會(huì)產(chǎn)生白屏現(xiàn)象??傊褬邮奖矸胚M(jìn) 就能避免這些問(wèn)題。
6. 將腳本放在底部腳本對(duì)頁(yè)面的影響是:
阻塞對(duì)齊后面內(nèi)容的呈現(xiàn)
阻塞后面組件的下載
瀏覽器會(huì)在下載腳本的時(shí)候阻塞并行下載,因?yàn)樾枰_保腳本能夠順序執(zhí)行。
關(guān)于這點(diǎn),這里有一篇講解的比較深入的文章:
JS 一定要放在 Body 的最底部么?聊聊瀏覽器的渲染機(jī)制
但是,實(shí)際開(kāi)發(fā)中有時(shí)候很難完全遵守這條準(zhǔn)則,那只能把能夠放在最后的都放在最后。
7. 避免使用CSS表達(dá)式使用CSS 的expression()通常會(huì)造成多次運(yùn)算。實(shí)際上,需要用到CSS 表達(dá)式的地方,通常能夠找到其他替代方案,所以避免使用CSS表達(dá)式。
8. 使用外部JavaScript和CSS使用外部靜態(tài)文件的優(yōu)點(diǎn)有:
可以被瀏覽器緩存起來(lái)
組件可以重用
可模塊化
能夠被構(gòu)建(合并壓縮打版本)
...
缺點(diǎn):
需要額外創(chuàng)建HTTP 請(qǐng)求
...
9. 減少DNS查找簡(jiǎn)單來(lái)說(shuō),DNS 查找就是輸入域名對(duì)服務(wù)器IP 地址的查找過(guò)程。DNS 緩存又分為瀏覽器DNS 緩存、操作系統(tǒng)DNS 緩存。當(dāng)你輸入 www.google.com 的時(shí)候,瀏覽器會(huì)先去自身的 DNS 緩存里面查找有沒(méi)有 google 服務(wù)器的 IP 地址;如果找不到則繼續(xù)到操作系統(tǒng)的 DNS 緩存查找;如果瀏覽器在這兩個(gè)容器都沒(méi)有找到 google 的IP 地址記錄,則會(huì)向廣域域名體系查找。
10. 精簡(jiǎn)JavaScript減少JavaScript 文件大小的有幾種手段,通常被廣泛使用的是 精簡(jiǎn)。精簡(jiǎn)就是去除JavaScript 代碼中的空格、注釋等多余的字符,這種方式基本上沒(méi)有什么缺點(diǎn)。
另外一種方式是 混淆?;煜窃诰?jiǎn)的基礎(chǔ)上,把函數(shù)、變量名都用較短小的字符來(lái)替換,從而達(dá)到減少文件大小的效果。但是混淆會(huì)產(chǎn)生不少麻煩,很有可能會(huì)引入錯(cuò)誤,雖然有利于防止逆向工程,當(dāng)同時(shí)也增加了自己在線(xiàn)上環(huán)境調(diào)試的難度。
現(xiàn)在普遍的做法是發(fā)布前利用 Gulp、Grunt 等自動(dòng)化構(gòu)建工具對(duì)資源進(jìn)行壓縮。
11. 避免重定向以下是一個(gè)重定向的過(guò)程:
瀏覽器發(fā)送請(qǐng)求 -- 服務(wù)器返回302 -- 服務(wù)器返回200 -- 瀏覽器開(kāi)始呈現(xiàn)
就是說(shuō),在發(fā)送請(qǐng)求到返回200這段時(shí)間,頁(yè)面完全是空白的;對(duì)比普通的請(qǐng)求多了一段空白時(shí)間。
12. 刪除重復(fù)的腳本重復(fù)的腳本對(duì)增加HTTP 請(qǐng)求次數(shù)和腳本執(zhí)行的時(shí)間。
13. 配置ETag這個(gè)規(guī)則應(yīng)該過(guò)時(shí)了,現(xiàn)在比較好的實(shí)踐是直接根據(jù)內(nèi)容給靜態(tài)資源打上哈希版本號(hào)。
14. 使Ajax可緩存適用于以上的優(yōu)化,大部分同樣適用于Ajax請(qǐng)求。
總結(jié):總的來(lái)說(shuō),前端優(yōu)化的總體思路是提高瀏覽器與服務(wù)器溝通的效率。
前端性能優(yōu)化一味奉行“最佳實(shí)踐”有時(shí)候反而過(guò)而不及,所以針對(duì)項(xiàng)目的實(shí)際情況來(lái)優(yōu)化才是明智的選擇。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/78971.html
摘要:前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。前端性能優(yōu)化前端性能團(tuán)隊(duì)總結(jié)的條黃金定律的團(tuán)隊(duì)總結(jié)出了一系列可以提高網(wǎng)站速度的方法。提高性能的措施中最重要的方法就是使響應(yīng)具有可緩存性。 前端是龐大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各種各樣的資源。前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。那么,前端優(yōu)化的目的是什么 ?Tips...
摘要:前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。前端性能優(yōu)化前端性能團(tuán)隊(duì)總結(jié)的條黃金定律的團(tuán)隊(duì)總結(jié)出了一系列可以提高網(wǎng)站速度的方法。提高性能的措施中最重要的方法就是使響應(yīng)具有可緩存性。 前端是龐大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各種各樣的資源。前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。那么,前端優(yōu)化的目的是什么 ?Tips...
摘要:前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。前端性能優(yōu)化前端性能團(tuán)隊(duì)總結(jié)的條黃金定律的團(tuán)隊(duì)總結(jié)出了一系列可以提高網(wǎng)站速度的方法。提高性能的措施中最重要的方法就是使響應(yīng)具有可緩存性。 前端是龐大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各種各樣的資源。前端優(yōu)化是復(fù)雜的,針對(duì)方方面面的資源都有不同的方式。那么,前端優(yōu)化的目的是什么 ?Tips...
打算現(xiàn)在開(kāi)始在博客里寫(xiě)點(diǎn)東西,也能為自己看過(guò)的書(shū)學(xué)過(guò)的知識(shí)做一個(gè)歸納總結(jié)。這幾日拜讀了Steve Souders的《高性能網(wǎng)站建設(shè)指南這本書(shū)》,雖然這本書(shū)可能已經(jīng)有些老了,但薄薄的一個(gè)小冊(cè)子里提出的網(wǎng)站性能優(yōu)化的準(zhǔn)則還是非常有價(jià)值的。這些規(guī)則都有個(gè)共同點(diǎn),就是用很小的工作就能獲得很明顯的性能提升,性?xún)r(jià)比極高。廢話(huà)不多說(shuō)了,總結(jié)一下書(shū)里的幾點(diǎn)性能優(yōu)化規(guī)則。 首先有一點(diǎn)需要說(shuō)明的是書(shū)中所寫(xiě)的性能黃金法...
摘要:譯十六進(jìn)制顏色揭秘原文地址原文作者譯文出自掘金翻譯計(jì)劃本文永久鏈接教程入門(mén)篇關(guān)于是一款進(jìn)行柵格布局的輔助工具,它讓開(kāi)發(fā)者擺脫了冗雜的數(shù)學(xué)計(jì)算,同時(shí)降低了樣式與結(jié)構(gòu)的耦合程度。 【譯】CSS 十六進(jìn)制顏色揭秘 原文地址:CSS Hex Colors Demystified 原文作者:Dave Gash 譯文出自:掘金翻譯計(jì)劃 本文永久鏈接:https://github.com/xitu/...
閱讀 2519·2021-10-09 09:44
閱讀 3908·2021-09-22 15:43
閱讀 2998·2021-09-02 09:47
閱讀 2660·2021-08-12 13:29
閱讀 3942·2019-08-30 15:43
閱讀 1747·2019-08-30 13:06
閱讀 2250·2019-08-29 16:07
閱讀 2816·2019-08-29 15:23