为什么外链CSS要放在头部
一个页面的加载过程会经过 html 的渲染和解析过程。
而外链CSS无论放在那里都不会影响html的解析,但会影响html的渲染。
如果将 CSS 放在尾部,html的内容会第一时间加载出来,但是会阻塞html的行内CSS的渲染,
游览器的这个机制其实很明智,因为如果不这样页面可能会先呈现一个行内CSS的样式,等外链CSS下载完页面又变成另一个样式,不仅用户体验差而且会造成额外的渲染成本。
如果将CSS放在头部,CSS的下载解析是可以和html同步进行的,放在尾部就得花费额外的时间来解析CSS, 并且游览器会先渲染出一个没有样式的页面,
等CSS 加载完后会再渲染成一个又样式的页面,页面会出现明显的闪动。
为什么Script要放在尾部
因为当游览器解析到Script的时候,会立即下载执行,中断html的解析过程,如果外部脚本加载时间很长,就好造成网页长时间失去响应,游览器会呈现
“假死”状态,这被称为“阻塞效应”。
具体的流程是这样的:
- 游览器一边下载html页面,一边开始解析
- 再解析过程中,发现Script标签
- 暂停解析,网页渲染权转交JavaScript引擎
- 如果Script标签引用了外部脚本,就下载该脚本,否则就立即执行
- 执行完毕,把控制权交还给渲染引擎,继续往下解析html网页
解决方案:1在script标签中加入Async 属性,这会让script 进入异步加载不会影响解析dom
2.在script标签中加入defer 属性,这会让script立即下载,但会延后执行。defer只能用于外链
注:由于现代浏览器很聪明会进行 prefetch 优化,就如 Chrome 浏览器,它会在解析 HTML 时收集外链,并在后台同步下载,由于会同步下载,那么head中外链js和css的位置其实就没有什么很大影响了。
\