js的下载是阻塞的吗?

本文探讨了JavaScript的defer和async属性如何影响脚本加载和执行,揭示了它们如何避免阻塞页面渲染,异步下载的优势,以及不同场景下的最佳实践。

如果js脚本不加defer和async属性的话,确实是阻塞的,但是如果加上defer或者async属性的话,最起码下载时,js是并行下载的,而解析代码的时候,具体情况具体分析。

引用js文件格式如下:

<script type="text/javascript" defer="defer" async="true/false" src="js文档地址"></script>
  • defer="defer":该属性用来通知浏览器,这段脚本代码将不会产生任何文档内容。例如JavaScript代码中的document.write()方法将不会骑作用,浏览器遇到这样的代码将会忽略,并继续执行后面的代码。属性只能是defer,与属性名相同。在HTML语法格式下,也允许不定义属性值,仅仅使用属性名。
  • async="true/false":该属性为html5中新增的属性,它的作用是能够异步地下载和执行脚本,不因为加载脚本而阻塞页面的加载。一旦下载完毕就会立刻执行。

async和defer一样,都不会阻塞其他资源下载,所以不会影响页面的加载,但在async的情况下,js文档一旦下载完毕就会立刻执行,所以很有可能不是按照原本的顺序来执行,如果js有依赖性,就要注意了。

如下图:

defer和async的比较

相同点:    

  • 加载文件时不阻塞页面渲染;
  • 对于inline的script无效;
  • 使用这两个属性的脚本中不能调用document.write方法;
  • 有脚本的onload的事件回调;
  • 允许不定义属性值,仅仅使用属性名;

 不同点:

  •  html的版本html4.0中定义了defer;html5.0中定义了async;这将造成由于浏览器版本的不同而对其支持的程度不同;
  •  执行时刻:每一个async属性的脚本都在它下载结束之后立刻执行,同时会在window的load事件之前执行。所以就有可能出现脚本执行顺序被打乱的情况;每一个defer属性的脚本都是在页面解析完毕之后,按照原本的顺序执行,同时会在document的DOMContentLoaded之前执行。

这两个属性会有三种可能的组合:

  • 如果async为true,那么脚本在下载完成后异步执行。
  • 如果async为false,defer为true,那么脚本会在页面解析完毕之后执行。
  • 如果async和defer都为false,那么脚本会在页面解析中,停止页面解析,立刻下载并且执行。
  • 如果async和defer都为true,那么脚本在下载完成后,就会立即执行,并且阻塞dom的解析。

 

 

### JavaScript 加载顺序与优先级 在网页加载过程中,JavaScript 的加载顺序并不是优先的。相反,浏览器通常会优先加载 HTML 和 CSS,以确保页面结构和样式能够尽快呈现给用户。而 JavaScript 的加载和执行通常会暂停 HTML 的解析,直到脚本完全加载并执行完毕。这种行为是由于 JavaScript 可能修改页面内容或依赖 DOM 元素,因此浏览器需要等待脚本执行完成后再继续解析后续内容[^3]。 #### 同步脚本的加载与执行 默认情况下,HTML 中的 `<script>` 标签是同步加载的。浏览器在解析 HTML 文档时,一旦遇到 `<script>` 标签,就会暂停文档解析,开始下载并执行脚本。如果脚本较大或网络延迟,会导致页面渲染延迟,影响用户体验。例如: ```html <script src="script.js"></script> ``` 在这种情况下,`script.js` 会阻塞 HTML 解析,直到脚本下载并执行完毕。 #### 异步加载 JavaScript 为了优化加载性能,可以使用 `async` 或 `defer` 属性来异步加载 JavaScript 脚本。 - **`async`**:适用于独立执行的脚本,下载时不阻塞 HTML 解析,下载完成后立即执行,执行顺序不确定。适用于不依赖页面 DOM 或其他脚本的场景。 ```html <script src="script.js" async></script> ``` - **`defer`**:适用于需要等待 DOM 加载完成后再执行的脚本,下载时不阻塞 HTML 解析,所有 `defer` 脚本会在 DOM 加载完成后按顺序执行。 ```html <script src="script.js" defer></script> ``` 这些异步加载方式可以显著提升页面加载速度,尤其是在处理大型 JavaScript 文件时。 #### 浏览器兼容性与最佳实践 尽管 `async` 和 `defer` 是现代浏览器广泛支持的特性,但在兼容性方面仍需注意。例如,`defer` 在 Internet Explorer 中的支持有限,但随着 IE 的逐步淘汰,这一问题已不再显著[^4]。开发者应优先使用 `async` 和 `defer` 来优化脚本加载顺序,确保页面内容优先渲染,提升用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值