天天看點

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

   樓主做前端開發一年多了,對前端的見解還是多多少少有一點的,今天特拿出來跟大家分享分享。

做前端開發少不了各種利器。比如我習慣用的還是google浏覽器和重型武器fiddller。

一: 原始情況

首先大家看看如下的代碼:

估計90%的程式員都會把js檔案放在head中,但是大家有沒有深究過呢?很多浏覽器都會使用單一的線程來做“界面ui的更新”和“js腳本的處理“,

也就是當執行引擎遇到”<script>“的時候,此時頁面的下載下傳和渲染都必須等待<script>執行完畢。那麼對使用者而言就悲哀了,看着鎖住的頁面,

此時使用者很可能就會給你關掉。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

從上面的瀑布圖中我們可以看出二點:

   第一:

三個js檔案并行下載下傳,但是按我上面的理論中js應該是一個接一個的執行。然而在ie8,firefox3.5和chrome2都實作了js的并行下載下傳,

 這是相當不錯的,但是他還是會阻礙一些其他資源的下載下傳,比如說圖檔。

   第二:

圖檔1.jpg的下載下傳是在js執行完成後觸發的,這也驗證了上面所說的情況,阻止了image的加載。

二:第一步優化

 既然js阻止了ui渲染,那麼我們可以考慮将js放在</body>前,這樣就可以讓<script>前的html完美的呈現,不會讓使用者看到頁面空白等待

    而苦惱的情況,自然就提高了友好性。

 下面的圖也展示了1.jpg和三個js幾乎并行下載下傳和執行。時間由上面的“469ms+”縮小到“326ms”。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

三:第二步優化

看上面的“瀑布圖”,估計大家也看出來了,三個js檔案進行了三次“get”請求,大家都知道get請求是需要帶http頭的,

   是以說需要耗費時間,那麼我們采取的方案自然就是減少get請求。通常有兩種方案。

   第一:合并js檔案,比如将上面的“hello.js"和“world.js“合并掉。

   第二:利用第三方工具,比如php中的minify。

 關于第二種做法,taobao用的還是比較多的,看一下其中的一個script,應用了三個js檔案。由3個get請求變為了1個。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

四:第三步優化

 不管是把js檔案放在腳尾,還是三個合并一個,其本質都是”阻塞模式“,就是說鎖死浏覽器,當web頁面越來越複雜,js檔案越來越多,還是

 讓我們頭疼的,此時我們就提倡一種“無阻塞模式“加載js腳本,也就是頁面全部呈現完再追加js,也就對應着window.onload事件觸發後,我們才

 追加js,這就是所謂的“無阻塞“,但是其中有一個非常要注意的地方就是我們對js的要求是否有嚴格的順序。

第一:無順序要求,比如我對”hello.js“和”world.js"沒有順序要求,那麼我們完全可以用jquery來動态追加實作。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

從圖中可以看出,"hello.js"和“world.js"出現在藍色線以後,也就說明這兩個js是在domcontentload結束後再進行觸發加載的,這樣就不會造成頁面的鎖定

等待。

第二:有順序要求

 為什麼一定要有順序要求這個概念呢?對于上面的那個動态追加的“兩個js”檔案,在ie系列中,你不能保證hello.js一定會在world.js前執行,

    他隻會按照伺服器端傳回的順序執行代碼。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序

大家也能看到,頁面完全load的時間其實也就310ms左右,大大提高了網頁的下載下傳呈現和友好型。

同樣也可以看看騰訊網,他也是這麼幹的。

(轉)JS加載順序原文:http://blog.csdn.net/dannywj1371/article/details/7048076JS加載順序