We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
css要放头部,js放尾部 主要是为了将页面内容尽快的展示给用户,减少白屏时间。
接下来我们来分析下原因,但是在这之前要先清楚浏览器页面的渲染过程。
关于渲染过程更细节的内容,点击这里 从输入URL到页面渲染出来的过程
所以,css 如果放在标签的前面,那么当DOM树构建完成了,渲染树才构建,那么当渲染树构建完成,浏览器不得不再重新渲染整个页面,这样不仅造成了资源的浪费,效率也不高。
对用户来讲,页面重新渲染的时候也会看到页面闪动,用户体验可谓极差。
如果放在之间,浏览器边构建边渲染,效率要高的多。
当浏览器解析到script的时候,就会立即下载执行,中断html的解析过程,如果外部脚本加载时间很长(比如一直无法完成下载),就会造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。
具体的流程是这样的:
这两个属性只是script标签在header标签中使用的,如果你把它放在body后面是无效的。
script 的这两个属性主要用于其js文件没有操作DOM的情况,这时候就可以将该js脚本设置为异步加载,通过async或defer来标记代码
js文件没有操作DOM
因为 js 的执行是依赖 css 样式 的。即只有 css 样式全部下载完成后才会执行js。
js 的执行是依赖 css 样式
由于现代浏览器很聪明会进行 prefetch 优化,就如 Chrome 浏览器,它会在解析 HTML 时收集外链,并在后台并行下载,由于会并行下载,那么head中外链js和css的位置其实就没有什么很大影响了。
参考: https://juejin.cn/post/6844904009694707725#heading-2 https://www.zhihu.com/question/23250329 https://www.cnblogs.com/huaweiyun/p/13202745.html https://yinode.tech/post/201901/%E4%BB%8Ejs%E7%9A%84%E9%98%BB%E5%A1%9E%E8%A7%92%E5%BA%A6%E8%B0%88%E8%B0%88%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%B2%E6%9F%93%E5%8E%9F%E7%90%86/#%E6%83%85%E5%86%B52-css%E6%94%BE%E5%A4%B4%E9%83%A8-js%E6%94%BE-body-%E5%89%8D
The text was updated successfully, but these errors were encountered:
No branches or pull requests
css要放头部,js放尾部 主要是为了将页面内容尽快的展示给用户,减少白屏时间。
接下来我们来分析下原因,但是在这之前要先清楚浏览器页面的渲染过程。
关于渲染过程更细节的内容,点击这里 从输入URL到页面渲染出来的过程
css放头部
所以,css 如果放在标签的前面,那么当DOM树构建完成了,渲染树才构建,那么当渲染树构建完成,浏览器不得不再重新渲染整个页面,这样不仅造成了资源的浪费,效率也不高。
对用户来讲,页面重新渲染的时候也会看到页面闪动,用户体验可谓极差。
如果放在之间,浏览器边构建边渲染,效率要高的多。
js放尾部
当浏览器解析到script的时候,就会立即下载执行,中断html的解析过程,如果外部脚本加载时间很长(比如一直无法完成下载),就会造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。
具体的流程是这样的:
外链的script包含async或者defer如何处理?
script 的这两个属性主要用于其
js文件没有操作DOM
的情况,这时候就可以将该js脚本设置为异步加载,通过async或defer来标记代码async和defer的区别:
对于async标记,浏览器的解析过程是这样的:
对于defer标记,浏览器的解析过程是这样的:
由于使用了async或defer的script会放在header中,而header又会存在外链css,那么二者有顺序要求吗?
因为
js 的执行是依赖 css 样式
的。即只有 css 样式全部下载完成后才会执行js。由于现代浏览器很聪明会进行 prefetch 优化,就如 Chrome 浏览器,它会在解析 HTML 时收集外链,并在后台并行下载,由于会并行下载,那么head中外链js和css的位置其实就没有什么很大影响了。
参考:
https://juejin.cn/post/6844904009694707725#heading-2
https://www.zhihu.com/question/23250329
https://www.cnblogs.com/huaweiyun/p/13202745.html
https://yinode.tech/post/201901/%E4%BB%8Ejs%E7%9A%84%E9%98%BB%E5%A1%9E%E8%A7%92%E5%BA%A6%E8%B0%88%E8%B0%88%E6%B5%8F%E8%A7%88%E5%99%A8%E6%B8%B2%E6%9F%93%E5%8E%9F%E7%90%86/#%E6%83%85%E5%86%B52-css%E6%94%BE%E5%A4%B4%E9%83%A8-js%E6%94%BE-body-%E5%89%8D
The text was updated successfully, but these errors were encountered: