谷歌关于如何包含使用的传统说明。因此,即使浏览器会以某种方式异步加载外部 JavaScript 库,直到实际执行某些代码,它仍然会阻止页面加载。后面的异步指令不直接使用,可能还会阻塞页面加载?ga.js
document.write()
document.write()
document.write()
insertBefore
但是,Google 将缓存设置max-age
为86,400 秒(即 1 天,甚至设置为public,因此也适用于代理)。因此,由于许多站点加载相同的 Google 脚本,因此 JavaScript 通常会从缓存中获取。尽管如此,即使ga.js
已缓存,只需单击重新加载按钮通常会使浏览器询问 Google 是否有任何更改。然后,就像ga.js
还没有缓存的时候一样,浏览器必须等待响应才能继续:
获取 /ga.js HTTP/1.1
主机:www.google-analytics.com
...
If-Modified-Since: 2009 年 6 月 22 日星期一 20:00:33 GMT
缓存控制:max-age=0
HTTP/1.x 304 未修改
最后修改时间:2009 年 6 月 22 日星期一 20:00:33 GMT
日期:2009 年 7 月 26 日星期日 12:08:27 GMT
缓存控制:max-age=604800,公共
服务器:高尔夫
请注意,许多用户点击重新加载他们已经在浏览器窗口中打开的新闻站点、论坛和博客,导致许多浏览器被阻止,直到收到来自 Google 的响应。您多久重新加载一次 SO 主页?当 Google Analytics 响应缓慢时,这些用户会立即注意到。(网上发布了很多异步加载ga.js
脚本的解决方案,对这类网站特别有用,但可能不再比谷歌更新的说明好。)
一旦 JavaScript 加载并执行,web bug(跟踪图像)的实际加载应该是异步的。因此,跟踪图像的加载不应阻止其他任何内容,除非页面使用body.onload()
. 在这种情况下,如果 web 错误未能及时加载,那么单击重新加载实际上会使事情变得更糟,因为单击重新加载也会使浏览器再次请求脚本,If-Modified-Since
如上所述。在重新加载之前,浏览器只等待网络错误,而在单击重新加载后,它还需要ga.js
脚本的响应。
因此,使用 Google Analytics 的网站不应使用body.onload()
. 相反,应该使用 jQuery 的$(document).ready()或 MooTools 的domready event之类的东西。
另请参阅 Google 的功能概述,解释Google Analytics 如何收集数据?,包括跟踪代码的工作原理。(这也使得谷歌收集第一方 cookie 的内容成为官方的。即:来自您正在访问的网站的 cookie。)
更新:2009 年 12 月,Google 发布了异步版本。上面应该告诉大家升级只是为了确定,虽然升级并不能解决所有问题。