让你轻松看懂defer和async

简介: 让你轻松看懂defer和async

defer和async产生的原因


HTML 网页中,浏览器通过<script>标签加载 JavaScript 脚本。

<!-- 页面内嵌的脚本 -->
<script type="application/javascript">
  // module code
</script>
<!-- 外部脚本 -->
<script type="application/javascript" src="path/to/myModule.js">
</script>

由于浏览器脚本的默认语言是 JavaScript。


因此type="application/javascript"是可以省略。


默认情况下,浏览器是同步加载 JavaScript 脚本.


就是说渲染引擎遇到<script>标签就会停下来,等到执行完脚本,再继续向下渲染。


如果是外部脚本,还必须加入脚本下载的时间。


如果脚本体积很大,下载和执行的时间就会很长。


因此造成浏览器堵塞,用户会感觉到浏览器“卡死”,用户体验不好


所以浏览器允许脚本异步加载,下面就是两种异步加载的语法。

<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>

defer和async的简单介绍


<script>标签上有defer或async属性,脚本就会异步加载。


渲染引擎遇到这一行命令,就会开始下载外部脚本.


但不会等它下载和执行,而是直接执行后面的命令。


defer与async的区别是[面试题]


defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行;


async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。


一句话,defer是“渲染完再执行”,async是“下载完就执行”。


另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,


而多个async脚本是不能保证加载顺序的。


ES6中script标签module的作用


浏览器对于带有type="module"的<script>,都是异步加载。


不会造成堵塞浏览器的。


即等到整个页面渲染完,再执行模块脚本,


等同于打开了<script>标签的defer属性。


用代码来描述

<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>

如果网页有多个<script type="module">,它们会按照在页面出现的顺序依次执行。


<script>标签的async属性也可以打开,这时只要加载完成,


渲染引擎就会中断渲染立即执行。执行完成后,再恢复渲染。


<script type="module" src="./foo.js" async></script>


一旦使用了async属性,


<script type="module">就不会按照在页面出现的顺序执行,


而是只要该模块加载完成,就执行该模块。

相关文章
|
小程序 JavaScript
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
1782 0
|
SQL 分布式计算 Hadoop
|
人工智能 自然语言处理 API
浅谈ModelScope
ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,其开发目标为让模型应用更简单。ModelScope希望在汇集行业领先的预训练模型,减少开发者的重复研发成本,提供更加绿色环保、开源开放的AI开发环境和模型服务,助力绿色“数字经济”事业的建设。ModelScope平台以开源的方式提供了多类优质模型,开发者可在平台上免费体验与下载使用。
|
12月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
Java API Spring
Gateway网关报错Unable to start ServletWebServerApplicationContext due to missing ServletWebServer
Gateway网关报错Unable to start ServletWebServerApplicationContext due to missing ServletWebServer
|
SQL 存储 监控
MySQL 内置的监控工具介绍及使用篇(一)
MySQL 内置的监控工具介绍及使用篇
2815 0
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
SQL 关系型数据库 MySQL
mysql too many connections 解决
mysql too many connections 解决
463 4
|
自然语言处理 PyTorch 区块链
Transformers 4.37 中文文档(四十二)(1)
Transformers 4.37 中文文档(四十二)
211 1
|
SQL 关系型数据库 MySQL
MySQL中视图是什么?它有什么作用?
视图为虚拟的表,并不包含数据。视图只包含使用时动态检索数据的查询,返回的数据是从其他表中检索出来的。
361 1