博客园首页优化心得

  周末,我们对博客园首页进行了优化,将其中的一些心得与大家分享。

  背景图片的优化

  博客园首页主导航的背景图片之前存在这样的问题:在IE和Chrome中第一次打开页面时,背景图片加载延迟比较明显,如果刷新页面,背景图片所在位置会闪一下,即使图片是304状态(在FireFox中未出现这样问题,可能是FireFox加载背景图片的机制不同)。由于导航文字用的是淡灰色(#EEEEEE),在没有背景图片的白色背景色下看起来很不舒服。

  开始我们使用两种优化方法,并没有产生效果。

  1. 背景图片的预加载

<script type="text/javascript">
jQuery.preloadImages
= function() {
for (var i = 0; i < arguments.length; i++) {
jQuery(
"<img>").attr("src", arguments[i]);
}
}
var staticImgUrl ="http://static.cnblogs.com/images/";
$.preloadImages(staticImgUrl
+ "bg_menu_nav.png");
</script>

  参考文章:了解jQuery技巧来提高你的代码

  2. 背景图片的压缩

  所用工具:Pngcrush

  操作命令:pngcrush -reduce -brute bg_menu_nav.png bg_menu_nav2.png

  参考文章:Best Practices for Speeding Up Your Web Site

  接着,我们就想不用背景图,但用CSS不能实现背景图中的渐变色(filter只支持IE),于是试着用多个1px高的div拼渐变色效果,也没成功。

  后来,我们用了一个欺骗式的方法缓解了这个问题,给导航栏加一个与背景图片最接近的背景色,这样从无背景图片到有背景图片的加载过程中,颜色上的变化不会很大,从我们的体验,感觉还是可以接受的。

  HTML代码中的空格、空行处理

  使用下面的ASP.NET代码对页面输出进行清理

private static readonly Regex REGEX_LINE_BREAKS = new Regex(@"\n\s*", RegexOptions.Compiled);
private static readonly Regex REGEX_LINE_SPACE = new Regex(@"\n\s*\r", RegexOptions.Compiled);
private static readonly Regex REGEX_SPACE = new Regex(@"( )+", RegexOptions.Compiled);

protected override void Render(HtmlTextWriter writer)
{
using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new System.IO.StringWriter()))
{
base.Render(htmlwriter);
string html = htmlwriter.InnerWriter.ToString();
html
= REGEX_LINE_BREAKS.Replace(html, string.Empty);
html
= REGEX_LINE_SPACE.Replace(html, string.Empty);
html
= REGEX_SPACE.Replace(html, " ");
writer.Write(html.Trim());
}
}

  更进一步的需要清理回车换行符。

  js文件压缩

  工具:JSMin

  命令:jsmin <site.src.js >site.js

  CSS命名缩短

  抱着省一个字节是一个字节的原则,将CSS的class命名缩短。

  部分内容采用脚本加载

  比如网站二级分类,改为jQuery调用WebService加载,不仅减小了页面大小,而且减小了服务器端显示首页时的处理负担。

  小结

  这次的首页优化,从我们的使用体验上看效果是比较明显的,当然首页的优化还有很大的空间,我们会继续优化。

  如果您对博客园首页优化有什么建议,期待您的分享!

posted @ 2009-12-07 09:04 博客园团队 阅读(5130) 评论(58) 编辑 收藏

 回复 引用 查看   
#1楼 2009-12-07 09:06 迭戈      
我用FF,很快的
 回复 引用 查看   
#2楼 2009-12-07 09:07 感觉没了      
哦知道了
 回复 引用 查看   
#3楼 2009-12-07 09:08 Jeffrey Zhao      
首页缓存一下就好,本来也很快的。
倒是我得个人页面,现在的皮肤加载太多css/js/img,roundtrip有些多,有机会我也想优化一下,不知道到时候能否联系博客园的老大们。

 回复 引用 查看   
#4楼 2009-12-07 09:11 感觉没了      
引用Jeffrey Zhao:
首页缓存一下就好,本来也很快的。
倒是我得个人页面,现在的皮肤加载太多css/js/img,roundtrip有些多,有机会我也想优化一下,不知道到时候能否联系博客园的老大们。

我觉得也是,缓存就足够了吧

 回复 引用 查看   
#5楼 2009-12-07 09:11 llj098      
对,个人页面的速度,实在是,,,
 回复 引用 查看   
