google.com 首页代码分析
机缘巧合,对 google.com 的首页代码产生了浓厚兴趣。一点“分析”,杂记如下:
不同浏览器推送不同代码

上图是在不同浏览器下,保存的 google 首页代码。
注意:文件大小是经过 IntelliJ IDEA 格式化处理后的大小。
其中 Chrome 和 Safari 的代码是一样的,Opera 仅仅一个 js 函数的写法与 Chrome 不同。差异最大的是 Firefox 和 IE。
我的想法:大部分应用场景下,针对不同浏览器实现不同版本,会增加开发和维护成本。google 首页采取这种差异化方案,很可能是考虑到要最大限度降低网页流量。毕竟对于日访问量上千万的网站来说,减少一个字符都能节约可观的流量。精简节约,在 google 首页上体现得淋漓尽致,下面会继续提及。
doctype 的写法
只有 Firefox 用了<!doctype html>来激活标准模式。其它浏览器下,都是简单粗暴的 Quirks 模式。
我的想法:Firefox 下也可以直接用 Quirks 模式,视觉差异上极小。不清楚 google 为何仅针对 Firefox 开启了标准模式。
值得注意的是,在 google 搜索结果页,所有浏览器下都使用了<!doctype html>. 毕竟结果页复杂些,依旧用 Quirks 模式的话,会增加开发成本。首页因为简单,Quirks 和 Standards 相比,没什么显著差别,因此能省就省。
关于 doctype, 强烈推荐阅读:Activating Browser Modes with Doctype
对浏览器来说,doctype 实际上仅影响浏览模式,因此能从简就从简。W3C 校验,我觉得没必要,很少关注。
精简,还是精简
以 Firefox 下 google 首页的源码为例:
- html, body 缺胳膊少腿
- html 元素的很多属性没有用双引号括起来
- class, id 等命名很短
- script 和 style 元素没 type 等属性
- 没有 keywords 和 description 等 meta 值,我是搜索老大,哈哈
- balabala 等等
想起一句话:遵守规范的一个重要标准,就是知道何时打破它,并大胆地打破。从这层意义上讲,google 首页是非常遵守规范的。
没有完美
细心点,还可以发现:
- 引号去得不彻底,比如
<img alt="Google" ... - 还有
padding-left: 0px, px 可以去掉
js 上,也有进一步精简的余地。比如下面两行完全一样的代码,很囧:
if(google.y) google.y.first = []; if(google.y) google.y.first = [];
还有一段代码,div 提前到 script 前面能省去判断:
<script>
function wgjp() {
var xjs = document.createElement('script');
xjs.src = '/extern_chrome/1mZ_-PL2Zjc.js';
(document.getElementById('xjsd') || document.body).appendChild(xjs)
};
</script>
<div id=xjsd></div>
也许吹毛求疵了,笑过。
预加载
看代码:
<body onload="sf();if(document.images){new Image().src='/images/nav_logo4.png'}" ...
这就是 YSlow 34条性能法则中的 Preload Components. google 首页提前加载了搜索结果页的 css sprite. 另外赞一下这个 sprite 图的组织,很 cute.
延迟加载
看代码:
window.setTimeout(function() {
var a = document.createElement("script");
a.src = "/extern_js/f/.../XRt_2Y4Z5sM.js";
(document.getElementById("xjsd") || document.body).appendChild(a)
}, 0);
上面这个 js 挺大的,包含了 google 的 js 库和输入框的提示补全组件。这个 setTimeout 起到了将下载进程延迟到 window.onload 后。很小的代码调整,却提升了不少用户体验,实在划算。
另提一下,这个 js 在不同浏览器下也有不同版本,大小差异比较明显。为了尽可能减少流量,google 还真费心。
奇淫技巧
代码虽少,淫荡之处却摇曳生姿:
1. 遍历数组
for (var i = 0,c; c = ["ad","p","pa","zd","ac","pc","pah","ph","zc"][i++];) {
// doing something, such as console.log(c)
}
2. 短路语句
function _gjp() {
!(window._gjwl.hash && window._gjuc()) && setTimeout(_gjp, 500)
}
短路表达式很常用,但用短路单独做语句,还真精简。
语义化
从语义上讲,google 的 html 代码是比较糟糕的。但考虑到各种浏览终端,或许 google 目前的写法非常优化。没有接触过跨n > 20的浏览器开发经验,对此不多说。
小结
从首页代码中,能看出 google 推崇的是:简单 + 实用 + 性能。我越来越认同这种观点。

