Home > WordPress > 我的博客优化历程
2009December . 10th

我的博客优化历程

自从换了域名,换了主题以后,我一直努力令博客的浏览体验更加好,但因此也挂载了大量的JS文件,页面的载入速度一度变得非常缓慢。于是优化就迫在眉睫了。我的优化步骤是:

1.压缩CSS和JS文件,并修改一部分插件,优化页面的载入进程

一般需要另外加载JS或者CSS的插件都会存在add_action(“wp_head”,”xxxx”)或者add_action(“wp_footer”,”xxxx”)这两句代码,目的是把自己的脚本或者样式插入到主题的wp_head()wp_footer()处,使插件可以正常工作(那些反映说插件激活了但看不到效果的人注意了,我观察到相当一部分人所使用的主题不能正常加载插件的脚本,缺的就是这两个函数了)。
下面转回正题。我们需要优化载入进程,也就是流量整形,把CSS文件移到head里(这点100%的插件都能做到,不用担心),把JS文件放在页面最后。我们可以把add_action(xxxx)这句删掉,然后手工把所需的文件插入到主题模板里。

2.压缩CSS和JS,缩短文件的加载时间

经常用jQuery写脚本的人应该比较清楚,未压缩版的jQuery库(1.3.2)大小为120K左右,但min版的只有56K。因为jQuery库min版经过YUI Compressor压缩,去除了代码里的注释、无用的空格和换行符。我们也可以用YUI来压缩一下自己的脚本,压缩率能达到30%~70%。由于软件版的YUI安装过程比较复杂,这里有个在线版
而CSS的压缩就比较简单,就是去除换行符、空格和注释,大家可以用在线工具压缩一下。但主题的style.css头部被注释掉的主题信息不能删掉,否则可能导致主题不正常。
对于CSS的压缩,很多人用的PHP压缩。编写名为style.css.php的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if ( extension_loaded('zlib') and !ini_get('zlib.output_compression') and ini_get('output_handler') != 'ob_gzhandler' and ((version_compare(phpversion(), '5.0', '>=') and ob_get_length() == false) or ob_get_length() === false) ) {
	ob_start('ob_gzhandler');
}else{
	ob_start();
}
//检查是否含有Gzip相关模块,有的话就采用Gzip传输,如果主机有Apache mod_deflate.c或其它等效模块的话,可以不写这段
 
@header("Cache-Control: public");
@header("Pragma: cache");
//缓存文件
 
$expiresOffset = 3600*24*365;
@header( "Vary: Accept-Encoding" ); 
@header( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $expiresOffset ) . " GMT" );
//设置缓存时间
 
@header('Content-Type: text/css');//声明文件类型
	$cssdata = file_get_contents('style.css');//读取style.css的内容
	$cssdata = preg_replace(array('/\s*([,;:\{\}])\s*/', '/[\t\n\r]/', '/\/\*.+?\*\//'), array('\\1', '',''), $cssdata);//清除注释和换行符等
	echo $cssdata;//输出代码

把这个文件放在主题文件夹里,并把主题CSS的加载代码改为

1
2
<link rel="stylesheet" href="<?php bloginfo('stylesheet_directory'); ?>/style.css.php" type="text/css" media="all" />
</link>

当然JS文件也可以用PHP进行优化,但由于通常情况下加载的JS文件比较多,我通过另一个文件来间接加载JS。建立一个名为js.php的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if ( extension_loaded('zlib') and !ini_get('zlib.output_compression') and ini_get('output_handler') != 'ob_gzhandler' and ((version_compare(phpversion(), '5.0', '>=') and ob_get_length() == false) or ob_get_length() === false) ) {
	ob_start('ob_gzhandler');
}else{
	ob_start();
}
//同样是Gzip压缩的语句
 
$js_folder = "js/";//JS文件所在目录,相对路径
$js_src = urldecode( htmlspecialchars(  $_GET['src']  ) );//获取JS文件名
$js_file = $js_folder.$js_src;//JS文件位置
 
@header("Cache-Control: public");
@header("Pragma: cache");
//缓存文件
 
$expiresOffset = 3600*24*365;
@header( "Vary: Accept-Encoding" ); // Handle proxies
@header( "Expires: " . gmdate( "D, d M Y H:i:s", time() + $expiresOffset ) . " GMT" );
//设置缓存时间
 
@header('Content-Type: text/javascript; charset: UTF-8');//声明文件类型
	$jsdata = file_get_contents($js_file);
	echo $jsdata;
//输出内容

把这个文件放在主题目录下,在主题文件夹里建立一个JS文件夹,把所需的JS文件都放到这个文件夹里。改写一下主题,用以下方式加载JS文件:

1
<script type="text/javascript" src="<?php bloginfo('stylesheet_directory'); ?>/js.php?src=library.js"></script>

如果你的主机有Apache mod_deflate.c模块,基本上可以忽略上面的方法,因为只需要在.htaccess文件里加入以下代码就可以实现全站Gzip传输了。而且压缩率更高。

1
2
3
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-httpd-php application/x-javascript
</ifmodule>
3.整合CSS和JS文件