#6楼 2009-12-07 09:12 飞林沙      
@Jeffrey Zhao
引用Jeffrey Zhao:
首页缓存一下就好,本来也很快的。
倒是我得个人页面,现在的皮肤加载太多css/js/img,roundtrip有些多,有机会我也想优化一下,不知道到时候能否联系博客园的老大们。


缓存的话怎么及时更新呢?

 回复 引用 查看   
#7楼 2009-12-07 09:15 Gnie      
我说周末怎么那么慢
 回复 引用 查看   
#8楼 2009-12-07 09:20 lumnm      
关注
 回复 引用 查看   
#9楼 2009-12-07 09:23 在别处      
感谢博客园的分享。
 回复 引用 查看   
#10楼 2009-12-07 09:26 假正经哥哥      
我看的首页向来是没有背景图片的啊。。
 回复 引用 查看   
#11楼 2009-12-07 09:26 .netlover      
厉害。。。
 回复 引用 查看   
#12楼 2009-12-07 09:47 .NET*DR_      
不进来支持下就妄逛园子了,即使在上班时间!
 回复 引用 查看   
#13楼 2009-12-07 10:08 Leon yang      
怎么首页文章又不是在新窗口中打开文章了?这样很不方便。
 回复 引用 查看   
#14楼 2009-12-07 10:09 xhp      
呵呵。。同上
 回复 引用 查看   
#15楼 2009-12-07 10:10 小师傅      
引用Jeffrey Zhao:
首页缓存一下就好,本来也很快的。
倒是我得个人页面,现在的皮肤加载太多css/js/img,roundtrip有些多,有机会我也想优化一下,不知道到时候能否联系博客园的老大们。



同样想请教下,缓存了的话,怎么样及时更新?

缓存了还不要一样要传到客服端啊,那减小CSS,JS不更好啊,还只进行缓存就可以了,你以为万能啊。
 回复 引用 查看   
#17楼 2009-12-07 10:12 Jeffrey Zhao      
引用飞林沙:
缓存的话怎么及时更新呢?

业务逻辑控制啊

 回复 引用 查看   
#18楼 2009-12-07 10:16 Jeffrey Zhao      
引用缓存也要传输啊:缓存了还不要一样要传到客服端啊,那减小CSS,JS不更好啊,还只进行缓存就可以了,你以为万能啊。

优化要针对瓶颈,首先JS/CSS有压缩,其次它们的缓存可以不传输数据。
我说的缓存是减少服务器端运算,合并JS/CSS/Img是减少roundtrip,这些是更有效的。
为了几个字节减少CSS,JS的效果不大的,当然有更好,看这投入和不合算了。

 回复 引用 查看   
#19楼 2009-12-07 10:17 Justin      
要是有优化前后的对比数据就更好啦
另外:个人主页啥时候也给优化优化,或者可以公开一些接口,可以让我们自己优化

 回复 引用 查看   
#20楼[楼主] 2009-12-07 10:35 博客园团队      
@Justin
博客和个人主页都有开放接口的打算,但开放接口之前需要做大量的系统重构。

 回复 引用 查看   
#21楼 2009-12-07 10:40 宝玉      
"HTML代码中的空格、空行处理" 这个如果没结合页面缓存,会比较耗CPU的,既然已经IIS已经开启GZip压缩了,其实这个不很必要。

一般首页更新及时性要求没那么高,固定Cache过期时间就可以了,比如5分钟。不过既然博客园用的是集中的MemoryCache服务,那么在有新的Item插入,去更新一下首页Cache也就可以保证Cache实时更新了。

 回复 引用 查看   
#22楼 2009-12-07 10:44 爆牙齿      
用background-color来处理是比较常见的手法,其弊端在于不能直接用在有alpha通道的图片背景上(比如发光、投影、透明)。

另:看了一下,1px的平铺,改成10px或50px宽度的平铺吧。

