具有 asyc 属性的脚本仍会阻止其他脚本执行

Scripts with asyc attribute still block other script execution

本文关键字:脚本 其他 执行 asyc 属性 具有      更新时间:2023-09-26

注意:我没有开发这个网站 - 我只需要处理它。

我有一个带有 LAB 的文档.js用于在头部异步加载一系列脚本。再往下,我还有两个外部脚本,一个在头部下方,另一个在正文顶部。

这两个脚本通常无法访问。它们都标记为"异步",并且不会阻止文档加载。但是 - 它们显然会阻止其他脚本执行。

需要明确的是,第一个系列的脚本会立即下载,但在下载其他两个异步脚本之前似乎不会执行。

该站点不是公开的,并且无法在 jsfiddle 中创建此类问题。一个粗略的例证:

<!doctype html>
<head>
     <!-- This script asynchronously loads many others -->
     <script src="/js/LAB.js"></script>
     <script src="slow-server/js/slowscript1.js" async></script>
</head>
<body>
     <script src="show-server/js/slowscript2.js" async></script>
</body>

实验室信息.js:http://labjs.com/

LAB会将其他几个脚本标签附加到要异步加载的头部。它们都会立即下载,但在"慢速服务器"脚本响应之前不会执行。有时需要一段时间。在我看来,对于具有异步属性的脚本,这似乎是不正确的行为(我正在 Chrome 中进行测试)。我错过了什么吗?

从这个MDN页面:

使用这些可以选择三种可能的模式 属性。如果存在异步属性,则脚本将是 异步执行,一旦可用。如果异步 属性不存在,但 defer 属性存在,则 脚本在页面完成解析后执行。如果两者都不是 属性存在,然后获取并执行脚本 立即,在用户代理继续解析页面之前。

因此,当脚本具有异步时,它将立即从服务器获取,但 DOM 解析将继续并行。 这部分简单明了。

然后,一旦获取异步脚本,它就会被执行。 此执行可能在 DOM 完成加载之前或之后,这完全取决于加载/解析的时间,并且可能是在页面中的其他非异步脚本运行之前或之后。

请注意,由于浏览器中的 javascript 是单线程的,因此一旦此异步脚本开始执行,在此脚本完成之前不会运行其他脚本,即使它是"异步"的。 脚本上的异步允许 DOM 的解析继续(而不是阻止),但它不会阻止脚本在可用时执行,一旦执行,其他处理必须等待它完成执行。

如果您希望脚本在 DOM 和 DOM 中的任何常规脚本加载并运行之前不执行,那么您应该使用"延迟",而不是"异步"。

仅供参考,如果您想浏览所有这些的实际规格,它就在这里。


如果您想更详细地解释所有这些如何适用于您的确切情况,您至少必须向我们提供您询问的脚本的伪代码表示,因为您的单词不够清晰,无法遵循。