JavaScript无阻塞加载和defer、async详解

在前端开发中,JavaScript是必不可少的一部分。但是JavaScript文件过大或者过多时,可能会导致网页加载速度变慢,影响用户的体验。为了避免这种情况,在加载JavaScript文件时可以使用无阻塞加载技术,其中最常用的是defer和async属性。

无阻塞加载

无阻塞加载就是指浏览器在下载JavaScript文件时不会阻塞HTML文档的渲染和其他资源的加载。实现无阻塞加载有以下几种方式:

异步脚本

使用script标签的async属性可以让浏览器异步地下载并执行JavaScript文件。下面是一个例子:

--------- -----
------
------
  ----- ----------------
  ----------------------
  ------- ----- ----------------------
-------
------
  --------- -----------
-------
-------

上述代码中,浏览器会立即下载app.js文件,并且不会影响页面的呈现。然后在下载完成后,立即执行该文件,而不管其他资源是否已经加载完毕。

延迟脚本

使用script标签的defer属性可以让浏览器延迟执行JavaScript文件,直到所有的DOM元素都被解析完成。下面是一个例子:

--------- -----
------
------
  ----- ----------------
  ----------------------
  ------- ----- ----------------------
-------
------
  --------- -----------
-------
-------

上述代码中,浏览器会立即下载app.js文件,但是不会立即执行。直到整个文档被解析完成后才会执行该文件。

动态加载脚本

使用JavaScript动态地创建script标签并添加到HTML文档中可以实现异步加载JavaScript文件。下面是一个例子:

--------- -----
------
------
  ----- ----------------
  ---------------------
-------
------
  --------- -----------
  --------
    --- ------ - ---------------------------------
    ---------- - ---------
    ----------------------------------
  ---------
-------
-------

上述代码中,使用JavaScript动态地创建了一个script标签,并将src属性设置为要加载的JavaScript文件的URL。然后将该标签添加到了页面的头部,就可以实现异步加载。

defer和async的区别

虽然defer和async都可以实现无阻塞加载,但是它们之间还是有一些区别的。

  • defer属性是HTML5新增的属性,在HTML4中是不存在的。而async属性在HTML4中已经存在。
  • 当浏览器遇到带有defer属性的script标签时,它会先下载该文件,但是不会立即执行。而如果是带有async属性的script标签,浏览器会在下载完成后立即执行该文件,而不管其他资源是否已经加载完毕。
  • 当有多个带有defer属性的script标签时,它们会按照在页面中出现的顺序依次执行。而带有async属性的script标签则无法保证执行的顺序。

总结

JavaScript无阻塞加载是前端优化中的一个重要部分,可以提高网页的加载速度,改善用户的体验。在实现无阻塞加载时,应该根据实际情况选择合适的方法。在使用defer和async属性时要注意它们之间的区别,以免产生意想不到的影响。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/1741