第一部分
1、內容層面
DNS解析優化(DNS緩存、減少DNS查找、keep-alive、適當的主機域名)
避免重定向(/還是需要的)
切分到多個域名
杜絕404
2、網絡傳輸階段
減少傳輸過程中實體的大小
緩存
cookie優化
文件壓縮(Accept-Encoding:g-zip)
減少請求的次數
文件適當的合併
雪碧圖
異步加載(併發,requirejs)
預加載、延後加載、按需加載
3、渲染階段
js放底部,css放頂部
減少重繪和迴流
合理使用Viewport 等meta頭部
減少dom節點
BigPipe
4、腳本執行階段
緩存節點,儘量減少節點的查找
減少節點的操作(innerHTML)
避免無謂的循環,break、continue、return的適當使用
事件委託
第二部分
1、請減少HTTP請求
合併圖片(css sprites),合併CSS和JS文件;圖片較多的頁面也可以使用 lazyLoad 等技術進行優化。
2、 請正確理解 Repaint 和 Reflow
Repaint(重繪)就是在一個元素的外觀被改變,但沒有改變佈局(寬高)的情況下發生,如改變visibility、outline、背景色等等。
Reflow(重排)就是DOM的變化影響到了元素的幾何屬性(寬和高),瀏覽器會重新計算元素的幾何屬性,會使渲染樹中受到影響的部分失效,瀏覽器會驗證DOM樹上的所有其它結點的visibility屬性,這也是Reflow低效的原因。如:改變窗囗大小、改變文字大小、內容的改變、瀏覽器窗口變化,style屬性的改變等等。
減少性能影響的辦法:
有動畫效果的元素,它的position屬性應當設爲fixed或absolute,這樣不會影響其它元素的佈局;如果功能需求上不能設置position爲fixed或absolute,那麼就權衡速度的平滑性。
3、 請減少對DOM的操作
對DOM操作的代價是高昂的,這在網頁應用中的通常是一個性能瓶頸。
合理的使用JavaScript變量儲存內容,考慮大量DOM元素中循環的性能開銷,在循環結束時一次性寫入。
減少對DOM元素的查詢和修改,查詢時可將其賦值給局部變量。
4、 使用JSON格式來進行數據交換
JSON是一種輕量級的數據交換格式,採用完全獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript原生格式,這意味着在 JavaScript 中處理 JSON數據不需要任何特殊的 API 或工具包。
與XML序列化相比,JSON序列化後產生的數據一般要比XML序列化後數據體積小,所以在Facebook等知名網站中都採用了JSON作爲數據交換方式。
JS操作JSON:
在JSON中,有兩種結構: 對象和數組。
var jsonlist=[{"name":"darren","age":24,"location":"beijing"},{"name":"weidong.nie","age":24,"location":"hunan"}];
5、 高效使用HTML標籤和CSS樣式
HTML是一門標記語言,使用合理的HTML標籤前你必須瞭解其屬性,比如Flow Elements,Metadata Elements ,Phrasing Elements。比較基礎的就是得知道塊級元素和內聯元素、盒模型、SEO方面的知識。
CSS是用來渲染頁面的,也是存在渲染效率的問題。CSS選擇符是從右向左進行匹配的,這裏對css選擇符按照開銷從小到大的順序梳理一下:
ID選擇符 #box
類選擇符 .box
標籤 div
僞類和僞元素 a:hover
當頁面被觸發引起迴流(reflow)的時候,低效的選擇符依然會引發更高的開銷,所以請避免低效。
6、 使用CDN加速(內容分發網絡)
基本原理:
CDN的全稱是Content Delivery Network,即內容分發網絡。
"其基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。" - 百度百科。
7、 將CSS和JS放到外部文件中引用,CSS放頭,JS放尾
JavaScript是瀏覽器中的霸主,爲什麼這麼說,因爲在瀏覽器在執行JavaScript代碼時,不能同時做其它事情,即<script>每次出現都會讓頁面等待腳本的解析和執行(不論JavaScript是內嵌的還是外鏈的),JavaScript代碼執行完成後,才繼續渲染頁面。這個也就是JavaScript的阻塞特性。
8、精簡CSS和JS文件:
1.壓縮JS
java -jar yuicompressor-2.4.2.jar api.js > api.min.js
2.壓縮CSS
java -jar yuicompressor-2.4.2.jar style.css > style.min.css。
9、壓縮圖片和使用圖片Sprite技術
注:其實壓縮圖片和圖片精靈是兩個方面的技術,可是既然都是關於圖片的優化還是放到一塊吧。
現在由於工作的細分,專業的前端工程師已經少有機會去切圖了,可是關於圖片壓縮還是得略微瞭解,一般圖片壓縮的方式有:
1.縮小圖片分辨率;
2.改變圖片格式;
3.降低圖片保存質量。
10、 注意控制Cookie大小和污染
因爲Cookie是本地的磁盤文件,每次瀏覽器都會去讀取相應的Cookie,所以建議去除不必要的Coockie,使Coockie體積儘量小以減少對用戶響應的影響;
使用Cookie跨域操作時注意在適應級別的域名上設置coockie以便使子域名不受其影響;
Cookie是有生命週期的,所以請注意設置合理的過期時間,合理地Expire時間和不要過早去清除coockie,都會改善用戶的響應時間。