最小化html是Google's Page Speed上唯一仍有改进空间的部分。
我的网站都是动态的,HTML已经是Deflated
所以没有理由对服务器施加更多压力(我不想在发送前实时减少页面)。
我能做的是最小化模板文件。我的模板文件是PHP
和HTML
的混合,因此我想出了一些我认为非常安全的代码,但希望对社区进行修订。
// this will loop trough all template files
// php is cleaned first so that line-comments will not interfere with the regex
$original = file_get_contents($dir.'/'.$file);
$php_clean = php_strip_whitespace($dir.'/'.$file);
$minimized = preg_replace('/\s+/', ' ', $php_clean);
这会使我的模板文件作为一个非常长的文件与一些插入了DB内容的地方交替出现。谷歌的主页来源或多或少看起来像我得到的所以我不知道他们是否遵循类似的方法。
问题1:您是否解决了潜在的问题? 问题2:无论如何更好(做到这一点效率更高)?
请记住,我并不是要尝试验证HTML,因为模板不是有效的HTML(例如,页眉和页脚都包括在内)。
编辑:请考虑在部署时最小化模板文件。当使用YUI Compressure和Closure最小化和压缩CSS和Javascript文件时,模板文件将在部署时尽可能地最小化。不是客户要求。
谢谢。
答案 0 :(得分:2)
默认情况下,Google自己的Closure Templates (Soy)会删除该行末尾的空格,模板设计器会使用{sp}
显式插入空格。这可能不足以让我远离PHP,但我只是想引起你的注意。
此外,请注意HTML 4允许您按照Page Speed文档中关于缩小HTML(http://code.google.com/p/page-speed/wiki/MinifyHtml)的建议排除某些标记。您可以排除</p>
,</td>
,</tr>
等。有关可以省略结束标记的元素的完整列表,请在HTML中搜索“- O
” 4 DTD(http://www.w3.org/TR/REC-html40/sgml/dtd.html)。您甚至可以完全省略<html>
,<head>
,<body>
和<tbody>
标记,因为开始和结束标记都是可选的(“O O
” DTD)。
您还可以省略属性引用(http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2),例如id
,{{ 1}}(具有单个类名称)和class
具有简单内容(即匹配type
)。对于具有单个可能值的属性,您可以排除该值(例如,简单地说/^[-A-Za-z0-9._:]+$/
而不是checked
)。
有些人可能会发现这些提示令人厌恶,因为我们已经习惯了这么多年,为即将到来的XHTML简单LALR解析器世界做准备。因此,像Dave Raggett的HTML Tidy这样的工具会生成带有正确结束标记的HTML以及属性值周围的引号。但是让我们面对现实,所有的浏览器都已经有了解HTML 4的解析器,任何新的浏览器都会使用HTML 5解析器而不是XHTML,我们应该习惯于编写针对大小进行优化的HTML。
话虽如此,除了像谷歌和Facebook这样的大公司之外,我的猜测是页面大小是延迟的一个微不足道的组成部分,所以如果你正在优化你自己的网站,那可能是因为你自己的强迫倾向而不是表现
答案 1 :(得分:1)
空格可能很重要(例如在pre
元素中)。
当我有一个特别大的页面(即足够大以至于缩小HTML的好处)时,我使用了HTML Tidy和缓存结果。
tidy -c -n -omit -ashtml -utf8 --doctype strict \
--drop-proprietary-attributes yes --output-bom no \
--wrap 0
答案 2 :(得分:1)
我认为使用这种方法最终会遇到加载时间的问题,因为获取内容,条带空白和preg替换调用比缩小的HTML节省你的任何带宽要花费更长的时间。
答案 3 :(得分:0)
我已经在我的所有网站上运行了几周的测试,我可以说这种方法非常一致。它只会影响模板内容,因此很容易弄乱未知的<pre>
或类似内容。
在部署之前运行,因此对服务器没有影响 - 实际上,随着文件变小,应该加快一点速度。
请记住,来自数据库的所有内容都不会受到任何影响,就像之前说的那样,这只会在部署之前运行,而只会在模板文件上运行。
该方法接缝足够牢固,可以将其投入生产。
如果出现任何问题,我会在这里发布。