查看使用开发人员工具中的 Chrome 网络选项卡加载的页面,我在以下链接中收到以下时间:
http://www.seed-city.com/barneys-farm-seeds/liberty-haze
102 requests | 131.24KB | 8.41s (onload: 8.50s, DOMContentLoaded: 6.61s)
102 requests | 131.47KB | 8.47s (onload: 8.56s, DOMContentLoaded: 6.82s)
102 requests | 131.45KB | 8.71s (onload: 8.79s, DOMContentLoaded: 7.06s)
现在,做一个(有点简单的)改变:
103 requests | 110.16KB | 3.77s (onload: 3.86s, DOMContentLoaded: 2.03s)
103 requests | 110.17KB | 3.85s (onload: 3.94s, DOMContentLoaded: 2.21s)
103 requests | 110.16KB | 4.20s (onload: 3.50s, DOMContentLoaded: 2.28s)
这是从当前页面的网络选项卡输出的典型 HAR 日志:
http://pastebin.com/pM5Dd1Fw
重要的部分是要意识到浏览器正在等待将近 5 秒钟甚至做任何事情(仅截断以显示相关行):
{
"startedDateTime": "2012-09-29T04:58:07.861Z",
"time": 4831,
"request": {
"method": "GET",
"url": "http://www.seed-city.com/barneys-farm-seeds/liberty-haze",
"httpVersion": "HTTP/1.1",
...
},
"cache": {},
"timings": {
"blocked": 0,
"dns": 16,
"connect": 129,
"send": 0,
"wait": 4677, // <<< Right here
"receive": 8,
"ssl": -1
}
}
以及slow.html
页面的时间:
{
"startedDateTime": "2012-09-29T05:04:51.624Z",
"time": 92,
"request": {
"method": "GET",
"url": "http://example.com/t/slow.html",
"httpVersion": "HTTP/1.1",
...
},
"timings": {
"blocked": 0,
"dns": 7,
"connect": 38,
"send": 0,
"wait": 44, // <<< Right here
"receive": 1,
"ssl": -1
},
"pageref": "page_3"
}
那是4677ms
vs 44ms
。这是该更新页面的典型 HAR 日志:
http://pastebin.com/Jgm1YyU3
那么我做了什么来实现那些(非常真实和切实的)改进?我将 Javascript 移到body
标签的底部:
http://pastebin.com/H9ajG99H
这带来了两倍的改进。首先,您允许浏览器在开始与阻塞进程(script
调用)交互之前继续并加载您的内容。因此,您的客户会“注意到”一个更快的网站,仅仅是因为页面似乎加载得更快(实际上您只是允许它在运行时加载)。其次,您要等到body
标签基本上完全加载后,才开始使用它的内容。
看起来您没有在标头中使用缓存指令来告诉浏览器不要长时间检查文件的更新。所以你的 Twitter 和 Facebook 图标,看起来浏览器认为它需要重新检查服务器,所以理论上应该是不必要的,除非经常这样。但是“等待”的时间:
twitter_aqu_64.png 1.32s
ajax-loader.gif 1.31s
ssl-icon.jpg 1.31s
现在,我不是缓存控制方面的专家。这是一个有点黑暗的艺术。但是这些时间让我觉得那里可能会发生一些事情。
试试这个答案以获取有关缓存控制的更多信息:
HTML 缓存控件