另:-webkit-gradient(linear,0% 0%,0% 100%,from(#2D3642),color-stop(0.012,#6D85A3),color-stop(0.988,#6D85A3),to(#2D3642));
这个属性马上现身的FF3.6也支持,非常好的东西。

多用用css3。

最后,在浏览器兼容设计上,不要用统一的视觉去看待,用分级的视觉去看待。

 回复 引用 查看   
#23楼 2009-12-07 11:12 卡索      
要说优化啊,压缩啊!其实个人觉得首页还不够完美,可以考虑把首页代码进行压缩,去掉所有的空格换行等
其次了Css也可以压缩,js这个就不用说啦,上面也说了,使用了JSMin,不过个人觉得压缩的还是很有限,推荐个工具JSA,可以搜索下一个百度的人写的,这个压缩的效果在目前来同类要说工具中来说不敢说第一,但是绝对可够得上前三甲。
另外就是有些东西是可以考虑客户端缓存的,比如说站点的logo这个不是经常变吧,jQuery库同样也可以客户端缓存不是...
优化的话个人觉得这个可以有很多细节,只要找到一个平衡点就好了!

 回复 引用   
#24楼 2009-12-07 11:39 sharper[未注册用户]
Render HTML 对空格 换行压缩, 不加,操作字符串。 直接使用IIS GZip压缩即可了。

 回复 引用 查看   
#25楼 2009-12-07 11:40 oec2003      
引用Leon yang:怎么首页文章又不是在新窗口中打开文章了?这样很不方便。

嗯 也希望在新窗口打开

 回复 引用 查看   
#26楼 2009-12-07 11:51 没剑      
举报个css显示问题:偶用遨游(ie6)下,首页的导航条上最右边的找找看,搜索框和按钮都没垂直居中,而上顶上了。
 回复 引用 查看   
#27楼 2009-12-07 11:54 Done      
闪一下,感觉。。。
 回复 引用   
#28楼 2009-12-07 12:28 xixihahaha[未注册用户]
像这种无关痛痒的优化,也值得拿到首页来炫啊,呵呵
 回复 引用 查看   
#29楼 2009-12-07 12:43 小伍      
引用Leon yang:怎么首页文章又不是在新窗口中打开文章了?这样很不方便。

同意~

 回复 引用 查看   
#30楼 2009-12-07 13:06 Kevin Dai      
可以考虑把CSS文件、JS文件各自合并,记得Omar有篇文章就是说这个的。这样会明显提升加载速度的吧。
 回复 引用 查看   
#31楼 2009-12-07 13:27 小 严      
@Leon yang
请在新窗口中打开博文

 回复 引用 查看   
#32楼 2009-12-07 13:27 小 严      
请在新窗口中打开博文
 回复 引用 查看   
#33楼 2009-12-07 14:26 Tony Qu      
见变色可以用jsGraphics生成,写在要生成的元素下面就可以很快加载,基本不会闪烁
 回复 引用 查看   
#34楼[楼主] 2009-12-07 14:40 博客园团队      
引用爆牙齿:
用background-color来处理是比较常见的手法,其弊端在于不能直接用在有alpha通道的图片背景上(比如发光、投影、透明)。

另:看了一下,1px的平铺,改成10px或50px宽度的平铺吧。

谢谢你的建议!已经改为50px。

 回复 引用 查看   
#35楼 2009-12-07 15:20 birdshome      
引用xixihahaha:像这种无关痛痒的优化,也值得拿到首页来炫啊,呵呵

前半句还算是说出了皇帝的新衣,后半句简直就是狗屎。

优化这个东西,第一点应该是优化的目的,瓶颈是什么,为什么要做优化。

Web站点,影响速度几个关键问题,流量压力,CPU压力,数据库压力,外加一个对普通站点基本不太影响生活的客服端页面渲染/脚本执行速度。

流量压力:带宽太小,共享带宽,资源文件流量过大(图片,文件,乱七八糟的东西),盗链(被讯雷了啥的),服务器IO不够

CPU压力:不合理的服务器配置,程序的不足/缺陷

数据库压力:这个专题就多了

那么现在这个优化针对了什么问题呢?解决了什么问题呢?优化的量化指标是什么?

 回复 引用 查看   
#36楼 2009-12-07 15:21       
@博客园团队

哈哈。这个设计我很早就考虑到了。给团队一个思路。

所谓api开放,实际上就是用json、或者rest把数据库操作暴露出来。

无论咱们怎么去回避这个问题,可以去看看google、taobao开放的api,就是到,本质还是通过用户输入去查询数据库。

因此只要有一套通用的暴露框架(提供了验证等等),那么开放api变得非常简单。

结果就是把用户的 querystring -> sqlparameter + sql, 然后查询table / view,返回的datatable再变成json。

 回复 引用 查看   
#37楼[楼主] 2009-12-07 15:32 博客园团队      
引用没剑:举报个css显示问题:偶用遨游(ie6)下,首页的导航条上最右边的找找看,搜索框和按钮都没垂直居中,而上顶上了。

谢谢你反馈这个问题!
现在好了。

 回复 引用 查看   
#38楼[楼主] 2009-12-07 15:33 博客园团队      
@
谢谢你提供的思路!

 回复 引用 查看   
#39楼 2009-12-07 17:34 麦子|君子兰      
为什么要及时更新-_- 不了解了就
看文章呢还是拉页面呢

 回复 引用 查看   
#40楼 2009-12-07 21:19 OOLi      
我用IE7,左侧导航二级分类错位了哦?
 回复 引用 查看   
#41楼 2009-12-07 21:21 canbeing      
学习了一下优化,支持优化
 回复 引用 查看   
#42楼 2009-12-07 21:38 FengYun85      
我测了一下,jsmin.exe的压缩率远不及yahoo ui compressor.
 回复 引用 查看   
#43楼 2009-12-07 21:52 阿K&LiveCai      
引用假正经哥哥:我看的首页向来是没有背景图片的啊。。


哈哈

 回复 引用 查看   
#44楼 2009-12-07 22:14 深山老林      
晚上的时候访问博客园还是会有些慢,希望能够优化的更好。
从此学习网已按照博客园的优化方式做了优化:
http://www.***

 回复 引用 查看   
#46楼 2009-12-07 23:31 宝玉      
建议一下:
我发现很多css文件等静态文件还是放在www这个站点下的,例如
http://www.cnblogs.com/css/common.css

本身www这个站点就加了*.*到asp_net.dll的映射,所有请求都经过asp_net,对IIS的性能会有很大影响,所以要优化的话,第一步是先把这些静态文件全部移出去。

另外对于这类静态文件服务器都不定需要用Windows Server,也许可以考虑用其他开源的专门支持http的服务器,例如nginx

 回复 引用 查看   
#47楼[楼主] 2009-12-07 23:47 博客园团队      
@宝玉
早就不用*.*到asp_net.dll的映射了:)

 回复 引用 查看   
#48楼 2009-12-07 23:57 Jeffrey Zhao      
@宝玉
其实windows下host静态文件和文件下载,性能是相当不错的,测试一下便知。

 回复 引用 查看   
#49楼 2009-12-08 09:24 Jwin      
将css和image放在一个静态目录
使用iis缓存输出
效果是不是更好?

 回复 引用 查看   
#50楼 2009-12-08 10:39 宝玉      
引用Jeffrey Zhao:
@宝玉
其实windows下host静态文件和文件下载,性能是相当不错的,测试一下便知。

这个我绝对相信,但是成本可也要更高 :)
不过我估计博客园的windows server的lisence不需要去购买,因为dudu是MVP,嘿嘿。

 回复 引用 查看   
