HTML script 简体中文
使用 async 属性加载的脚本将在获取脚本时下载脚本而不会阻止页面。但是,开荒保洁13825404095一旦下载完成,脚本就会执行,从而阻止页面呈现。这意味着在脚本执行完成之前,网页上的其余内容将无法处理并显示给用户。您无法保证脚本会按任何特定顺序运行。当页面中的脚本彼此独立运行且不依赖于页面上的其他脚本时,最好使用 async 。
使用 defer 属性加载的脚本将按照它们在页面上出现的顺序加载。它们在页面内容全部加载后才会运行,如果您的脚本依赖于 DOM(例如,它们修改页面上的一个或多个元素),这将非常有用。
以下是不同脚本加载方法的直观表示以及它们对您的页面的意义:
该图像来自 HTML spec ,根据 CC BY 4.0 许可条款复制并裁剪为缩小版本。
例如,如果您有以下脚本元素:
html
<script async src="js/vendor/jquery.js"></script> <script async src="js/script2.js"></script> <script async src="js/script3.js"></script>您不能依赖脚本的加载顺序。 jquery.js 可能在 script2.js 和 script3.js 之前或之后加载,如果是这种情况,则这些脚本中依赖于 jquery 的任何函数都会产生错误,因为 jquery 不会在脚本运行时定义。
当您需要加载大量后台脚本,并且只想尽快将它们放置到位时,应该使用 async 。例如,也许您需要加载一些游戏数据文件,这些文件在游戏真正开始时会用到,但现在您只想继续显示游戏简介、标题和大厅,而不想让它们被脚本加载所阻碍。
使用 defer 属性加载的脚本(见下文)将按照它们在页面中出现的顺序运行,并在脚本和内容下载后立即执行它们:
html
<script defer src="js/vendor/jquery.js"></script> <script defer src="js/script2.js"></script> <script defer src="js/script3.js"></script>在第二个示例中,我们可以确定 jquery.js 将在 script2.js 和 script3.js 之前加载,而 script2.js 将在 script3.js 之前加载。它们在页面内容全部加载之前不会运行,如果您的脚本依赖于 DOM 到位(例如,它们修改页面上的一个或多个元素),这很有用。
To summarize:
async 和 defer 都指示浏览器在单独的线程中下载脚本,同时下载页面的其余部分(DOM 等),因此在获取过程中不会阻止页面加载。
具有 async 属性的脚本将在下载完成后立即执行。这会阻塞页面,并且不保证任何特定的执行顺序。
具有 defer 属性的脚本将按其所在的顺序加载,并且只有在所有内容加载完成后才会执行。
如果您的脚本应该立即运行并且它们没有任何依赖关系,那么请使用 async 。
如果您的脚本需要等待解析并且依赖于其他脚本和/或 DOM,请使用 defer 加载它们并按照您希望浏览器执行的顺序放置它们相应的 <script> 元素。