減小響應時間。javascript
瀏覽器是根據域(Domain)來緩存內容資源的,只要域不同,那麼它就須要重複下載這些資源,並且使用一樣的方式將它們緩存起來。css
帶來的問題:重複地下載,這會佔用網絡資源和緩存空間。html
若是有不少站點,它們之間能夠共享某些內容(例如javascript,css,image等),那麼與其每一個站點放一份,就不如將他們統一地存在在一個地方,這樣就能夠減小下載的次數和緩存的體積了。java
如:引用jquery cdnjquery
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
使內容具備緩存性web
Expires: Thu, 01 Dec 1994 16:00:00 GMT (必須是GMT格式)ajax
經過HTTP的META設置expires和cache-control算法
<meta http-equiv="Cache-Control" content="max-age=7200" /> <meta http-equiv="Expires" content="Mon, 20 Jul 2009 23:00:00 GMT" />
上述設置僅爲舉例,實際使用其一便可。這樣寫的話僅對該網頁有效,對網頁中的圖片或其餘請求無效,並不會作任何cache。瀏覽器
減少文件體積,提高頁面加載速度緩存
壓縮腳本和樣式表
放在底部可能會出現白屏,會阻塞頁面的逐步呈現
注意:使用link,不使用@import(可能出現白屏,以及下載組件無序性)
頁面既能夠逐步呈現,也能夠提升資源下載的並行度
最差狀況:放在頂部
表達式可能會運算不少遍、影響頁面性能
實現動態CSS可使用javascript控制
$(function () { $("dom").css("background-color",(new Date()).getHours()%2?"#EEE":"#BBB"); });
提升樣式和腳本複用性
注意:純粹而言,內聯速度比外鏈快,由於外鏈額外增長了http請求,可是因爲瀏覽器緩存,當多頁面引用了同一個樣式表或腳本文件時,反而減小了HTTP請求,實現複用。
<link rel="stylesheet" type="text/css" href="style.css" /> <script type="text/javascript" src="main.js" />
查找DNS是須要花費時間的,一般瀏覽器在查找給定的IP地址要花費20~120毫秒的時間,在DNS完成查找以前,瀏覽器沒法從主機名下載任何東西。
最理想的狀況:只使用一個主機名,既減小了DNS查找,又最大化了並行下載。(只針對頁面組件不多(1個或2個)的狀況)
更現實的狀況:使用2個,但很少於4個主機名,這樣在減小DNS查找和容許高度並行下載之間作出了比較好的均衡。
減少文件大小,改善加載時間
重定向是指用戶的原始請求從新轉向到了其它請求
301 Moved Permanently
:這個狀態碼標識用戶所請求的資源被移動到了另外的位置,客戶端接收到此響應後,須要發起另一個請求去下載所需的資源。
302 Found
:這個狀態碼標識用戶所請求的資源被找到了,但不在原始位置,服務器會回覆其餘的一個位置,客戶端收到此響應後,也須要發起另一個請求去下載所需的資源。
目前咱們一直只要區分301和302便可。他們本質上的區別究竟是什麼呢?301表示永久重定向,302表示臨時重定向。
在定義連接地址的href屬性的時候,儘可能使用最完整的、直接的地址。例如:
使用 www.google.com
而不是google.com
使用cn.xxxx.com
而不是xxxx.com
使用www.google.com.hk
而不是google.com
使用www.site.com/products/
而不是www.site.com/products
重複腳本損傷性能:沒必要要的HTTP請求及執行JS所浪費的時間
確保腳本只被加載一次。使用模塊化工具如requireJS或seaJS管理腳本。
它的做用是用一個特殊的字符串來標識某個資源的「版本」,客戶端(瀏覽器)請求的時候,比較ETag若是一致,則表示該資源並無被修改過,客戶端(瀏覽器)可使用本身緩存的版本,避免重複下載。
服務器檢測緩存組件和原始服務器組件匹配的方式
若是緩存組件過時了或者用戶明確地從新加載了頁面,瀏覽器在重用以前必須首先檢查它是否有效。這稱做一個條件GET請求。雖然瀏覽器必須產生這個http請求,可是仍比簡單地下載全部已過時的組件效率高。若是瀏覽器組件是有效的(相互匹配)原始服務器則不會返回整個組件,而是返回304 not modifed狀態碼。
檢測匹配有兩種方式
第一次請求響應
————> GET /i/xx.jpg HTTP 1.1 HOST www.xxx.com <———— HTTP 1.1 20 OK Last-Modified:true .12 dec 2015 03:03:09 GMT Content-Length:1024
第二次請求響應
————> GET /i/xx.jpg HTTP 1.1 HOST www.xxx.com If-Modified-Since:True,12 dec 2015 03:03:09 GMT <———— HTTP 1.1 304 not modifed
實體是咱們以前提到的組件的另外一種稱呼。ETag是惟一標識了一個組件的一個特定版本的字符串,必須帶上引號。這種爲驗證明體提供了更爲靈活的機制——能夠根據user-agent,accept-language頭而改變。
第一次請求響應
————> GET /i/xx.jpg HTTP 1.1 HOST www.xxx.com <———— HTTP 1.1 20 OK Last-Modified:true .12 dec 2015 03:03:09 GMT ETag:"10c34ba-8ba-abds3b3" Content-Length:1024
第二次請求響應
————> GET /i/xx.jpg HTTP 1.1 HOST www.xxx.com If-Modified-Since:True,12 dec 2015 03:03:09 GMT If-None-Match:"10c34ba-8ba-abds3b3" <———— HTTP 1.1 304 not modifed
ETag帶來的問題
ETag的優點和特色
因爲AJAX其實也是須要發起請求,而後服務器執行,並將結果(一般是JSON格式的)發送給瀏覽器進行最後的呈現或者處理,因此對於網站設計優化的角度而言,咱們一樣須要考慮對這些請求,是否能夠儘量的利用到緩存的功能來提升性能。
對於AJAX而言,有一些特殊性,並非全部的AJAX請求都是能夠緩存的。
有的時候,咱們可能但願GET請求不被緩存,有幾種作法來達到這樣的目的。
$.ajaxSetup({ cache: false });
這個意義上來說,使用GET會比POST而言,由於減小了請求數和數據的重複傳輸,有更好的一個性能表現。
在使用XMLHttpRequest(目前的AJAX都是基於它實現的)的時候,瀏覽器中的POST實現爲兩步走的過程,首先發送頭部信息,而後再發送數據。但若是是使用GET的話,就只有一個TCP的包發送出去(除非有大量的Cookie),這樣無疑能夠提升性能。
【備註】一個TCP包的尺寸大約爲1452字節。 除此以外,顯示的項目中,並非總能使用GET的,例如長度方面可能會有限制:The maximum URL length in IE is 2K, so if you send more than 2k data you might not be able to use GET.
DOM(Document Object Model)
文檔對象模型
HTML DOM
定義了訪問和操做 HTML
文檔的標準方法。DOM
將 HTML
文檔表達爲樹結構。
減小頁面的DOM
元素數量,有助於減少頁面體積,而且也下降了維護這份DOM
樹的成本。
若是數據量大,能夠考慮分頁,或者按需加載
什麼狀況下會發生404錯誤?
404 意味着Not Found,意思是說未找到資源。至少會有兩種緣由致使404錯誤:
404錯誤會有什麼影響?
① 看不到的影響:有時候,404錯誤發生了,用戶可能根本沒有感受到。
② 看獲得的影響:
避免404錯誤發生的措施:
第三條措施,一樣能夠儘量地減小用戶手工輸入地址出錯的機會。
若是對某個域(Domain)保存了Cookie,那麼針對這個域的全部請求,都會發送這些全部的Cookie(哪怕當前請求根本用不着,例如針對圖片的請求),大量的、重複的發送Cookie毫無疑問會增長網絡的流量,並所以而下降請求被執行的性能。
從技術上說,這個文件的內容是由網站控制的,它能夠決定要寫什麼內容在裏面,他也能夠決定是否要加密。惟一的一個限制,這個文件的體積不容許超過4KB。
好比圖片 CSS 等,Yahoo! 的靜態文件都在主域名之外,客戶端請求靜態文件的時候,減小了 Cookie的反覆傳輸對主域名的影響。
只有訪問主域名的時候才須要保存cookie,而cookie會自動地發送給當前域的全部請求。
Filters這個功能是IE當年爲了提供更加豐富的一些頁面效果而設計出來的。
不只僅是別的瀏覽器可能不支持,IE從9.0版本開始也放棄了這方面的支持。
有時獲得的圖片尺寸和具體顯示尺寸不同,爲了在網頁中顯示出但願的尺寸,一般會經過下面的方法把圖片進行縮放:
<img width="100" height="100" src="pic.jpg" alt="my pic"/>
瀏覽器下載到原始圖片以後,若是原始尺寸與目標尺寸不符,就會須要對圖片進行縮放(拉伸或者縮小),以便實現剛纔所提到的目的。
咱們須要在網頁中顯示什麼尺寸的圖片,就請圖片設計人員提供什麼尺寸的圖片,而不是在網頁中進行縮放。
<link rel="shortcut icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon"> <link rel="icon" href="http://example.com/favicon.ico" type="image/vnd.microsoft.icon">
使它儘可能在1KB左右。想比較其餘的格式(PNG,GIF等),該文件默認的格式爲ico,這種文件一般較小。要建立favicon.ico文件,可使用 http://www.favicon.cc/
提供的在線免費服務。
使它可以緩存。 因爲該文件使用很頻繁,因此緩存顯得很重要。對於這個文件而言,能夠設置永不過時(或者過時時間長一些)。
將該文件放在單獨的主機中,能夠避免在請求該文件時發送cookie。
空的src和href都會致使多餘的HTTP請求,雖然不影響加載時間,可是會對服務器產生沒必要要的流量和壓力,嚴重的以致於影響整個網站的用戶體驗。
例子:
在頁面加載的過程當中,一個有着空src屬性的img元素被JavaScript動態地賦值。這樣作的問題是,在腳本執行以前元素就被瀏覽器渲染了(尤爲是當你把腳本放到文檔最後的時候)。因此瀏覽器依然會發起一個HTTP 請求,雖然它是一個空值。
雅虎的團隊指出,若是你將img的src留空,可能你的本意是暫時不要顯示任何圖片,但在不一樣的瀏覽器其實仍是會有一些額外的請求發生。
例子:
一樣的問題也發生在href 這個屬性上。有些時候,開發人員想用超連接來觸發JavaScript的一個交互。這時問題就來了,當用戶觸發了「單擊」操做,若是 href 是空的那麼瀏覽器就向服務器發送一個HTTP 請求。
解決留空href屬性的問題:
<a>
標籤以href
屬性,並不鏈接到實際的頁面:<a href="#"></a> <a href="#nogo"></a> <a href="##"></a> <a href="###"></a> <a href="void(0);"></a> <a href="void(0)"></a> <a href=";"></a> <a href=""></a>
cursor:pointer
樣式<style type="text/css"> a{cursor: pointer} </style> <a>點擊一</a> <a onclick="doSomething()">點擊二</a>
a
標籤建立一個帶有描述信息的href
屬性,並監控click
事件調用preventDefault()
函數。<a href="#Something_De scriptive" id="my_id">Trigger</a> <script> $("#my_id").click(function(e){ e.preventDefault(); // 取消單擊事件的默認動做以阻止連接的跳轉。 // 其餘的代碼 }); </script>
優勢:
讓<a>
夠響應鍵盤事件並得到焦點(從而屏幕閱讀器可以讀出背後的內容,加強可訪問性)
優雅降級,在網絡鏈接不好,尚未加載到CSS的時候,<a>
依然有手型與正常的link樣式。
參考:YSlow團隊的23條「Web性能最佳實踐和規則」+《高性能網站建設指南》