Typecho默认主题网页性能优化
之前用谷歌网站分析工具PageSpeed Insights在手机端和桌面设备都是100分的,今天测试了一下,有几项需要优化,分数还不到90分,不知道怎么回事,可能打分逻辑改了吧,继续优化。
之前已经对Typecho默认主题改造过很多东西,具体看Typecho默认主题修改汇总,现在又有了新想法,把博客精简到极限,由于我也不懂代码,只能在默认主题上边搜索边精简了,以下做为记录,供以后查询。
去掉侧边栏
这个比较简单,在各个主题php文件里去掉<?php $this->need('sidebar.php'); ?>
,然后再把head.php
文件里和搜索相关代码去掉,最后再把侧边布局框架去掉,就是各个php文件里的class="col-mb-12 col-8" id="main" role="main”
,大概就是这样。
删除侧边栏原因
去掉侧边栏,除了想要精简的外观外,也是想让DOM元素量减少,因为我发现typecho默认主题的侧边栏虽然在手机端不显示了,但网页依然在加载这些内容,只是隐藏起来了,在手机上查看网页源代码就能看到,所以为了让任何设备都快速加载,也必须删除了。侧边栏,目前来看也没什么主要用处,一个归档页面全包含侧边栏的功能了。
避免DOM 元素总数过多
根据谷歌页面提示,大型 DOM 树会以多种方式降低网页性能:
网络效率和负载性能:大型 DOM 树通常包含许多用户首次加载页面时不可见的节点,这会不必要地增加用户的数据费用并延长加载时间。
运行时性能:当用户和脚本与您的页面互动时,浏览器必须不断重新计算节点的位置和样式。大型 DOM 树与复杂的样式规则相结合可能会严重降低渲染速度。
内存性能:如果您的 JavaScript 使用常规查询选择器(例如 document.querySelectorAll('li')),您可能会在无意中存储了对大量节点的引用,这可能会使用户设备的内存容量超负荷。
Lighthouse 使用符合以下条件的 DOM 树标记网页:
- 当 body 元素所含的节点超过 800 个左右时发出警告。
- 当 body 元素所含的节点数量超过约 1,400 个时出现的错误。
DOM 元素数量查询
在浏览器开发者工具的控制台里,输入以下代码回车即可查询总数。document.getElementsByTagName('*').length
更详细的查看方式,可以输入这个代码$$('*')
css精简
把Typecho默认主题的三个css文件进行精简合并成一个,方法很简单,手动复制到其中一个css文件里面就行。最后再把head.php文件里的引用链接替换一下。
代码覆盖率
精简css的方法,主要是靠谷歌浏览器开发者工具里的覆盖率来完成的(在网页右键,点击最下方检查即可调出开发者工具,然后点击右上角三个点,选择更多工具,就能看到覆盖率功能了,点击左侧小图标,开始覆盖率检测),代码左侧标红就是当前页面为使用的代码,注意,是当前页面,删除一个css样式前要测试有没有在其他页面应用,确认都没有使用后即可删除,最终css大小为3.8k,网页前端压缩后为1.8k。
代码压缩
等把没用的css代码删除后,再压缩一下让文件更小一些。推荐使用这个在线压缩工具,相比其他工具功能更多,比如有个静化功能,就是把css代码压缩成单行并去除注释,这样即保证了压缩,又不影响可度性。还有一个整理功能,按一定顺序重新排列css属性,也不错。
cdn加速
本来想的是把css和ico图标放到cdn的,后来想想这么小的文件也不值当,而且cdn的hppts请求还是按次计费的,不用比较省心。
缓存设置
在服务器根目录.htaccess
文件里添加如下内容,缓存设置的是一年。
<FilesMatch "\.(css|js)$">
SetOutputFilter DEFLATE
Header set Cache-Control "public, max-age=31536000, must-revalidate"
</FilesMatch>
<FilesMatch "\.(ico|gif|jpg|png|jpeg|webp|pdf|flv|mp3|mp4)$">
Header set Cache-Control "public, max-age=31536000, must-revalidate"
</FilesMatch>
缓存说明
- public:这个指令指定响应可以被任何缓存所缓存
- max-age:这个指令指定了资源被缓存的最大时间,单位是秒。
- must-revalidate:这个指令要求缓存在资源超过期限(由max-age指定)之后,必须向服务器发送请求进行验证,以确保资源仍然是有效的。
删除评论相关js依赖
在精简的过程中,发现html源代码里,在header里有评论相关的js依赖,由于我的博客早已关闭评论,所以这个也没啥用了,但删除着实费了一些劲,原来这个js并没有在主题里面,而且写到了博客程序里,删除路径:在博客程序目录里找到该文件var/Widget/Archive.php
,删除以下代码
if ($this->options->commentsThreaded && $this->is('single')) {
if ('' != $allows['commentReply']) {
if (1 == $allows['commentReply']) {
$header .= "<script type=\"text/javascript\">
~~~省略部分~~~
</script>";
} else {
$header .= '<script src="' . $allows['antiSpam'] . '" type="text/javascript"></script>';
}
}
}
结果
最终网页性能测试效果还不错,虽然没有100分,但我已经尽力,网站除了网页本身外,只有一个css文件和一个ico图标,无JavaScript,无Cookies,无代码统计,无广告,干干净净,舒服多了。
其他修改的细节还有很多,也记不清楚了,关于主题修改的大概内容,可以看Typecho默认主题修改汇总
更多网站性能优化方案,推荐看一下Yahoo的这篇文章Best Practices for Speeding Up Your Web Site,介绍的很详细了。