JS阻塞的问题
常见问题
http://www.zhihu.com/question/23101413
阻塞特性:
JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的。
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等加载库?
答:项目大了重构起来很方便的,没必要在初期就引入复杂性。