搜索
首页web前端html教程script标签中的async和defer用法
script标签中的async和defer用法Oct 18, 2017 am 09:27 AM
asyncdeferscript

script标签用于加载脚本与执行脚本,在前端开发中可以说是非常重要的标签了。
直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染。

现在大家习惯于在页面中引用各种的第三方脚本,如果第三方服务商出现了一些小问题,比如延迟之类的,就会使得页面白屏。
好在script提供了两种方式来解决上述问题,asyncdefer,这两个属性使得script都不会阻塞DOM的渲染。
但既然会存在两个属性,那么就说明,这两个属性之间肯定是有差异的。

defer

如果script标签设置了该属性,则浏览器会异步的下载该文件并且不会影响到后续DOM的渲染;
如果有多个设置了deferscript标签存在,则会按照顺序执行所有的script
defer脚本会在文档渲染完毕后,DOMContentLoaded事件调用前执行。

我们做了一个测试页面,页面中包含了两个script标签的加载,给他们都加上defer标识。
P.S. 为了更直观,我们给script1.js添加了1s的延迟,给script2.js添加了2s的延迟。
image
下图是页面加载的过程&script脚本的输出顺序。
不难看出,虽然script1加载用时虽然比script2短,但因为defer的限制,所以Ta只能等前边的脚本执行完毕后才能执行。
image
image

async

async的设置,会使得script脚本异步的加载并在允许的情况下执行
async的执行,并不会按着script在页面中的顺序来执行,而是谁先加载完谁执行。

我们修改测试页面如下:
image
遂得到了如下的结果,页面加载时长上,并没有什么变化,毕竟都是异步加载的脚本。
但是我们可以看到一个小细节,DOMContentLoaded事件的触发并不受async脚本加载的影响,在脚本加载完之前,就已经触发了DOMContentLoaded
image
image
image
image

我们接着修改测试页面。加载一个没有延迟的script脚本,使得脚本可以即时的加载完毕。
我们要测试一下,如果async脚本加载的足够快,是否会在DOMContentLoaded之前就执行(这个实验是基于对async的描述“在允许的情况下执行”的论证)。
同时为了保证测试的稳定性,我们在script脚本引入的后边添加了数千个空的p节点,用来延长文档的渲染时间。
image
执行结果不出所料,如果给async一定的时间,是有可能在DOMContentLoaded事件之前就执行的。
image
P.S. 从上图中左上角的火焰图中,我们也能看到,出现了多段的蓝色(更新:晚上写的时候懵了,紫色的才是渲染,蓝色的是解析)文档渲染。以及下边Console的顺序。
说明的确,async的执行是加载完成就会去执行,而不像defer那样要等待所有的脚本加载完后按照顺序执行。

画几张图简要说明

网上有了不少这种类似的图,但是基本都是拿一个script就举例的
未免太过寒酸,so咱们来一个豪华版,来画一下多个脚本加载时的甘特图
就像近年来各大手机厂商,出新机都喜欢来一个X+X plus

拿四个不同的颜色来标明各自代表的含义
image

普通script

文档解析的过程中,如果遇到script脚本,就会停止页面的渲染进行下载(但是并不会影响后续的解析,解析和渲染是两码事儿)。
资源的下载是在解析过程中进行的,虽说script1脚本会很快的加载完毕,但是他前边的script2并没有加载&执行,所以他只能处于一个挂起的状态,等待script2执行完毕后再执行。
当这两个脚本都执行完毕后,才会继续渲染页面。
image

defer

文档解析时,遇到设置了defer的脚本,就会在后台进行下载,但是并不会阻止文档的渲染,当页面解析&渲染完毕后。
会等到所有的defer脚本加载完毕并按照顺序执行,执行完毕后会触发DOMContentLoaded事件。
image

async

async脚本会在加载完毕后执行。
async脚本的加载不计入DOMContentLoaded事件统计,也就是说下图两种情况都是有可能发生的