经过上面一番折腾以后,其实页面载入速度已经快很多了,但速度是没有止境的,我们追求更快。搞无可搞以后,只能从减少HTTP请求数下手了,这一步的目的尽量整合所有的CSS和JS。
整合CSS比较简单,用各种主流浏览器测试几个页面,没发现框架错位现象,把相关的CSS里的代码粘贴到style.css里,并把相关的CSS-image也复制到主题目录下,修改一下CSS里的图片路径就行了。
JS的整合方法则复杂点,要搞清楚那些脚本需要在对象加载前加载,否则是无效的,并且要注意不同插件的JS冲突问题。
整合完CSS和JS后,重返第一步,把插件里加载脚本和样式的语句删掉。

后记

经过优化以后,通过我自己测试,博客速度有了很大提升。Yslow的评分从70多上升到90多,用Google的PagespeedLoad Impact测试页面载入时间,已经从5s以上缩短到2~3s。
在Google宣布今后将把网站打开速度纳入PR评分基准以后,我们应该更加注重速度。另外从我的网站统计数据里可以看出(绝对真实,但暂不公开),经过优化以后,我博客的跳出率降至优化前的一半。无论我们做网站的目的是什么,要做一个好网站,从前那个著名的5s理论还是不能忽视的。

  1. 2009December . 10th - 9:15 PM

    SF
    真能折腾 想当初 我也不断地修改 但总失败 后来就放弃了

  2. 2009December . 10th - 9:31 PM

    太多的JS以及插件会使博客速度很慢的,现在就用了三个插件~~

  3. 2009December . 10th - 9:43 PM

    优化地还挺全面,很不错

  4. 2009December . 10th - 10:41 PM

    不懂优化,只能减少效果,慢慢来 :grin:

  5. 2009December . 11th - 1:27 AM

    有点专业了 我搞不定

  6. 2009December . 11th - 1:36 AM

    你复刻我的文章哇哈哈,只不过我讲理论你讲实务。:)

  7. 2009December . 11th - 7:43 AM

    JS能不用,就不用。

  8. 2009December . 11th - 10:46 AM

    嗯,压缩CSS和JS的效果可以说是立杆见影的~

  9. 2009December . 11th - 10:47 AM

    BTW,我想问一下,评论里的这个Quote是怎么做的?最近在帮学生会做网站。

  10. 2009December . 11th - 12:03 PM

    @章鱼
    慢慢来吧,其实不难的
    @笑话
    几乎所有插件我都自己优化过,去掉我不需要的功能
    @玛格丽特苏
    我还没有使出JS流量整形这招呢,哈哈
    @王涛
    能用纯JS的不用用jQuery等框架
    @Jutoy
    的确,对速度提升很大。
    ps:我下午把Quote的代码发到你邮箱吧

  11. 2009December . 11th - 12:46 PM

    @bolo
    嘿嘿好的,最好附上简单使用方法~

  12. 2009December . 11th - 2:20 PM

    原来优化还有这么多学问

  13. 2009December . 11th - 6:30 PM

    速度已经很快了。
    看到Apache mod_deflate.c模块 我就心里不舒服。
    我的apache就是不能伪静态,要不然早就搬家了。

  14. 2009December . 11th - 7:04 PM

    @LAONB
    伪静态需要的模块是mod_rewrite

  15. 2009December . 11th - 8:02 PM

    @bolo
    我已经装了,而且WP已经可以写入.htaccess,结果就是不正常。

  16. 2009December . 11th - 8:12 PM

    @LAONB
    用httpd -M查看模块有没有正常加载

  17. 2009December . 11th - 8:48 PM

    @bolo
    我用a2enmod手工添加的rewrite。
    但是依然不行,网上的教程多数是狗屎,害得我昨天写了一段很粗糙的英文叫客服帮我重装的系统。

  18. 2009December . 11th - 9:24 PM

    @bolo
    仔细查了下rewrite模块,已经起作用了,为什么WP的静态地址失效,我就郁闷了,因为我要换别的地址,收录就麻烦了,还会出想几千条404.

  19. 2009December . 11th - 9:35 PM

    @LAONB
    你设置有问题吧?

  20. 2009December . 12th - 4:10 AM

    嘿,看你的文章,我在点你广告,生活真美妙

  21. 2009December . 12th - 8:20 PM

    这个好像什么时候 在哪里也看过的 嘿嘿

  22. 2009December . 13th - 7:04 PM

    回头试一下,google说我的比65%的网站速度都慢。。。

  23. 2009December . 15th - 2:00 AM

    密密麻麻的,没怎么看懂!

  24. 2009December . 15th - 8:44 AM

    跟我的差不多了。。

  25. 2009December . 20th - 3:07 PM

    我不懂优化,可以教教我么?

  26. 2009December . 20th - 5:05 PM

    @平平
    优化的方法基本上都是差不多的
    @QiQiBoY
    我的博客比50%的网站慢,哈哈
    @皇家元林
    这篇不就是教程了么?

  27. 2009December . 23rd - 4:14 PM

    我也想优化,但是不敢轻易尝试的…

Subscriber selector

Close