#51楼 2009-12-08 10:39 宝玉      
感谢您的回复:) 提交耗时57377毫秒
 回复 引用 查看   
#52楼 2009-12-08 10:50 birdshome      
57377毫秒?一分钟???
 回复 引用   
#53楼 2009-12-09 23:31 jady[未注册用户]
如果把js都写在一个位置,应该会让页面在快速很多。可以采用这样的排列顺序:
样式
外链script
inline script

而且这些要放到header中,这样会让页面的加载和解析基本上不中断,对于不重要的统计等代码,可以动态的append

 回复 引用 查看   
#54楼 2010-04-10 16:44 不弃的追求      
我在后台管理里面勾选了 阅读排行榜 选项,为什么我的首页却显示不出来呢????????博客园没有什么实用手册吗?

 回复 引用 查看   
#55楼[楼主] 2010-04-10 21:10 博客园团队      
@不弃的追求
现在有了,目前没有实用手册。

 回复 引用 查看   
#56楼 2010-11-24 17:44 Now      
回复代码又问题!!!

有时候很快。。。
有时候 很久很久。。。。

 回复 引用 查看   
#57楼 2010-11-24 17:45 Now      
    private static readonly Regex regReplaceBlank = new Regex(">(\\s+)<", RegexOptions.IgnoreCase);
    private static readonly Regex regReplaceLine = new Regex("\\s\\n", RegexOptions.IgnoreCase);

protected override void Render(HtmlTextWriter writer)
    {
        using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new System.IO.StringWriter()))
        {
            base.Render(htmlwriter);
            string html = htmlwriter.InnerWriter.ToString();
       
            html = regReplaceBlank.Replace(regReplaceLine.Replace(html, ""), "><");
            writer.Write(html.Trim());
        }
    }


这样不是更小!!

 回复 引用 查看   
#58楼[楼主] 2010-11-24 17:47 博客园团队      
@Now
你是说代码着色效果的加载吗?