首先,必須熟悉的是雅虎的那一套http://developer.yahoo.com/performance/rules.html英文原版,很詳細,當然也可以去網上so中文版的。
下面列出在技術分享會上的一些需要注意的點:
1、引入js最好在文檔的底部,當然也要根據具體情況而定。
2、合并指令碼,減少HTTP請求數量,我們一般有兩種解決方案:
①.在發布之前,就把多個指令碼合并成一個指令碼。
②.在請求的時候,src="1.js,2.js……",這樣通過一次http請求,就能載入多個js檔案
3、無阻塞的指令碼
①.defer屬性,但是有相容性的問題,只有IE支援此屬性。
②.動態指令碼:loadscript 一般來說,在 HTML 頁面中應該只載入基本的 JS 檔案,以使得頁面能夠儘快地顯示出來,然後在頁面載入完畢之後,利用 onload 事件再載入其它 JS 檔案,動態載入 JS 檔案的方法很簡單,可以用下面的函數來實現:
var loadScript = function(url) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = url; document.body.appendChild(script);};
這樣增加的 script 元素,它的內容不一定是立即下載並執行的。如果我們想知道這個 JS 檔案何時已經下載並執行完畢,然後運行後面的依賴代碼,可以用下面的方法來判斷(下面例子來自《高效能 JavaScript 編程》):
var loadScript = function(url, callback) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = url; if (script.readyState) { script.onreadystatechange = function() { if (script.readyState == "loaded" || script.readyState == "complete") { script.onreadystatechange = null; callback(); } }; } else { script.onload = function() { callback(); }; } document.body.appendChild(script);};
其中 IE 瀏覽器不支援 script 元素的 onload 事件,因此我們改用 onreadystatechange 事件
③.XHR指令碼注入:分離了下載和執行,但不能跨域,意味著不能從CDN下載檔案。
4、理解範圍鏈、理解閉包,注意IE閉包記憶體流失等。
http://www.ibm.com/developerworks/web/library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa
http://msdn.microsoft.com/en-us/library/bb250448.aspx
盡量減少with和eval的使用,try catch也會改變範圍。
5、訪問DOM需要注意,HTML集合是一個非常昂貴的東西,每一次訪問HTML集合都需要重新計算一次,所以我們在使用html集合的一些屬性的時候,最後把他用變數儲存下來,而不是每次都去訪問。
6、重繪重排:dom樹、渲染樹。每次頁面配置和幾何屬性改變時都需要重排
①.合并dom和樣式的修改
②.離線操作dom
③.緩衝布局資訊
7、UI線程
①.使用定時器讓出時間片
②.web workers,實現多線程,獨立於UI線程,專註於處理資料。