成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

提高JavaScript加載速度的思考

2011-11-02 15:22:38來源:作者:

JavaScript加載很多時候能夠決定用戶從打開頁面看到頁面的時間,JavaScript的加載與樣式表和DOM以及圖片等資源的加載既有相 同之處,又有很大的不同之處。最大的不同就是JavaScript的加載完成后會立即執行并阻塞頁面

JavaScript加載很多時候能夠決定用戶從打開頁面看到頁面的時間,JavaScript的加載與樣式表和DOM以及圖片等資源的加載既有相 同之處,又有很大的不同之處。最大的不同就是JavaScript的加載完成后會立即執行并阻塞頁面的渲染,這就讓腳本的加載與其他資源的加載有了很大的 不同。

在頁面中直接引用的JavaScript會阻塞整個頁面的加載,這就意味著每加載一個script標簽就會有兩種副作用:
1. 多占用一個Http的請求資源;
2. 加載完成后阻塞頁面,直到JavaScript執行完畢。

HTTP/1.1的標準建議瀏覽器對同一個主機名只能并行下載不超過2個文件(事實上現在的瀏覽器的限制的數目都超過2個),這就意味著你引用的文件越多頁面加載的速度將會變得越慢,因為很多文件都處于等待下載的狀態中。要解決HTTP請求這個問題可以從兩個方面著手:
1. 從多個主機名加載資源,這個可以使用多個二級域名的辦法來實現,但是增加的引用文件的混亂程度;
2. 減少引用的資源數目。

具體到JavaScript的載入,當前比較常用的方法是使用壓縮工具將多個JavaScript合并成一個文件,同時也能減小 JavaScript文件的體積。另外一個是通過統一的接口加載Script資源,后臺程序將請求的文件合并成一個文件輸出,并按照版本號進行緩存,后臺 判斷如果有緩存的版本且緩存未過期將直接輸出緩存文件。后一種方法在wordpress中有類似的使用,但是未見wordpress進行文件的緩存,我曾 經寫過一個類似的實現,將在后續的文章中放出。但是這個方法也有一個問題,因為要對文件進行合并,讀寫操作,另外考慮到后臺語言的運行效率,所以對服務器 也將增加不少壓力。

至于JavaScript加載過程中會阻塞頁面,這個問題可以通過把JavaScript放到頁面代碼的最底部進行加載,這樣會在頁面顯示完成之后 在執行JavaScript。當然script標簽有個defer屬性,可以讓script標簽在頁面DOM加載完成之后執行,但是由于瀏覽器的支持程度 不同,所以使用defer屬性不是一個穩妥的解決方案。

事實上當前還有一種比較流行的解決方案,就是使用JavaScript動態生成script節點,然后將其插入到文檔中。動態的生成script節點插入文檔的加載方式可以實現無阻塞的加載腳本資源,提高了下載的效率。通過兩幅圖對比一下:

\
圖1:靜態引入script標簽時頁面加載的時間條

\
圖2:動態引入script標簽時頁面加載的時間條

\
圖3:使用后臺程序(PHP)合并之后輸出

通過一次的測試并不能證明載入速度的快慢,所以載入時間在這里是無意義的。但是,通過查看載入的方式可以了解到,動態加載腳本的模式下,腳本的加載未阻塞圖片的加載,而傳統的方式則會在腳本加載完成之后再加載下面的內容。

動態載入script節點能夠解決并行下載的問題,但是并無法解決JavaScript執行阻塞的問題,上面兩圖時間線中土黃色部分即為腳本執行的 阻塞時間,可以看到阻塞的時間甚至比加載的時間要長。上面提到了,解決這個問題的辦法是把JavaScript放到文檔的結尾處。如果使用script標 簽動態加載的話這里就很方便,可以在DOM Ready或者Page onload的時候加載腳本,或者按需加載即什么時候用到什么時候加載,這樣就不會阻塞頁面的渲染。當然這個加載的時機還是要慎重考慮,根據腳本的作用進 行不同的調整。

原文:http://www.z-index.cc/2011/10/31/%e5%85%b3%e4%ba%8ejavascript%e5%8a%a0%e8%bd%bd%e7%9a%84%e6%80%9d%e8%80%83-%e5%bb%ba%e8%ae%be%e9%ab%98%e6%80%a7%e8%83%bd%e7%bd%91%e7%ab%99/

贊助商鏈接:

主站蜘蛛池模板: 济宁市| 崇仁县| 亳州市| 洞口县| 珲春市| 仪陇县| 衡南县| 扬中市| 大石桥市| 台江县| 勐海县| 卢氏县| 且末县| 长岭县| 铜山县| 东城区| 商南县| 霍州市| 潢川县| 千阳县| 滨海县| 郑州市| 祥云县| 五华县| 石门县| 固始县| 胶州市| 班戈县| 石城县| 清流县| 长白| 达孜县| 卢湾区| 同仁县| 乐陵市| 阿瓦提县| 万山特区| 定州市| 兴安县| 成武县| 嘉祥县|