浏览器的解析方式
浏览器解析html页面首先浏览器先下载html,然后在内存中浏览器的渲染引擎(如 chrome 的webkit)把html代码转化成Dom Tree,然后浏览器根据Dom Tree上的Node分析css和Images。
在遇到外部css文件时会停止构建DOM树,转而解析css文件,构建CSSOM树,完成后会继续构建DOM树,同时与已经构建好的DOM树节点共同构建渲染树,并将内容绘制在屏幕上,而这是一个渐进的过程,不会等到DOM树与CSSOM树共同构建好完整的渲染树才会将内容呈现。
在遇到js文件时也会立即停止构建DOM树,启动js引擎解析js脚本,在解析js过程中,会预解析页面的剩余部分,注意:预解析只是会发送请求接受响应并加载文件而不会解析文件内容。
CSS、JS放置的位置
一般来说css放头部js放底部来确保用户至少能早一点看到界面,让网站看起来至少反应快一点,不过如果css稍微有点多了,会让屏幕白屏时间更长。
所以,并不是说把css都放顶部是一个完美的方法,而且有些js必须在页面加载前执行掉。
所以应该是这样,把必须的js和css放顶部,把不那么重要的css和js放底部。
即将引入的文件放到后面。对于自己写的js代码,如果说这些代码要用到正文里的东西,那么也建议写在后面。因为当运行js代码的时候,如果你用到的正文中的某个东西,但是正文没有加载,所以有可能会出错。
JS 和 CSS 在页面中的位置,会影响其他资源(指 img 等非 js 和 css 资源)的加载顺序,究其原因,有三个值得注意的点:
1) JS 有可能会修改 DOM原型的,可能会有 document.write。这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的,这是 JS 阻塞后续资源下载的根本原因。
2) JS 的执行有可能依赖最新样式。比如,可能会有 var width = $(‘#id’).width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS 之前的所有css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。
3) 现代浏览器很聪明,会进行 prefetch 优化。性能是如此重要,现代浏览器在竞争中,在 UI update 线程之外,还会开启另一个线程,对后续 JS 和 CSS 提前下载(注意,仅提前下载,并不执行)。有了 prefetch 优化,这意味着,在不存在任何阻塞的情况下,理论上 JS 和 CSS 的下载时机都非常优先,和位置无关。