JS阻塞的問題


 

常見問題
 
 http://www.zhihu.com/question/23101413
 
阻塞特性: 
       JS 有個很無語的阻塞特性,就是當瀏覽器在執行JS 代碼時,不能同時做其他任何事情,無論其代碼是內嵌的還是外部的。 
 
1、瀏覽器解析html時,是否解析到</html>后,dom樹構造完成,觸發DOMContentLoaded?
   答:Dom load事件不同的瀏覽器處理方式不同,你只需要認為在這個事件激發以后,整個html dom文檔就是一個可用的狀態,此時documen已經被關閉了,調用document.write會刷白整個頁面。
2、經過測試,ie8+,ff,chrome,opera都是下載完html后,接着並行下載css和多個js,即使將script放在頁面最后</body>之前也是如此,已經不再是以前說的js一個一個下載。我想問放在頁面最后</body>之前的js,下載期間是否會阻塞頁面渲染(應該不是異步的吧)?

  答:下載是異步的沒問題,但是每個javascript執行的時候還是同步的,就是先出現的script標簽一定是先執行,即使是並行下載它最后一個下載完成。除非標有defer的script標簽,否則任何javascript在執行的時候都會中斷當前html文檔解析,自然會阻止頁面 渲染。

3、瀏覽器並行下載js和異步下載js有什么性能上的區別?

  答:其實沒什么性能上的區別,只是異步下載javascript可以盡快的讓用戶看到頁面,比較安心罷了。

4、在《高性能javascript》中提到,使用JavaScript動態生成script節點,然后將其插入到文檔中動態加載js,js加載是異步的,加載和執行不會影響頁面渲染!特別不理解,不是說只要執行js就阻塞頁面渲染嗎?

  答:javascript加載是不會影響已經渲染的頁面,但是會中斷html文檔解析,瀏覽器會在javascript執行以后決定當前文檔是否需要進行重新渲染或者文檔重排。所以即使javascript放到最后面也會使瀏覽器暫停,但不影響之前已經解析出來的dom文檔,此時對於用戶來說是可操作的,而在之前就加載javascript,瀏覽器會提早暫停,給用戶看到的就是白色的頁面,不友好。javascript有可能會修改dom,此時修改dom可能比較危險,因為正處於不穩定的狀態,如果使用document.write甚至會迫使瀏覽器強制解析新出現的動態內容,如果是這種情況,javascript執行完成以后就會進行重排。如果javascript修改了css,影響了layout的話,也會進行重渲染或重排。

5、做一般的項目有沒有必要使用LABjs,Require.js等加載庫?

  答:項目大了重構起來很方便的,沒必要在初期就引入復雜性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM