当前位置:首页 > 技术文章 > 正文内容

script标签中async和defer的作用及区别

zonemu1个月前 (09-04)技术文章16

script标签常用于加载和执行外部脚本,而直接使用script标签加载脚本时,浏览器会按照其在HTML中出现的顺序依次加载和执行,在这个过程中会阻塞DOM渲染。


当浏览器碰到 script 脚本的时候:

  1. 不使用 deferasync
<script src="script.js"></...>

浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,不等待后续载入的文档元素(即会暂停渲染页面),读到就加载并执行。

  1. 使用async
<script async src="script.js"></...>

加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。

  1. 使用defer
<script defer src="script.js"></...>

加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。

从实用角度来说呢,首先把所有脚本都丢到 body 闭合标签之前是最佳实践,因为对于旧浏览器来说这是唯一的优化选择,此法可保证非脚本的其他一切元素能够以最快的速度得到加载和解析。

PS:浏览器支持并行加载静态文件(如图片、css文件、js文件),但是有限制,比如Chorme在HTTP 1.1协议下,只支持最多6个文件并行加载。

接着,我们来看一张图,其中绿色线代表 HTML 解析,蓝色线代表网络读取,红色线代表执行时间:

由此可以得出asyncdefer的区别在于:

  1. deferasync 在网络读取(下载)文件时相对于HTML解析都是异步的
  2. defer在文档解析完成后再执行JS脚本(按顺序执行)
  3. async会在加载完成后立即执行(先加载完成则先执行,无序执行)

及时获取更新,了解更多动态,请关注 https://www.gogoing.site

如果你觉得这篇文章对你有帮助,欢迎关注微信公众号-前端学堂,更多精彩文章等着你!

相关文章

智能停车场管理系统五种收费类型设置

智能停车场管理系统五种收费类型设置  点击智能停车场管理系统收费标准设置图标,出现下图所示对话框,在这个界面里面可以对停车场系统需要使用的收费标准进行个性化设置:共有五种收费类型(标准收费类、通用标准...

程序员效率提升!使用自动化工具gitx,每周节约半小时

你是否经历过这样的折磨?一个 JIRA 需求要同时修复 dev、qa、staging 三个分支每个版本涉及 A、B、C 三个项目手动执行以下操作:从 dev 切临时分支cherry-pick 提交推送...

解决GitLab报错:not allowed to force push code to a protected branch

当 force push 代码的时候,可能会遇到如下错误:You are not allowed to force push code to a protected branch on this pr...

如何使用git clone克隆包含子模块的仓库

技术背景在软件开发中,当项目规模逐渐增大时,为了更好地管理代码,我们常常会使用子模块将项目拆分成多个独立的部分。Git 作为目前最流行的版本控制系统,提供了管理子模块的功能。但在克隆包含子模块的仓库时...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

HTML5学习笔记三:HTML5语法规则(html5语法详解)

1.标签要小写2.属性值可加可不加””或”3.可以省略某些标签 html body head tbody4.可以省略某些结束标签 tr td li例:显示效果:5.单标签不用加结束标签img inpu...