一、代碼分割 一個大型前端應用,如果所有代碼都放在單一文件,體積會特別大,下載時間長,白屏時間久,用戶體驗差。 代碼分割是一種有效的優化方式。提前把代碼切分為多個小塊,只下載當前必需的部分,用到哪塊下載哪塊。就像吃自助餐一樣,吃多少拿多少。 早期的代碼分割一般通過 webpack 實現。隨著 ES6 ...
JavaScript 事件迴圈通俗解釋
好的,用更通俗的話來說,事件迴圈就像是在一個大劇院里,有一個演員(JavaScript引擎)和兩個重要的角色:一個是前臺的表演者(調用棧),另一個是後臺的候場區(事件隊列)。
前臺表演者:這個演員在前臺表演,一次只能表演一個節目(單線程執行)。當一個節目(函數)開始時,演員就上臺表演,表演結束,演員就下臺(函數執行完畢,從調用棧中彈出)。
後臺候場區:有些節目需要準備,比如換衣服、化妝等,這些準備工作不會在臺上直接做,而是在後臺候場區進行。這就是事件隊列,非同步任務的回調函數(比如網路請求的結果)會先在這裡排隊等待。
劇院導演:事件迴圈就是劇院的導演,它負責監督整個劇院的運作。導演會不斷檢查演員是否已經下臺(調用棧是否為空),如果演員下臺了,導演就會從候場區選一個節目放到前臺去表演。
優先順序:導演在選節目時,會優先考慮那些需要立即處理的小節目(微任務,比如Promise
的回調),然後再考慮那些大型的節目(巨集任務,比如setTimeout
)。
不堵塞:因為演員不需要在後臺等待準備工作完成,所以即使後臺有很多準備工作要做,也不會影響到前臺的表演,這就是非阻塞I/O。
劇院的效率:雖然演員可以同時處理很多準備工作,但如果後臺的準備工作太多,也會影響劇院的效率,所以合理地安排節目(管理非同步任務)是很重要的。
不同劇院的導演:不同的JavaScript環境(瀏覽器或Node.js)可能有不同的導演(事件迴圈的具體實現可能略有不同),但他們的基本工作方式是相似的。
所以,事件迴圈就是JavaScript世界中的導演,它確保了前臺的表演(代碼執行)和後臺的準備工作(非同步任務處理)能夠有序、高效地進行。