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