博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在HTML中使用JavaScript(浏览器对js的加载机制分析)
阅读量:5206 次
发布时间:2019-06-14

本文共 1102 字,大约阅读时间需要 3 分钟。

前言:

  向HTML页面中插入JavaScrip的主要方法,就是使用<script>标签。主要探讨<script>标签的在HTML页面的渲染机制。对应的业务场景:从js的加载机制,去优化首次加载页面白屏时间过长的问题

 

要点:

  1.script标签用外链的src引入文件时,内嵌的js代码无效。

  2.只要不存在defer和async属性,浏览器都会按照script元素在页面中出现的先后顺序对他们依次进行解析(文件下载和代码执行)。换句话说,在第一个外链script下载 -> 执行,由于浏览器做了预解析的优化,在第一个js执行的过程中,后面的几个js会并行下载。第一个script执行完成 -> 第二个外链script下载完成 -> 执行,然后第三个,第四个……。这种方式会阻塞页面的渲染。

  3.defer:延迟脚本。脚本会被延迟到整个页面都解析完毕后再运行。相当于告诉浏览器立即下载,但是延迟执行。这种方式不阻塞页面的渲染。h5规范要求脚本按照出现的顺序执行,因此第一个延迟的脚本会优先于第二延迟脚本执行,都会先于DOMContentLoaded事情。在现实中,可能顺序不能一定得到保证。ps:用最新谷歌浏览器测试过,能保证顺序。

  4.async:异步脚本。与defer类似,告诉浏览器立即下载文件,但是延迟执行,也不阻塞页面渲染。但是不能保证执行顺序。所有,带有async属性的script文件之间无法保证顺序,不应该有包含互相依赖的js代码。

 

补充:

1. 来自阮一峰博客对defer和async异同点说明

defer与async的区别是:defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行;async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。一句话,defer是“渲染完再执行”,async是“下载完就执行”。另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async脚本是不能保证加载顺序的。

 

2.外链js加载和link外链css加载的对比和关系

1.link和外链js的下载和执行都是阻塞页面渲染的。

2.link和外链js的下载是并行的。但是不是谁先下载完先执行,执行顺序是按上下顺利依次执行的。

总结:

  一点思考:

  1、一般性都要保证js文件的引入顺序就是它的执行顺序,所以async慎用。

  2、script的解析包括:js文件的下载和执行,会阻塞页面渲染。

 

转载于:https://www.cnblogs.com/damonFeng/p/8526145.html

你可能感兴趣的文章
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
【redis4 】
查看>>
shell文件查找和压缩命令
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
HDU-1242-Rescue
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
obiee11g中关闭缓存
查看>>
Eclipse中如何开启断言(Assert),方法有二
查看>>