image
image

推荐的应用场景

defer

如果你的脚本代码依赖于页面中的DOM元素(文档是否渲染完毕),或者被其他脚本文件依赖。
例:

  1. 评论框

  2. 代码语法高亮

  3. polyfill.js

async

如果你的脚本并不关心页面中的DOM元素(文档是否渲染完毕),并且也不会产生其他脚本需要的数据

以上是script标签中的async和defer用法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
async是es6还是es7的async是es6还是es7的Jan 29, 2023 pm 05:36 PM

async是es7的。async和await是ES7中新增内容,是对于异步操作的解决方案;async/await可以说是co模块和生成器函数的语法糖,用更加清晰的语义解决js异步代码。async顾名思义是“异步”的意思,async用于声明一个函数是异步的;async和await有一个严格规定,两者都离不开对方,且await只能写在async函数中。

script的意思是什么script的意思是什么Aug 29, 2023 pm 02:00 PM

script是指剧本或脚本的意思。在电影、电视、戏剧等艺术形式中,script用于描述角色的对话、动作和场景,以及故事的发展和结构。script的编写需要一定的技巧和经验,而且应该生动、有力,能够吸引观众的注意力,并传达出故事的情感和主题。script在电影和电视行业中尤为重要,是创作的基础,决定了电影的故事情节、角色发展和对话内容。script是艺术家们创作和表达的重要工具。

vue3+async-validator如何实现表单验证vue3+async-validator如何实现表单验证May 11, 2023 am 09:55 AM

搭建vue3的项目创建项目前这里我们首先要说明的是,我们使用的版本情况Nodejs:v17.5.0pnpm:7.0.0Vue:3.2.25首先我们Vite创建一个vue3的项目demo,名字就叫FormValidate,我们在命令行输入命令pnpmcreateviteFormValidate回车然后选择vue继续回车,说明我们已经初步创建了FormValidate(表单验证)项目根据命令行的提示,我们进入项目根目录,然后使用命令pnpminstall安装项目需要的依赖,当然这里使用pnpm是比n

script是什么script是什么Oct 12, 2023 am 10:04 AM

计算机科学领域中,"script"通常表示一种脚本语言或脚本文件,脚本语言是一种解释性编程语言,通常用于自动化、批处理和快速原型开发等任务。

scripterror怎么解决scripterror怎么解决Oct 18, 2023 am 09:44 AM

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。详细介绍:1、检查语法错误:Script Error可能是由于JavaScript代码中存在语法错误导致的,使用开发者工具来检查代码并修复语法错误,确保代码中的括号、引号、分号等都是正确的等等。

Go 语言中的 defer 关键字是什么?Go 语言中的 defer 关键字是什么?Jun 11, 2023 am 09:10 AM

Go语言中的defer关键字是什么?在编写程序时,我们经常需要在某个函数或方法执行完毕后,执行一些清理或资源释放工作。这个时候,Go语言提供了一种方便的机制,通过使用defer关键字,可以将这些清理或资源释放工作推迟到函数或方法返回之前执行。defer关键字是一个编译时解析的语法糖,它通过将一个函数或方法的调用推迟到当前函数或方法返回之前执行,

Python async模块如何使用Python async模块如何使用May 30, 2023 pm 11:43 PM

协程:协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行Python对协程的支持是通过generator实现的。在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。一、什么是generator(生成器)在Python中,这种一边循环一边计算的机制,称为生成器:gene

Python 中的协程,到底是怎么回事?Python 中的协程,到底是怎么回事?Apr 14, 2023 am 08:28 AM

一.传统的Sync语法请求例子还是一样, 在了解Async语法的实现之前, 先从一个Sync的语法例子开始, 现在假设有一个HTTP请求, 这个程序会通过这个请求获取对应的响应内容, 并打印出来, 代码如下:import socket def request(host: str) -> None: """模拟请求并打印响应体""" url: str = f"http://{host}" sock

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境