首页 > 其他分享 >defer 属性和 async 属性

defer 属性和 async 属性

时间:2024-06-09 10:45:36浏览次数:25  
标签:脚本 defer 浏览器 async 下载 属性

defer 属性

为了解决脚本文件下载阻塞网页渲染的问题,一个方法是对 <script> 元素加入 defer 属性。它的作用是延迟脚本的执行,等到 DOM 加载生成后,再执行脚本。

<script src="a.js" defer></script>
<script src="b.js" defer></script>

上面代码中,只有等到 DOM 加载完成后,才会执行 a.js 和 b.js。

defer 属性的运行流程如下。

  1. 浏览器开始解析 HTML 网页。
  2. 解析过程中,发现带有 defer 属性的 <script> 元素。
  3. 浏览器继续往下解析 HTML 网页,同时并行下载 <script> 元素加载的外部脚本。
  4. 浏览器完成解析 HTML 网页,此时再回过头执行已经下载完成的脚本。

有了 defer 属性,浏览器下载脚本文件的时候,不会阻塞页面渲染。下载的脚本文件 DOMContentLoaded 事件触发前执行(即刚刚读取完 </html> 标签),而且可以保证执行顺序就是它们在页面上出现的顺序。

对于内置而不是加载外部脚本的 script 标签,以及动态生成的 script 标签,defer 属性不起作用。另外,使用 defer 加载的外部脚本不应该使用 document.write 方法。

 

async 属性

解决“阻塞效应”的另一个方法是对 <script> 元素加入 async 属性。

<script src="a.js" async></script>
<script src="b.js" async></script>

async 属性的作用是,使用另一个进程下载脚本,下载时不会阻塞渲染。

  1. 浏览器开始解析 HTML 网页。
  2. 解析过程中,发现带有 async 属性的 script 标签。
  3. 浏览器继续往下解析 HTML 网页,同时并行下载 <script> 标签中的外部脚本。
  4. 脚本下载完成,浏览器暂停解析 HTML 网页,开始执行下载的脚本。
  5. 脚本执行完毕,浏览器恢复解析 HTML 网页。

async 属性可以保证脚本下载的同时,浏览器继续渲染。需要注意的是,一旦采用这个属性,就无法保证脚本的执行顺序。哪个脚本先下载结束,就先执行那个脚本。另外,使用 async 属性的脚本文件里面的代码,不应该使用 document.write 方法。

defer 属性和 async 属性到底应该使用哪一个?

一般来说,如果脚本之间没有依赖关系,就使用 async 属性,如果脚本之间有依赖关系,就使用 defer 属性。如果同时使用 async 和 defer 属性,后者不起作用,浏览器行为有 async 属性决定。

标签:脚本,defer,浏览器,async,下载,属性
From: https://www.cnblogs.com/ladybug7/p/18239331

相关文章

  • computed(计算属性)和watch(侦听属性)的区别
    1.computed计算属性调用才会执行,有返回值watch侦听属性不需要调用,只要侦听的数据发生改变就会执行2.computed计算属性能够完成的操作watch侦听属性都可以完成,但是watch侦听属性能够完成的操作computed不能全部完成,比如异步操作,computed内部不能执行异步操作,watch内部可以执......
  • JavaScript中的async/await
    async/await是什么?async是一个修饰符,async定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数。await也是一个修饰符,await关键字只能放在async函数内部,await关键字的作用就是获取Promise中返回......
  • Vue的data中对象新增属性后,页面却不渲染(未渲染)
    前提背景:在data中定义了一个数组 usableList:[],给数组中的每个对象添加checked属性(用来查看数据的勾选状态) 问题:勾选后,数组的数据已经改变了,但是未渲染到页面中 问题原因:在于在Vue实例创建时,对象新增的属性并未声明,因此就没有被Vue转换为响应式的属性,自然就不会触发视......
  • new/类/null/+/PrimitiveValue/valueOf/toString/环境/HTML 脚本元素属性
    newfunctionmyObjCreate(proto){functionF(){}F.prototype=protoreturnnewF();}functionmyNew(F,...args){letobj=myObjCreate(F.prototype)letres=F.call(obj,...args);returntypeofres==='object'&&res!==null?res:obj......
  • css属性
    字体属性:{height:*px}高度{width:*px}宽度{font-size:*px}字体大小{color:red/rgb()/#4f4f4f}字体颜色{font-style:normal/italic/oblique}字体倾斜{font-variant:normal/smal-caps}{font-weight:normal/bold/bolder/lighter/integer}字体粗细{......
  • Spring - AOP - @EnableAspectAutoJAutoProxy 与其属性exposeProxy,proxyTargetClass
    这三个属性是Spring框架中与AOP(面向切面编程)相关的配置。 EnableAspectJAutoProxy:这是一个注解,用于开启Spring对AspectJ的自动代理功能。  exposeProxy:这个属性用于配置是否需要将代理对象暴露给AOP创建的Subject,这样就可以在代理对象内部通过AopContext.currentProxy......
  • 创建属性property时,不用官方的 default 说明符;
    创建属性property时,不用官方的default说明符;首先看个案例TPerson=classpublishedpropertyAge:IntegerreadFAgewriteSetAgedefault20;end;我们创建一个TPerson类给其一个属性,然后使用了default20关键字,按照我们的理解应该是这个age属性的默认值就......
  • Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
    打包与运行window版本上制作我们要把idea中的程序抽取出来作为一个独立的jar包把jar包放到服务器上服务器是长期运行的我们就能随时访问了在Maven的生命周期中选择package打包功能在资源管理器中查找java-jar文件名.jarjava-jar文件名.jar但是我们在测试里面......
  • JavaScript第十讲:DOM编程(1):节点概念,如何获取元素节点,节点属性,样式
    前言在当今的Web开发中,DOM(DocumentObjectModel)编程扮演着至关重要的角色。DOM是HTML和XML文档的编程接口,它使得我们可以像操作对象一样来操作网页上的元素。无论是构建动态网页,还是实现用户交互,都离不开对DOM的深入理解和灵活运用。在本文中,我们将开启DOM编程的系列学习之旅......
  • microeco包网络分析的一些关键属性
    Vertex 135Edge 1523Average_degree 22.562962962963Average_path_length 2.20846705198353Network_diameter 6Clustering_coefficient 0.701431967070555Density 0.168380320619127Heterogeneity 0.744514690067939Centralization 0.264455500276396Modularity 0.34......