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

时间:2013-10-25 19:30:52

标签: javascript performance

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

我有一个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>

关于Lab.js的信息:http://labjs.com/

LAB会将几个其他脚本标记添加到头部,以便异步加载。它们都是立即下载的,但在“慢速服务器”脚本响应之前不会执行。有时需要一段时间。对于具有async属性的脚本(我正在Chrome中测试),这似乎是错误的行为。有什么我想念的吗?

1 个答案:

答案 0 :(得分:2)

来自this MDN page

  

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

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

然后,只要获取了异步脚本,就会执行它。这种执行可以在DOM完成加载之前或之后,完全取决于事物加载/解析的时间,并且可能在页面中的其他非异步脚本运行之前或之后。

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

如果您希望脚本在DOM和DOM中的任何常规脚本加载并运行之后才执行,那么您应该使用“defer”,而不是“async”。

仅供参考,如果您想了解所有这些的实际规格here


如果您想要更详细地解释所有这些如何适用于您的确切情况,您必须至少为我们提供一个伪代码表示您要询问的脚本,因为您的单词不够明确跟随。