js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索
做前端開發少不了各種利器。比如我習慣用的還是Google瀏覽器和重型武器Fiddller。
一:原始情況 首先大家看看如下的代碼:
估計90%的程序員都會把js文件放在head中,但是大家有沒有深究過呢?很多瀏覽器都會使用單一的線程來做“界面UI的更新”和“JS腳本的處理“,也就是當執行引擎遇到”<script>“的時候,此時頁面的下載和渲染都必須等待<script>執行完畢。那么對用戶而言就悲哀了,看著鎖住的頁面,此時用戶很可能就會給你關掉。
從上面的瀑布圖中我們可以看出二點:
第一: 三個js文件并行下載,但是按我上面的理論中js應該是一個接一個的執行。然而在IE8,Firefox3.5和Chrome2都實現了js的并行下載, 這是相當不錯的,但是他還是會阻礙一些其他資源的下載,比如說圖片。
第二: 圖片1.jpg的下載是在js執行完成后觸發的,這也驗證了上面所說的情況,阻止了image的加載。
二:第一步優化 既然js阻止了UI渲染,那么我們可以考慮將js放在</body>前,這樣就可以讓<script>前的html完美的呈現,不會讓用戶看到頁面空白等待 而苦惱的情況,自然就提高了友好性。
下面的圖也展示了1.jpg和三個js幾乎并行下載和執行。時間由上面的“469ms+”縮小到“326ms”。
三:第二步優化 看上面的“瀑布圖”,估計大家也看出來了,三個js文件進行了三次“Get”請求,大家都知道Get請求是需要帶http頭的, 所以說需要耗費時間,那么我們采取的方案自然就是減少Get請求。通常有兩種方案。 第一:合并js文件,比如將上面的“hello.js"和“world.js“合并掉。 第二:利用第三方工具,比如php中的Minify。 關于第二種做法,taobao用的還是比較多的,看一下其中的一個script,應用了三個js文件。由3個Get請求變為了1個。
四:第三步優化 不管是把js文件放在腳尾,還是三個合并一個,其本質都是”阻塞模式“,就是說鎖死瀏覽器,當web頁面越來越復雜,js文件越來越多,還是 讓我們頭疼的,此時我們就提倡一種“無阻塞模式“加載js腳本,也就是頁面全部呈現完再追加js,也就對應著window.onload事件觸發后,我們才 追加js,這就是所謂的“無阻塞“,但是其中有一個非常要注意的地方就是我們對js的要求是否有嚴格的順序。 第一:無順序要求,比如我對”hello.js“和”world.js"沒有順序要求,那么我們完全可以用jquery來動態追加實現。
從圖中可以看出,"hello.js"和“world.js"出現在藍色線以后,也就說明這兩個js是在DomContentLoad結束后再進行觸發加載的,這樣就不會造成頁面的鎖定等待。第二:有順序要求 為什么一定要有順序要求這個概念呢?對于上面的那個動態追加的“兩個js”文件,在IE系列中,你不能保證hello.js一定會在world.js前執行, 他只會按照服務器端返回的順序執行代碼。
大家也能看到,頁面完全Load的時間其實也就310ms左右,大大提高了網頁的下載呈現和友好型。同樣也可以看看騰訊網,他也是這么干的。
公眾號回復 加群 進群和大佬們交流技術吧
微信公眾號: 我的web前端自救之路
回復 加群 ,跟大佬們一起交流技術吧
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的js页面加载前执行_做一名合格的前端开发工程师:Javascript加载执行问题探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电视剧网络点击率排行榜TOP10 猜猜看
- 下一篇: word公式插件_再也不用担心我的公式写