我对 HTML5 中 script 元素的新 async 属性有些困惑,希望有人能给出明确的答案。
浏览器能够并行连接,因此图像将被并行下载。但是任何外部 javascript 都不会与其他外部 javascript 和图像并行下载。脚本会阻止页面加载,直到它们被下载并执行。
要在不阻塞页面加载的其余部分的情况下下载脚本,最常用的技术是创建一个脚本元素,就像 Google Analytics 片段所做的那样:
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.src = '...ga.js';
ga.async = true;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
我不确定它是如何工作的——要么
- 浏览器解析并呈现页面,然后一旦完成它就会注意到 DOM 发生了变化,导致 ga.js 脚本被下载并执行
或者
- 浏览器开始与其他资源并行下载 javascript。
我认为是后者。
新的异步 Google Analytics 代码段在它创建的脚本元素中包含 HTML5 async 属性。这无助于页面阻塞问题——“Script DOM Element”技术已经解决了这个问题。那么 async 给图片添加了什么?根据 w3schools 的说法,“如果存在异步,则脚本将与页面的其余部分异步执行(脚本将在页面继续解析时执行)”。
根据 Steve Souders 的网站,“这个 [async 属性] 的主要好处是它告诉浏览器后续脚本可以立即执行——它们不必等待 ga.js”。
那么异步和 Script DOM 元素技术都解决了同一个问题吗?