让你轻松看懂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">就不会按照在页面出现的顺序执行,


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

相关文章
|
SQL 分布式计算 Hadoop
|
小程序 JavaScript
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
1934 0
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
8月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
7474 23
|
SQL 存储 监控
MySQL 内置的监控工具介绍及使用篇(一)
MySQL 内置的监控工具介绍及使用篇
2913 0
|
存储 JavaScript 前端开发
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
该文章深入探讨了Vue3中Composition API的关键特性,包括`ref`、`toRef`、`toRefs`的使用方法与场景,以及它们如何帮助开发者更好地管理组件状态和促进逻辑复用。
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
|
API
Pinia 实用教程【Vue3 状态管理】状态持久化 pinia-plugin-persistedstate,异步Action,storeToRefs(),修改State的 $patch,$reset
Pinia 实用教程【Vue3 状态管理】状态持久化 pinia-plugin-persistedstate,异步Action,storeToRefs(),修改State的 $patch,$reset
3716 1
|
前端开发 程序员
前端的开发规范
前端的开发规范
1355 0
阿里云域名注册流程图和费用说明,新手第一次购买域名攻略
阿里云域名注册指南:访问[阿里云域名注册入口查询域名,选择后缀,加入清单并结算。价格如.com: 78元/首年。创建信息模板进行实名认证。获取优惠口令并使用,参照流程完成购买。详细步骤及域名价格详情见原文。
1451 0