做者:Jogis
原文連接:https://github.com/yesvods/Bl...
轉載請註明原文連接以及做者信息react
咱們經過分析主流瀏覽器Chrome,來了解一個腳本從無到有再到運行做用,到底經歷了什麼。如下將會用lodash
爲做爲例子,瀏覽器的腳本生命週期。git
在瀏覽器中,在HTML解析過程當中,當解析到帶有src
的script
標籤,便會即刻調度網絡模塊隊列,網絡模塊在有空餘請求線程時,會即刻執行隊列的請求。github
舉個栗子:瀏覽器
<script> console.log("Hello Tmall") </script> <script src="lodash.js"></script>
瀏覽器會優先發起lodash.js
的請求,然後執行console.log
腳本。服務器
瞭解TCP/IP協議的童鞋都知道,網絡服務器存在慢啓動
機制,數據包會以遞增方式發送至客戶端(瀏覽器),一個500KB左右的lodash.js
會被以十多個包送達:網絡
也許有童鞋已經發現,爲了極致的性能,Chrome在接收到首個數據包時,已經開始腳本的解析工做。dom
隨後,腳本的一系列連貫的生命週期,最後會發出一個load事件
,代表腳本已就緒。性能
整體看起來,腳本的確會阻塞後續HTML解析,一個完整生命週期大概是醬紫的。spa
那麼,當多個腳本並行加載,時間序列是怎樣的呢:腳本下載會並行發起,接收數據交替進行。而解析、編譯、執行,會根據HTML聲明順序,串行進行線程
以react
react-dom
lodash
並行加載爲例,整個時序是醬紫的: