script和页面解析的关系?(阻塞)
浏览器在解析HTML的过程中,遇到script元素是不能继续构建DOM树的,
它会停止继续构建,首先先下载Javascript代码,并且执行JavaScript的脚本,
等到JavaScript脚本执行完之后才会继续解析HTML,构建DOM树。
这样做的目的是?
因为Js的作用就是操作DOM,并且可以修改DOM;
如果我们等到DOM树构建完成并且渲染再执行JS,会造成严重的回流和重绘,影响页面的性能。
在遇到script元素时,优先下载和执行JSdiamagnetic,再继续构建DOM树。
现代页面的开发模式(Vue,React)
目前开发模式,脚本比HTML更多,处理时间需要更长,所以会造成页面的解析阻塞,在脚本下载,执行完成之前,用户在界面上什么都看不到。解决的方案是:script元素提供了两个属性:defer和async。
defer和async使用
1.defer属性告诉浏览器不要等待脚本下载,继续解析HTML,构建DOM Tree.脚本会由浏览器来下载,不会阻塞DOM Tree的构建过程; 2.脚本如果提前下载好了,会等待DOM Tree构建完成,在DOMContentLoaded事件之前先执行defer中的代码;