在前端開發中如何提高網站性能是每一個前端工程師必須所考慮的內容。經過閱讀《高性能網站建設指南》加深了對提高網站性能的各類方法的認識,同時在從此的開發中也能更好的運用。javascript
使用場景:css
缺點:html
內容發佈網絡(CDN)是一組分佈在多個不一樣地理位置的Web服務器,用於更加有效地向用戶發佈內容。
經常使用的CDN有:前端
頁面中都包含大量的組件,經過web服務器使用一個長久的expires頭,使得這些組件能夠被緩存,這樣在後續頁面中避免沒必要要的HTTP請求
缺點:要求服務器和客戶端的時間嚴格同步,過時日期須要檢查,並提供新日期
HTTP1.1引入Cache-Control頭來克服Expires頭的限制
cache-control使用max-age指令
max-age請求的內容過多久過時(相對於請求時間Date)失效,默認以秒爲單位
具體的過時時間配置可在Apache配置文件中添加mod_expires.c配置信息。java
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "now plus 1 month" ExpiresByType application/x-javascript "now plus 5 day" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/bmp "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType image/png "access plus 1 minutes" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresDefault "now plus 1 minutes" </IfModule>
配置信息可參考Apache Module mod_expiresnode
經過開啓gzip壓縮來減少HTTP響應數據包的大小
值得壓縮的內容有HTML xml css js json
不應壓縮的內容圖片 pdf,他們在上傳到服務器的時候通常就已壓縮好,再壓縮只會浪費CPU
經過配置Apache 2.x的mod_deflate模塊web
<IfModule mod_deflate.c> DeflateCompressionLevel 6 SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/json <IfModule mod_setenvif.c> BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </IfModule> </IfModule>
配置信息可參考Apache Module mod_deflateajax
將樣式表放在head標籤裏能夠避免白屏,這樣瀏覽器能更快的展示內容,用戶體驗更好
而將樣式表放在底部會致使瀏覽器阻止內容逐步呈現,爲避免當樣式變化時重繪頁面,瀏覽器會延遲顯示頁面中的元素express
在下載腳本時瀏覽器會阻塞並行下載,緣由:apache
將腳本放到頁面底部,這不會阻止頁面內容呈現並且頁面中的可視組件能儘早下載
表達式的問題在於對其進行的求值的頻率比人們指望的要高,它們不僅在頁面呈現和大小改變時求值,當頁面滾動、甚至用戶鼠標在頁面上移過期都要被求值。頻繁地求值計算會致使性能底下
解決方法:
好處:
方法:
經過精簡從代碼中移除沒必要要的字符,註釋,空白符等,從而達到減少請求文件大小的目的
在實際開發中通常將js和css經過工具壓縮爲min文件
常見的重定向狀態碼有:
重定向會延長從發出請求到請求資源被下載的這段時間
有一種重定向最浪費也發生的很頻繁 缺乏結尾的斜線
當缺乏結尾的斜線時它容許自動索引(自動轉到默認的index.html)而且可以得到與當前目錄相關的URL
避免重定向方法
重複腳本損傷性能的兩種方式
Etag是web服務器和瀏覽器用於確認緩存組件的有效性的一種機制
服務器在檢測緩存的組件是否和原始服務器上的組件匹配時有兩種方式:
原始服務器經過Last-Modified響應頭來返回組件的最新修改日期
當組件第一次被請求成功後瀏覽器緩存了該組件以及它的最新修改日期(容許緩存),當再次請求該組件時,瀏覽器會使用If-Modified-Since頭將最新修改時間和原始服務器上該組件的最新修改時間進行比較,若是相同則返回一個304,而不傳輸數據,瀏覽器將使用緩存數據。
ETag是惟一標識了一個組件的一個特性版本的字符串
ETag:"24-54c6a9bd53bd1"
當組件第一次被請求成功後瀏覽器緩存了該組件以及它的最新修改日期(容許緩存)還有ETag信息,當再次請求該組件時,瀏覽器會使用If-None-Match頭將ETag和原始服務器上該組件的ETag進行比較,若是相同則返回一個304,而不傳輸數據,瀏覽器將使用緩存數據。
當你使用服務器集羣時,相同的組件從一臺服務器帶另外一臺服務器,Aapache和IIS產生的ETag是不一樣的,這樣組件下載次數將增長,致使性能降低
當If-None-Match比If-Modified-Since共存時,只有If-Modified-Since和If-None-Match在徹底匹配時,服務器才能返回304。不然因爲If-None-Match比If-Modified-Since具備更高的優先級,ETag不一樣,服務器就會返回200
FileEtag INode Mtime Size INode:文件的索引節點(inode)數 MTime:文件的最後修改日期及時間 Size:文件的字節數 All:全部存在的域,等價於:FileETag INode MTime Size None:移除ETag
有網友建議只是用MTime和Size就行了,有待驗證
FileETag none
若是使用ajax向服務器發起大量的GET請求則能夠爲其請求的資源設置長久的expires頭