June 10th, 2009 on 22:59
了解标准,通晓标准,并不是死板遵循,而是需要知道在什么情况下打破, 这是对标准的另一个深层境界上的理解吧。。悟ing。
June 10th, 2009 on 23:04
我只能说,当老大就是好,有人膜拜!
June 10th, 2009 on 23:21
一切从简
June 10th, 2009 on 23:21
这边网速很慢,但是页面未加载完成就可以获得自动提示补全,说明自动补全并为等到onload之后。
另外onload才focus输入框不适合我这样的急性子,尤其在网速慢的时候。
关于简单法则我很赞同,但是Google可以这么乱来,被Google的网站就不一定了,而且标准化,语义化是有实际价值的,前端人员是有责任有义务将这个付诸行动的。
奇技淫巧果然很淫荡,不过效率会随着数组的长度增加而降低(需要多次实例化对象),当然实际应用中一般会引用一个实例化对象。
for(var i=0, a=["ad","p","pa","zd","ac","pc","pah","ph","zc"], c; c=a[i++];){
document.write(c+”");
}
June 11th, 2009 on 1:23
看见wmd编辑器,特地留个言=。=
markdown是个好东西……
June 11th, 2009 on 1:26
佩服研究精神!
June 11th, 2009 on 8:29
遍历数组那么做的话,就要在循环体内判断条件在推出了。。。
我还是喜欢下面的方式。
for(var i=0, a=["ad","p","pa","zd","ac","pc","pah","ph","zc"], c,len=a.length; i<len;c=a[i++]){
document.write(c+””);
}
June 11th, 2009 on 8:30
而且正常情况浏览的话会发现 一些无所谓的空格都省略了,和百度一样。
June 11th, 2009 on 8:57
我好像在看中学课本上对鲁迅先生文章的评语
June 11th, 2009 on 9:06
厉害~~~一直很欣赏google的东西,想不到页面也是个艺术品~
June 11th, 2009 on 9:27
文采很好~~呵呵
June 11th, 2009 on 9:27
google首页东西很少可以这么搞,你让他搞个sina首页试试。
June 11th, 2009 on 9:46
Google的首页一直以来有专人维护,在性能优化上面算是下足了功夫。
不过按照这番分析,还是有一些地方可以继续优化嘛~
June 11th, 2009 on 9:51
用股沟自家的page speed也能找出一些可以进一步优化的地方,不知这个专门维护的人是怎么优化的
June 11th, 2009 on 11:55
学习
June 11th, 2009 on 12:16
受教了,一直想看到分析google页面的文章
google也忒小气,也不派人人出来分析一下他们的页面。
June 11th, 2009 on 15:59
比较专业,写的。
June 11th, 2009 on 17:19
我觉得google另一个意思就是让你看不懂他的代码,或者根本不想看
google office就更厉害
June 11th, 2009 on 18:38
看着好象是shell script出身的哥们写的代码。尤其是那个遍历和短路,太常用了
June 11th, 2009 on 21:57
分析的很细致
for (var d = 0,c; c = ["ad","p","pa","zd","ac","pc","pah","ph","zc"][d++];)
够yy
June 11th, 2009 on 22:22
google本身并不需要考虑SEO方面的东西,因为它并没有那个需要~~所以代码方面,只要高效就行,并不需要刻意地去标准化,对于商业的东西而言,效率和利益才是最本质的,毕竟标准是不能当饭吃的~~~
June 12th, 2009 on 14:26
http://www.google.cn仍然是怪异模式。
June 12th, 2009 on 18:54
分析的不错,雕…
June 15th, 2009 on 9:35
不错,学习中… :)
June 15th, 2009 on 9:40
感觉这些代码并不是最原始的代码,而是经过什么工具特殊处理过的。比如那个两行一样的代码的低级错误,应该不是人为造成的。
June 17th, 2009 on 23:48
同意楼上的,那些 class/id 明显不是给人用的,应该有一套部署到生产环境前的混淆和打包处理
June 21st, 2009 on 2:14
很早以前的时候看yahoo的也是通过js来判断不同的浏览器显示不同的版本,一直兼容到ie4
June 28th, 2009 on 2:08
谷歌可以这样做,你淘宝敢这样做吗?你整个阿里敢这样做吗?
June 28th, 2009 on 2:09
标准的出现必然有标准的道理!听你在文中所说的话,好像根本不把标准放在眼里!
June 28th, 2009 on 2:11
对浏览器来说,doctype 实际上仅影响浏览模式,因此能从简就从简。W3C 校验,我觉得没必要,很少关注。
我又说错了
不过检验是有必要的,目的不是为了通过标准!检验可以为我们检测有时候因为手误等原因造成的错误!
June 28th, 2009 on 8:03
@周裕波:考虑到SEO等,阿里肯定不敢全盘照搬google的做法,但借鉴可适用的地方还是可以的
W3C标准我是很看重的,我不看重的是通过W3C校验。现在不少前端,有为了通过校验而标准的做法,个人很鄙夷
检验手误等错误有各种方法,去W3C校验是最慢最耗时的一种
July 3rd, 2009 on 12:41
好文!
是为了开启firefox3.5的html支持吧? 有发现html5代码的踪影吗?
July 5th, 2009 on 17:24
google真是YD无比啊…
很久以前就看那些代码很佩服,没想到还有人耐心的研究了一下下
July 8th, 2009 on 18:21
引用原文:1.遍历数组
for (var i = 0,c; c = ["ad","p","pa","zd","ac","pc","pah","ph","zc"][i++];) {
// doing something, such as console.log(c)
}
这个可以精简得更少代码实现:
for(i in c=["ad","p","pa","zd","ac","pc","pah","ph","zc"]){alert(c[i]);}
September 1st, 2009 on 16:01
感觉有点像商人,只要能提高性能啥都能丢。
November 6th, 2009 on 12:02
cl said:
July 8th, 2009 on 18:21
引用原文:1.遍历数组
for (var i = 0,c; c = ["ad","p","pa","zd","ac","pc","pah","ph","zc"][i++];) {
// doing something, such as console.log(c)
}
这个可以精简得更少代码实现:
for(i in c=["ad","p","pa","zd","ac","pc","pah","ph","zc"]){alert(c[i]);}
for in 的效率要低很多
leave a reply