来自谷歌,雅虎,百度的SEO网页优化速度建议

一份来自谷歌,雅虎,百度的SEO网页优化速度建议,特别注意,这是网页速度方面的优化,而不是搜索引擎优化。

HTML的SEO优化

  • 缩减资源的大小
  • 缩减首屏内容的大小
  • 启用压缩功能
  • 按视口调整内容尺寸
  • 压缩HTML代码
  • 避免meta设置字符集
  • HTML内嵌小资源

CSS的SEO优化

  • 优化CSS发送过程
  • 合并外部CSS
  • 简化CSS
  • CSS移至头部
  • 避免CSS @Import
  • 避免CSS表达式
  • 优先主要CSS

JavaScript的SEO优化

  • 移除阻止呈现的JS
  • 合并外部JavaScript
  • 延迟加载JavaScript
  • 延迟解析JavaScript
  • 简化JavaScript
  • 避免document.write

图片的SEO优化

  • 优化图片
  • 使用CSS贴图合并图片
  • 指定图片尺寸

其他SEO优化

  • 避免目标网页重定向
  • 改善服务器响应时间
  • 使用浏览器缓存
  • 使用异步脚本
  • 合并Heads
  • 转换Meta标签
  • 指定"Vary: Accept-Encoding"标头
  • 在服务器端指定字符集
  • 去除错误的请求
  • 启用Keep-Alive
  • 删除静态资源查询字符串
  • 最小化请求体积

雅虎YSlow SEO优化建议

 

尽量避免CSS表达式

概述
表达式产生大量的不必要的CSS评估。
为什么
CSS表达式(IE中从第5版开始支持)是一个强大的,但危险的方式来动态设置CSS属性。
这些表达式经常进行评估:当呈现页面和调整大小,当页面滚动,甚至当用户在网页上移动鼠标的时候。
这些频繁的评估降低用户体验。
优化建议
减少你的CSS表达式求值次数的方法之一是使用一次性的表达式,在表达式第一次评估的地方以明确的数值设置样式属性,用它取代CSS表达式。
如果样式属性必须动态地在整个页面设置,使用事件处理程序,而不是CSS表达式,是一种可供选择的方法。
如果必须使用CSS表达式,请记住,他们可能会被评估数千次,并可能影响到你的页面的性能。

配置ETag

概览
通过利用ETag的发回一个304未修改响应减少载荷大小。就是说,从Web服务器取数据的时候,如果文件变化了,就取新的文件,如果文件没有变化,只需告诉客户端没有变化即可,不必再把文件取回来,这样就可节省大量的网络带宽和资源。
Etag工作原理
HTTP 协议规格说明定义ETag为"被请求变量的实体标记" 。简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:
        Etag: "5d8c72a5edda8d6a:3239″
客户端的查询更新格式是这样的:
        If-None-Match: "5d8c72a5edda8d6a:3239″
如果ETag没改变,则返回状态304。即在客户端发出请求后,Http Reponse Header中包含 Etag: "5d8c72a5edda8d6a:3239″标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match报头( Http RequestHeader),此时包头中信息包含上次访问得到的Etag: "5d8c72a5edda8d6a:3239″标识。If-None-Match: "5d8c72a5edda8d6a:3239",这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If-None-Match为False,不返回200,返回304 (Not Modified) Response。
ETag的弊端
实体标记(ETags)是一种机制,Web服务器和浏览器使用,以确定缓存在浏览器的组件是否匹配服务器上的来源。 (一个“实体”是图像、脚本、样式表等)
由于通常ETag的使用属性,是由使他们唯一的托管网站的特定服务器构造,所以当浏览器从一台服务器获取原始组件,并随后试图验证该组件在不同的服务器上时,是不匹配的。
ETag的问题是,它们通常使用的属性,是由使他们唯一的托管站点的特定服务器构成。当浏览器获取原始组件从一台服务器,并随后试图验证该组件在不同的服务器上,是不匹配的,因为使用服务器集群来处理请求的Web站点是很常见的。默认情况下,Apache和IIS中的ETag,对于使用多个服务器的网站来说,大大降低了有效性测试成功率。
建议
在Apache 1.3和2.x,ETag格式是 inode-size-timestamp。虽然给定的文件可以驻留在多个服务器上相同的目录,并有相同的文件大小,权限,时间戳记等,但其索引节点inode在各个服务器是不同的。
IIS 5.0和6.0的ETags有一个类似的问题,在IIS,ETags的格式是 Filetimestamp: ChangeNumberChangeNumber是一个用来跟踪IIS配置更改的计数器。一个网站的所有IIS服务器的ChangeNumber是不太可能相同的。
最终的结果是由Apache和IIS为完全相同的组件生成的ETag的在各个服务器之间的不匹配。如果ETag的不匹配,则用户不会收到为ETag设计的小而速度快的304响应;相反,他们会得到一个正常的200响应以及对组件的所有数据。如果您的网站只是在一个服务器上,这不是一个问题。但如果你有多台服务器托管你的网站,而你正在使用Apache或IIS使用默认的ETag配置,那么用户打开网页就会变慢,服务器负载变高,你消耗的带宽变大,以及代理不能高效缓存内容。即使你的组件有一个Expires头,每当用户点击刷新或刷新一个条件GET请求仍进行。
Apache删除ETag
如果你没有从ETag提供的灵活的验证模式获得好处,那么最好把ETag删除。 Last-Modified头验证是基于组件的时间戳。去除ETag可以减少HTTP头在响应和后续请求时的大小。在Apache中,通过简单地添加以下行到你的Apache配置文件.htaccess可以去除ETag:
        FileETag none
IIS删除ETag
  • 方法(1):在IIS服务器站点属性中的“HTTP头”中添加一个自定义Etag头,头名:Etag,值为空。
  • 方法(2):下载remEtag,在网站的ISAPI中加入DLL筛选。
Lighttpd删除ETag
在Lighttpd中设置禁用Etag:
        etag.use-inode: "disable" #是否使用inode作为Etag,默认是"enable",设为"disable"是不启用Etag功能
        
        etag.use-mtime: "disable" #是否使用文件修改时间作为Etag
        
        etag.use-size: "disable" #是否使用文件大小作为Etag
        
        static-file.etags: "disable" #是否启用Etag的功能,enable or disable
Nginx删除ETag
1.3.3版本以下的Nginx是没有ETag功能的,要在Nginx中支持ETag功能,可参考Nginx添加ETag的方法。
Nginx从1.3.3版开始原生支持ETag,目前尚处于开发阶段,稳定性有风险。
验证的小结如下:
  • 支持的功能
    a)可以通过配置使能或者禁止etag功能。
    配置指令为:"etag on | off;"缺省为on
    b)使能etag后,http响应会包含有etag头,即ETAG:"xxxxxx"。(注意,引号也是etag的一部分)
    c)客户端的http请求中如果包含“If-None-Match”头(nginx对此header不区分大小写),module就会比较该值和计算出的etag,一致就返回304。
    d)If-Modified-Since和If-None-Match是与的关系,即均满足条件才返回304。
    e)支持“If-Match”头。
  • 功能限制
    a)不支持weak tag,即模糊匹配。
    b)不能由应用自定义etag的构成,etag的生成算法固定为:
    last_modified_time+"-"+content_length。即etag与文件的最后修改时间和文件大小有关。
  • etag功能的实现
    不像"nginx-dynamic-etags"简单的采用filter机制,nginx将etag的功能分散在http的处理逻辑的相关代码中体现。
几种Web服务器ETag配置方法
1、Apache设置Etag
在Apache中设置Etag的支持比较简单,只用在含有静态文件的目录中建立一个文件.htaccess, 里面加入:
        FileETag MTime Size
这样就行了,详细的可以参考Apache的FileEtag文档页
2、Lighttpd设置Etag
在Lighttpd中设置Etag支持:
        etag.use-inode: "enable" #是否使用inode作为Etag,默认是"enable",设为"disable"是不启用Etag功能
        
        etag.use-mtime: "enable" #是否使用文件修改时间作为Etag
        
        etag.use-size: "enable" #是否使用文件大小作为Etag
        
        static-file.etags: "enable" #是否启用Etag的功能,enable or disable
第四个参数肯定是要enable的, 前面三个就看实际的需要来选吧,推荐使用修改时间
3、Nginx添加Etag
1.3.3版本以下的Nginx中默认没有添加对Etag标识,1.3.4版本以上的Nginx增加了ETag功能。如果你使用的是1.3.4以上的版本,那么可以很简单的通过如下设置,启用或关闭ETag功能:
        配置指令为:"etag on | off;"缺省为on
如果你使用的是1.3.3以下的版本,则可以用第三方nginx-static-etags模块,添加ETag标识。下面说说该模块的安装。
首先下载Etag源文件,Etag源地址:https://github.com/mikewest/nginx-static-etags。下载后,需要使用Git编译,如果你的服务器没有安装Git,请参考这篇文章CentOS下两种方法安装Git,编译Etag后生成的文件名为 mikewest-nginx-static-etags-25bfaf9.tar.gz   。
安装步骤:
1、Etag文件 mikewest-nginx-static-etags-25bfaf9.tar.gz    路径/root/soft/mikewest-nginx-static-etags-25bfaf9.tar.gz
2、重新编译nginx,添加Etag模块
           a.     nginx -V     //获取nginx的编译参数 --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 
        
           b.     cd /root/soft  
        
                  tar zxvf   mikewest-nginx-static-etags-25bfaf9.tar.gz    
        
                  echo '' >> /root/soft/ mikewest-nginx-static-etags-25bfaf9/ngx_http_static_etags_module.c   //bug  增添一空行,否则编译不过
        
                  cd /root/soft/nginx1.0.0
        
                  ./configure  --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --add-module=/root/soft/mikewest-nginx-static-etags-25bfaf9         //注意后面添加的路径要对
        
                  make     //这里确记不要make install,否则有可能把当前的配置文件覆盖,影响当前业务。
        
                  cp  /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.bak    //备份个比较安全,出错马上还原回去
        
                  cp objs/nginx  /usr/local/nginx/sbin/nginx.tmp      //替换成新的nginx
        
                  rm -rf  /usr/local/nginx/sbin/nginx  && mv  /usr/local/nginx/sbin/nginx.tmp   /usr/local/nginx/sbin/nginx
        
                  /usr/local/nginx/sbin/nginx  -t         
        
                  kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`   //让nginx把nginx.pid改成nginx.pid.oldbin 并启动新的nginx
        
                  kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`  //习惯使用nginx -s reload来重启,发现不能生效,以为我配置错了花一个早上时间找问题。
        
          c.    修改nginx.conf
        
                  location ~ .*/.(gif|jpg|jpeg|png|bmp|ico|rar|css|js|zip|xml|txt|flv|swf|mid|doc|cur|xls|pdf|txt|)$ 
        
                   {
        
                  FileETag on;
        
                  etag_format "%X%X";
        
        expires 30d; 
        
                   }
        /usr/local/nginx/sbin/nginx  -t 
        
        /usr/local/nginx/sbin/nginx  -s reload
然后用curl测试看看
        curl --head http://www.***.com/css/style.css

把JavaScript移到后面

简介
把脚本移到后面以确保其他资源不被阻塞。
描述
JavaScript脚本阻塞并行下载,也即是说,当一个脚本下载时,浏览器将不开始其他资源的下载。
如果您从多个主机下载图片,你可以并行两个以上的下载量。而当脚本下载时,浏览器不会启动任何其他下载,甚至是不同的主机。
优化建议
为了使页面加载速度更快,请移动脚本到页面的底部,如果他们可以延迟的话。
另一种建议是使用延迟的脚本。defer属性表示该脚本不包含document.write,他告诉浏览器,可以继续渲染。不幸的是,Firefox不支持defer属性。在Internet Explorer中,脚本可能被推迟,但不及所需。如果脚本可以推迟,它也可以移动到页面的底部。这将使你的网页加载速度更快。

其他SEO优化建议

最小化请求体积

概览
保持Cookies和请求头尽可能小,以确保一个HTTP请求可以放入一个数据包。
详细
理想情况下,一个HTTP请求不应超过一个数据包。使用最广泛的网络限制的报文到大约1500字节,所以如果你可以限制每个请求少于1500字节,可以减少请求流的开销。 HTTP请求头包括:
  • cookies:对于必须使用cookie被发送的资源,保持cookie大小到最低限度。为了保持请求大小在这个限额内,任何域的cookie不要大于1000字节。我们建议平均每个域的cookies应小于400字节。
  • 浏览器设置字段:很多标题字段都是由user agent自动设置,所以你必须对他们进行控制。
  • 请求的资源URL(GET和主机领域)。带有多个参数运行的URL可以到数千字节。尽量限制URL的长度,最多几百个字节。
  • 来源URL。
建议
使用服务器端存储大多数cookie。
cookie仅存储一个唯一的标识符,ID的键值存储在服务器端。您可以为会话和持久Cookie通过Cookie里指定的到期日期/时间来使用服务器端的cookie。
删除未使用或重复的cookie。
一个域顶层路径(例如/)上设置的cookie字段由资源继承发送到该域下的所有路径。
通过在一个结构域的顶层路径的cookie设置字段(例如/)由资源继承关送达该域下的所有路径。因此,如果你是服务于不同URL路径上不同的应用程序,而你有一个应用于站点上所有应用的全局字段 - 例如,用户的语言首选项 - 在顶级域包括这个cookie字段设置;不要为子路径重复设置cookie字段。反之,如果一个字段只适用于一个子路径的应用程序 - 例如,一个用户界面设置 - 不要在顶层域包含这个cookie字段,并且不要把未使用的数据传递给其它应用。

删除静态资源查询字符串

大多数代理,最值得注意的Squid 3.0版,不缓存在URL有一个“?”的资源,即使在响应头中有一个 Cache-control: public 。要启用代理缓存这些资源,请从静态资源的引用中删除查询字符串,和编码参数到文件名称里。

启用Keep-Alive

概览
启用HTTP Keep-Alive或HTTP持久连接允许同一个TCP连接发送和接收多个HTTP请求,从而减少了延迟后续请求。
详细说明
当客户端浏览器请求网页时,IIS 将返回一个带超文本传输协议 (HTTP) 头的响应。 HTTP 响应头是一些名称和值对,其中包含有关请求页面的信息。 这包括 HTTP 版本、日期和内容类型。
您可以创建自定义头,以便在响应中向客户端传递特殊的信息。 例如,您可以创建一个名为“authors”的自定义头,并在其中包含内容作者的名称。 此外,您也可以创建 Content-Language 头来描述网页正文所使用的自然语言,同时提供一些语言-国家/地区值,例如 en-US(美国英语)、en-CA(加拿大英语)以及 en-GB(英国英语)。
如果在 Web 服务器级别创建了自定义 HTTP 响应头,则除非在子级覆盖该头,否则所有网站、Web 应用程序、虚拟目录以及文件都将继承该头。 同理,Web 应用程序和虚拟目录将继承网站级别的头,而文件则会继承 Web 应用程序或虚拟目录级别的头。 您可以删除继承的头以防止其在响应中传递,也可以在以后需要时还原该头。
启用Keep-Alive响应头通过使客户端/服务器连接在处理多个发送到服务器的请求期间一直保持打开状态,提高了 Web 服务器的性能。当客户端发出多个对网页内容的请求时,打开的连接将可以提高性能,因为服务器可以更快地为每个请求返回内容。 否则,服务器必须为每个请求打开一个新连接。 默认情况下,在 IIS 7 中启用了保持 HTTP 连接响应头。
备注:当您使用集成安全性或基于连接的身份验证服务(如集成 Windows 身份验证)时,必须启用Keep-Alive响应头。
怎样启用Keep-Alive
由于Keep-Alive是默认启用的,如果你的页面不使用它,那意味着你的Web服务器被配置为关闭连接或您的虚拟主机提供商已将其禁用。但你仍然可以改变它。
为了启用Keep-Alive,必须在你的请求里添加一个HTTP标头。如果您没有看到启用Keep-Alive,它可能是因为你正在请求一个页面或资源的HTTP头为:“connection: close”。这将禁用Keep-Alive和告诉服务器只要它完成加载一个文件就关闭连接。如果我们改变为“connection: keep-alive”,它将保持连接打开,因此所有文件都可以在关闭连接前被检索。
通过.htaccess 更改HTTP头
Keep-Alive是由通过您的HTTP头明确要求启用它的。这样做将覆盖任何更高的设置。如果您没有访问Web服务器的配置文件,您可以使用.htaccess文件自行添加HTTP标头。 (请知道.htaccess文件的任何改变可以搞乱很多东西,在你更改任何设置之前你应该知道这一点,除非你非常熟悉.htaccess)

<ifModule mod_headers.c> Header set Connection keep-alive </ifModule>
添加这个到你的.htaccess文件将会添加Keep-Alive头都你的请求里,这将覆盖很多web服务器或者主机限制。
Apache启用Keep-Alive
如果你能够访问你的Apache配置文件,你就能够在那里启用Keep-Alive,这个应用单元显示如下:

#

# KeepAlive: 是否允许连接持久(每连接多于一个请求 ).

# 设置 "Off" 禁止.

#

KeepAlive On



#

# MaxKeepAliveRequests:一个连接允许的最多请求数量, 设置 0 允许无限多.

# 建议你不要设置这个数字太高,以获得最佳性能.

#

MaxKeepAliveRequests 100



#

# KeepAliveTimeout: 同一客户同一连接下一次请求的等待时间(s)

#

KeepAliveTimeout 100
Nginx启用Keep-Alive
Keep-Alive问题可以通过HttpCoreModule来解决。有一个具体的指导,你应该看出来的......“keepalive_disable”。如果你看到这个,在删除之前一定要知道为什么它要禁用Keep-Alive。
Litespeed启用Keep-Alive
Litespeed启用Keep-Alive是默认的,但你的服务器可能会使用所谓的“智能keep-alive”。这是一个Litespeed的内部设置,是专门针对高容量的网站的。此设置会导致pagespeed工具显示keep-alive被禁用。
“智能keep-alive”会要求初始文件(HTML文件)在HTTP标头关闭连接。然后,它会要求所有其它文件(CSS,JS,图像等)启用keep-alive。这使得更多的用户当有许多并发请求的时候能够一次连接。
提示(仅限于Litespeed服务器):除非你确实是一个高流量的网站,你可以(并且可能应该)在配置里禁用智能keep-alive,一旦你这样做,所有连接将使用keep-alive。
Win2003启用Keep-Alive(IIS6)
Win2003的Keep-Alive是默认启用的,你可以在IIS里设置启用或禁用。
操作方法为:
1、打开IIS管理器。
2、右键点击要设置的网站,选择“属性”后进入设置界面。
3、切换到“网站”标签,勾选“保持HTTP连接”,连接超时使用默认的120秒。
如何启用Keep-Alive响应头(IIS7)
您可以通过以下方法执行此过程:使用用户界面 (UI)、在命令行窗口中运行 Appcmd.exe 命令、直接编辑配置文件或编写 WMI 脚本。
用户界面
使用 UI
1.打开 IIS 管理器,然后导航至您要管理的级别。 有关如何打开 IIS 管理器的信息,请参阅 打开 IIS 管理器 (IIS 7)。 有关如何在 UI 的各个位置间进行导航的信息,请参阅 在 IIS 管理器中导航 (IIS 7)。
2.在“功能视图”中,双击“HTTP 响应头”。
3.在“HTTP 响应头”页的“操作”窗格中,单击“设置常用标头”。
4.在“设置常用 HTTP 响应头”对话框中,选中“保持 HTTP 连接”复选框,然后单击“确定”。
命令行
若要启用Keep-Alive标头,请使用下面的语法:

appcmd set config /section:httpProtocol /allowKeepAlive:true | false
默认情况下已启用Keep-Alive标头,但您可以通过将 allowKeepAlive 设置为 false 禁用它。 例如,若要禁用Keep-Alive标头,请在命令提示符处键入以下命令,然后按 Enter:

appcmd set config /section:httpProtocol /allowKeepAlive:false
有关 Appcmd.exe 的详细信息,请参阅 Appcmd.exe (IIS 7) 。
配置
本主题中的过程会影响以下配置元素:
<httpProtocol> 配置元素的 allowKeepAlive 属性
有关 IIS 7 配置的详细信息,请参阅 MSDN 上的 IIS 7.0:IIS 设置架构(可能为英文页面)。
WMI
请使用以下 WMI 类、方法或属性执行此过程:

•HTTPProtocolSection.AllowKeepAlive 属性
有关 WMI 和 IIS 的详细信息,请参阅 IIS 7 中的 Windows Management Instrumentation (WMI)。 有关与此过程关联的类、方法或属性的更多信息,请参阅 MSDN 网站上的 IIS WMI 提供程序参考(可能为英文页面)。

去除错误的请求

概览
删除“死链接”,或返回404/410错误的请求,避免浪费请求。
详细
当你的网站随着时间的推移而改变,资源被移动和删除是不可避免的。如果不相应地更新您的前端代码,服务器会发出404“未找到"或410“不存在”的反应。这些会导致糟糕的用户体验,使您的网站看起来不专业造成浪费不必要的请求。如果这些是对资源的请求,就会阻止后续的浏览器处理,如JS或CSS文件,它们几乎可以让你的网站“崩溃”。
在短期内,你应该使用链接检查工具,如谷歌的网站管理员工具的抓取错误的工具,扫描您的网站链接,并解决这些问题。从长远来看,一旦资源改变位置,你的应用程序应该有更新URL引用的一个方法。

在服务器设置字符集

概览
在服务器层指定字符集,可以减少浏览器的处理进程,让浏览器立即执行脚本,加快浏览器的显示速度。
什么是字符集定义
字符集实质上是一组由一台计算机数字表示的字符。例如,ASCII字符集使用数字0-127来表示所有的英语字符以及特殊的控制字符。
为什么这么重要
在HTML文档的HTTP响应头指定一个字符集,对允许浏览器开始解析HTML并立即执行脚本是非常重要的。
如果没有指定一个字符集,浏览器需要自己来弄清楚,因此会影响您的页面加载时间。
为什么应该避免在meta http-equiv标签指定字符集?
在Internet Explorer8浏览器,在meta http-equiv标签指定字符集将不能超前下载,不能先行下载会大大增加加载页面的时间。
Web开发人员应在HTTP的Content-Type响应头指定字符集,因为这可以确保先行下载的性能优势得以实现。
怎样做
为了避免使用meta标签必须在服务器设置字符集。
这是设置字符集最有效的方法,因为你不需要设置每一页。设置你的服务器向所有文件发送一个Content-Type头类型是text/html。
例如

Content-Type: text/html; charset=UTF-8
charset是你设置字符类型的地方。
建议
使用HTTP而不用meta标签参数
这里有几种设置HTML文档字符集的方法
  • 服务器端:配置你的服务器Content-Type头,为所有类型为text/html的文档,用正确的字符编码指定charset参数,例如,
    Content-Type: text/html; charset=UTF-8
  • 客户端:在HTML代码的meta标签包含http-equiv="content"属性,例如,
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
如果可能,配置你的web服务器在HTTP头指定字符集。一些浏览器(例如Firefox)在执行JavaScript之前使用短暂缓冲延迟,如果charset是在头部指定的话。这就意味着,他们能略过这额外的检测HTML标记的缓冲延迟。
在<head>最上面用meta标签指定字符集
如果你不能设置你的web服务器,但需要在meta标签设置charset的话,一定要在<head>部分的最上面指定这个标记。浏览器在前面的1024字节查找charset参数,所以为了避免性能下降,参数尽可能早地出现在文档头部是至关重要的。
指定内容类型
在浏览器可以开始检测字符集之前,他们必须首先确定该文件的内容类型被处理。如果没有在HTTP头或HTML meta标签中指定,它们将使用不同的算法尝试“嗅”这个类型。这个过程可导致额外的延迟,此外也是一个安全漏洞。为了性能和安全方面的原因,你应该总是指定所有资源的内容类型(不仅是text/html)。
指定正确的字符编码
在HTTP头或HTML meta标签指定的字符集匹配你实际用来创建HTML文档的字符编码是重要的。如果同时指定HTTP标头和HTML meta标记字符集参数,一定要确保它们相互匹配。如果浏览器检测到不正确或不匹配的编码,它会错误地渲染页面和/或产生额外的延迟,从而重绘页面。有关有效字符集的详细信息,请参见HTML 4.01 Specification里Section 5.2, Character Encodings。

指定“Vary: Accept-Encoding”标头

概览
指定Vary: Accept-Encoding标头可告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题。
由于一些公共代理的错误,可能会导致你的压缩版本资源被服务到不支持压缩的用户。指定Vary: Accept-Encoding标头可指示代理来存储压缩和非压缩的版本资源。
指定标头“Vary:Accept-Encoding”的重要意义
指定“Vary: Accept-Encoding”标头,用一句话来说明它的意义,就是“告诉代理服务器缓存两种版本的资源:压缩和非压缩,这有助于避免一些公共代理不能正确地检测Content-Encoding标头的问题。”不过我想很多人都不理解这句话是什么意思,所以需要更详细的解释。请移步到:标头“Vary:Accept-Encoding”指定方法及其重要性分析
标头“Vary:Accept-Encoding”的指定方法
Apache/.htaccess

<IfModule mod_headers.c>

  <FilesMatch ".(js|css|xml|gz|html)$">

    Header append Vary: Accept-Encoding

  </FilesMatch>

</IfModule>
Nginx

  gzip_vary on
IIS
web.config里加上如下配置,web.config位置在:%windir%Microsoft.NETFramework.net版本号CONFIGWeb.config 。

<system.webServer>

  <httpProtocol>

    <customHeaders>

      <remove name="Vary"></remove>

      <add name="Vary" value="Accept-Encoding"></add>

    </customHeaders>

  </httpProtocol>

</system.webServer>

转换Meta标签

说明
转换Meta标签是为所有具有“http-equiv”属性的Meta标签增加一个响应头。
例如,

<meta http-eqiv="Content-Language" content="fr">
要转换为在响应头里添加如下头信息

Content-Language: fr
添加头信息后原始标签不用改变。
包含“http-equiv”Meta标签,特别是那些声明“content-type”的Meta标签,当它们与头信息不匹配时,要求浏览器重新解析HTML文档。确保头信息匹配这个Meta标签,就可以避免这些重新解析的延迟时间。

合并heads

概览
“合并heads”是把多个head合并为一个。
说明
HTML文档不允许有多个<head>单元,但是一些网页合集多个源码便有可能出现多个<head>的情况,这时我们便需要把多个<head>合并在一起,以改良HTML源码运行性能,提高执行速度。
操作
“合并heads”把所有<head>的内容移到第一个<head>里。
例如,HTML代码这样:

<html>

  <head>

    <link rel="stylesheet" type="text/css" href="styles/yellow.css">

    <link rel="stylesheet" type="text/css" href="styles/blue.css">

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

  <head>

    <link rel="stylesheet" type="text/css" href="styles/big.css">

    <link rel="stylesheet" type="text/css" href="styles/bold.css">

  </head>

</html>
需要合并为这样:

<html>

  <head>

    <link rel="stylesheet" type="text/css" href="styles/yellow.css">

    <link rel="stylesheet" type="text/css" href="styles/blue.css">

    <link rel="stylesheet" type="text/css" href="styles/big.css">

    <link rel="stylesheet" type="text/css" href="styles/bold.css">

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>
重要:需要注意的是,合并时还要考虑内容的顺序(例如CSS和JS)。

使用异步脚本

概览
使用异步脚本意味着系统可以更快速地呈现您的网页,而不是强制用户等待脚本完成下载,然后才呈现网页。异步版脚本可实现后台下载。
虽然最初的大多数脚本是同步的,但较新版脚本均可实现异步加载。
详细消息
当浏览器解析传统的脚本标记,它必须等待脚本下载、解析和执行后,才渲染在它后面出现的任何HTML。而异步的脚本,浏览器可以执行异步脚本时继续解析和渲染后面的HTML,无需等待脚本完成。当一个脚本异步加载,它会很快返回,但它的执行被推迟到浏览器的UI线程不是很忙的时候,比如渲染网页。
建议
JavaScript不需要用来构建网页的初始视图,比如那些用于跟踪/分析资源,应该异步加载。一些显示用户可见的内容部分的脚本也可以被异步加载,特别是如果该内容不是网页上的最重要的内容(例如,它在折叠里面)。
使用脚本DOM元素
使用脚本DOM元素最大化跨越当前浏览器异步加载:

<script>

var node = document.createElement('script');

node.type = 'text/javascript';

node.async = true;

node.src = 'example.js';

// Now insert the node into the DOM, perhaps using insertBefore()

</script>
使用脚本DOM元素异步特性允许在Internet Explorer、火狐、Chrome和Safari异步加载。相比之下,在写这篇文章的时候,一个HTML<script>标记的异步属性只会在Firefox3.6和Chrome8异步加载,因为其他浏览器还不支持这种机制的异步加载。
异步加载谷歌AdSense

<script async src="http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
异步加载谷歌Analytics(分析)
谷歌分析的最新版本使用异步的JavaScript。使用旧版本的网页应该更新到异步版本。参考如下写法:

<script type="text/javascript">

  var _gaq = _gaq || [];

  _gaq.push(['_setAccount', 'UA-XXXXX-X']);

  _gaq.push(['_trackPageview']);

  (function() {

    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;

    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

  })();

</script>
上述范例中,它是哦那个 _setAccount 来设置网页的页面属性ID,然后调用 _trackPageview 发送跟踪数据回Google分析服务器。
重要:如果你正在把传统代码更新到最新异步版本,你应该首先删除之前的跟追代码。我们建议你在网页上同时使用他们。

使用浏览器缓存

概览
如果用户会多次访问您的网站,那么静态资源的浏览器缓存可以节省用户的时间。缓存标头应当应用到所有可缓存的静态资源中,而不仅仅是应用到一小部分静态资源(例如,图片)中。可缓存的资源包括JS和CSS文件、图像文件及其他二进制对象文件(媒体文件和PDF文件等)。通常情况下,HTML不是静态资源,默认情况下不应被视为可缓存资源。您应考虑哪些缓存政策适用于您网站的HTML。
建议为您的服务器启用浏览器缓存。静态资源应该至少有一周的缓存有效期。广告或小部件这类的第三方资源也应该至少有一天的缓存有效期。对于所有可缓存资源,我们建议您进行以下设置:
Expires设为将来日期,至少为一周,最多为一年(我们倾向于设置Expires,而不设置Cache-Control: max-age,因为前者受支持的范围更为广泛)。请勿将其设为超过一年的将来日期,因为这样就违反了RFC准则。如果您知道资源将具体在何时发生变化,则可以设置较短的过期日期。然而,如果您认为资源“可能将要发生变化”,但又不知道具体时间,则应设置较长的过期日期,并使用网址指纹(如下所述)。
Expires和Cache-Control: max-age标头
这些标头用于指定相应时间段,浏览器可在指定的这段时间内使用已缓存的资源,而无需查看网络服务器是否提供了新版资源。这些缓存标头功能强大,没有任何应用条件限制。在设置这些标头并下载资源后,浏览器不会为资源发出任何GET请求,除非过期日期到期或达到时间最大值,亦或是用户清除了缓存。
Last-Modifed和ETag标头
这些标头可用于指定浏览器应如何确定用于缓存的文件是否相同。在Last-Modified标头中指定的是日期,而在ETag标头中指定的则可以是唯一标识资源的任意值(通常为文件版本或内容哈希值)。Last-Modified是功能“较弱”的缓存标头,因为浏览器会使用试探法来确定是否需要从缓存中抓取内容。
借助这些标头,浏览器可以通过在用户明确重新加载页面时发出条件式GET请求,有效地更新其已缓存资源。除非您在服务器端更改资源,否则条件式GET请求不会返回完整的响应,因此相较于完整GET请求,此类请求的延迟较小。
我应使用哪个缓存标头?
对于所有可缓存资源,指定一个ExpiresCache-Control max-age以及一个Last-ModifiedETag至关重要。您没必要同时指定ExpiresCache-Control: max-age;或同时指定Last-ModifiedETag
使用网址指纹
对于偶尔发生变化的资源,我们可以让浏览器缓存相应的资源,直到该资源在服务器上出现变化,而服务器则在此时通知浏览器有新版本可用。我们可以通过为每个版本的资源指定一个唯一网址来实现这一目的。例如,假定我们有一个名为“my_stylesheet.css”的资源。我们可以将文件重命名为“my_stylesheet_fingerprint.css”。当资源发生变化时,其指纹就会发生变化,对应的网址也会随之更改。网址一经更改,系统就会强制浏览器重新抓取资源。通过指纹,我们甚至可以为变化更为频繁的资源设置将来的过期日期。
指纹识别的常用方法是使用对文件内容的哈希值进行编码的128位十六进制数。
另一个策略是直接为新版应用创建新版目录,然后为版本目录中的各个版本放置所有资源。这样做的缺点是,如果各个版本中的资源未发生变化,则其网址将仍会更改以强制重新下载。使用内容哈希值不会遇到该问题,但这种方法稍微复杂一些。

改善服务器响应时间

概览
服务器响应时间表示加载必要HTML以开始呈现服务器所托管网页的时间。通过webkaka的诊断,下面图例可清晰显示服务器的响应时间。
每次运行所用的时间可能会有所不同,但这种差异不应太大。事实上,如果服务器响应时间变化很大的话,则表明性能上可能存在问题。
建议
您应将服务器响应时间控制在200毫秒以内。
有很多潜在因素都可能会延缓服务器响应,例如应用逻辑缓慢、数据库查询缓慢、路由缓慢、框架、库、资源CPU不足或内存不足等。您需要考虑所有这些因素,才能改善服务器的响应时间。要找到服务器响应时间过长的原因,首先要进行测量。然后,准备好相关数据,并参阅有关如何解决该问题的相应指导。问题解决后,您必须继续测量服务器响应时间,并解决将来出现的性能瓶颈问题。
  • 收集并检查现有性能和数据。如果没有可用内容,请使用自动网页应用监测解决方案(可在市面找到一些托管的开源版本,它们适用于大多数平台)进行评估,或添加自定义的方法。
  • 识别并修复首要的性能瓶颈问题。如果您使用的是热门网页框架或内容管理平台,请参阅有关性能优化最佳做法的文档。
  • 监测并提醒任何将来出现的性能衰退问题!

避免目标网页重定向

概览
由于重定向会触发额外的HTTP请求响应周期,并会额外延长往返时间延迟,因此,将应用发出的重定向数量降至最低至关重要。避免HTTP重定向可以缩减用户等待网页加载的时间。我们建议您仔细斟酌自己网站的设计,看看可以在哪些方面提升网站性能。
以下是重定向模式的一些优劣示例:
  • 优质:example.com使用响应性网页设计,无需重定向
  • 中等:example.com -> m.example.com/home
  • 劣质:example.com -> www.example.com -> m.example.com -> m.example.com/home
Web应用程序重定向的几个原因
有时有必要为您的应用到浏览器从一个URL到另一个重定向。Web应用程序的重定向问题有几个原因:
  • 以指示已移动的资源的新位置。
  • 要跟踪的点击和展示和日志提交页面。
  • 预留多个域,允许“用户友好”或“虚荣”域名和网址,并赶上拼错/输错网址。
  • 一个网站或应用程序的不同部分,不同的国家代码顶级域名,不同的协议(HTTP到HTTPS),不同的安全策略(例如:未经认证和认证网页)等之间的连接。
  • 要尾随斜线添加到URL目录名,使它们的内容访问浏览器。
不管是什么原因,重定向会触发额外的HTTP请求- 响应周期,并添加往返时间延迟。重要的是要尽量减少您的应用程序发出的重定向的数量- 特别是启动您的主页的所需资源。要做到这一点,最好的方法是您使用重定向限制。
建议
消除不必要的重定向
这里有一些策略,简单地消除不必要的重定向:
  • 在您的页面永远不要引用已知重定向到其他URL的URLs。当资源改变位置时,您的应用程序需要有一个更新URL引用的方法。
  • 永远不要使用一个以上的重定向来获得给定的资源。例如,如果C是目标页,并且有两个不同的开始点,A和B,A和B应直接定向到C;A不应该先定向到B,再从B重定向到C。
  • 尽量减少出现重定向,但实际上并不提供内容的外域数量。有时候,人们需要从多个域重定向,以获得不正确的用户输入(拼写错误/输错网址)。但是,如果你要引导用户他们可以从多个URL到达你的网站,你需要从你的名字每一个变种去购买新的域名。
使用服务器重写 以便用户输入url
许多Web服务器支持内部的“重写”。这允许你配置从一个URL到另一个URL的映射;当客户端请求无效的URL,服务器自动重新映射到正确的资源,而不发出重定向。一定要使用他们获得你无法控制的URL。千万不要把它们作为易更新URL引用的一个手段;你应该总是使用一个单一的URL指向一个资源。此外,如果可能缓存资源,还要避免使用它们。自动在目录名称末尾添加所需的尾随斜线是用户输入的URL,这是一个很好的重写机制的例子。
在后台跟追网络流量
为了跟追网页各种属性之间的流量,有些网站使用中间重定向到一个页面,它记录了一个独立的中央服务器上的所有属性。然而,因为这样的重定向会添加页面过渡之间的延迟,应该避免他们,并寻找在后台记录页面访问量的其他方式。
记录页面访问,一个流行的方法是在目标页面(或onload事件处理程序)的底部上包括一段JavaScript,当用户加载页面时,通知日志服务器。这样做的最常见的方式是建立一个请求给服务器,并把各种参数的数据进行编码加密。为了保持HTTP响应非常小的,请求一个透明的1x1像素的图像是一个很好的选择。稍微更优化的方法是使用一个HTTP204响应(“没有内容”),这稍微比1x1的GIF小。
使用服务器端HTTP重定向
有几种方法发出重定向:
  • 服务器端:您可以使用Location头,配置你的Web服务器发出300 HTTP响应代码(最常见的301(“永久移动”)或302(“发现”/“暂时移动”)),设置为新的URL。
  • 客户端:您在HTML文档的头部使用http-equiv="refresh"的meta标签属性或设置JavaScript的window.location对象(使用或不使用replace()方法)。
如果你必须使用重定向机制,应该使用服务器端方法而不用客户端方法。浏览器处理HTTP重定向比meta和Javascript更有效率。例如,JS重定向会增加浏览器解析延迟,然而301或302重定向会在浏览器解析HTML文档之前被立即进行。
另外,根据HTTP/1.1说明,301和302响应会被浏览器缓存。这意味着即使资源本身没有缓存,浏览器至少能在本地缓存找到正确的URL。301响应默认是可以缓存的,除非有其他说明。为了使302响应缓存,你应该配置你的web服务器,添加一个Expires或者Cache-Control max-age头(看浏览器设置缓存)。需要说明的是,并不是所有的浏览器都执行规范,不管是301缓存还是302缓存,看Browserscope知符合要求和不符合要求的浏览器列表。

图片的SEO优化建议

指定图片尺寸

概览
指定所有图片的宽度和高度可以加速渲染,因为省去了不必要的回流和重绘。
注,网站诊断目前只检测那些由图片属性指定的图片尺寸,如果你是通过CSS指定图片尺寸,那么你可以忽视这个建议。
详细
当浏览器勾画出页面时,它需要能够绕流可更换元件,例如图像。它可以开始呈现一个页面,及时图像还未下载,其前提是它知道尺寸以围绕包裹不可更换的元件。如果包含文档中没有指定尺寸,或者指定的尺寸与实际图像不匹配,那么当图像被下载,浏览器将需要一个回流和重绘。为了防止回流,指定所有图像的宽度和高度,无论是在HTML<img>标签,还是CSS。
建议
指定匹配图像本身的尺寸
不要使用的宽度和高度的规格来缩放图像。如果图像文件实际上是60×60像素,不要设置尺寸为30×30的HTML或CSS。如果图像需要更小,请在图像编辑器里改变尺度,并设置其尺寸一致(参见优化图像的细节。)
指定图像元素或父块级的尺寸
一定要在<img>元素本身或父块级上设置尺寸。如果父不是块级,尺寸将被忽略。不要在一个上级而不是直接父级指定尺寸。

使用CSS Sprite合并图片

概览
使用CSS贴图合并图片,可以减少网络往返的数量和下载其他资源的延迟,可以减少请求的开销,并能降低一个网页下载的字节总数。
类似于JavaScript和CSS,下载多个图像产生额外的往返。一个包含许多图像的网站,可以将它们组合成更少的输出文件,以减少等待时间。
说明
在CSS里作为背景使用的GIF、JPG和PNG图片,可以合并为一张大的图片,然后这些单独的CSS背景,改写为指向一张大的图片,利用背景定位,使页面看起来像从前那样,这个过程被称为CSS Spriting(CSS贴图)。
好处
CSS贴图对网页速度有几个好处。
  • 首先,如果许多小图像被组合成一个大的图像时,浏览器将需要更少的服务器连接,这可以增加并行性。
  • 第二,从每个单独的请求开销中节省字节(包括HTTP标头和图像头);依靠这张大PNG图片的压缩程度,可以显著的节省带宽。
  • 最后,在一些浏览器解码一个大图像比解码几个小图像更快。
范例
使用CSS贴图合并图片之前,HTML里是这样写

<html>

  <head>

    <title>Sprite Images</title>

      <style type="text/css">

        #bg_Cuppa {

            background-image:url('images/1.png');

            background-repeat:no-repeat;

            width:65px;

            height:70px;

        }

        #bg_BikeCrashIcn {

            width:100px;

            height:100px;

            background:transparent url('images/2.png') 0 0 no-repeat

        }

      <style type="text/css">

  </head>

  <body>

    <div id="bg_Cuppa"></div>

    <div id="bg_BikeCrashIcn"></div>

  </body>

</html>
使用CSS贴图合并图片之后,CSS是这样写

#bg_Cuppa{

    background-image:url(images/1-2.png);

    background-repeat:no-repeat;

    width:65px;

    height:70px;

    background-position:0px 0px

}

#bg_BikeCrashIcn{

    width:100px;

    height:100px;

    background:transparent url(images/1-2.png) 0px -70px no-repeat;

}
建议
一起加载的图片使用CSS贴图 
合并在同一张网页里总是一起加载的图片,例如,在每一张网页里都加载的一组图标就应该使用CSS贴图。而那些每次浏览都改变的动态图片,比如资料照片或其他那些频繁改变的图片,则不应该使用CSS贴图。
GIF和PNG图片要CSS贴图
GIF和PNG图片使用无损压缩,因此可以使用CSS贴图而不会降低质量。
小图片要CSS贴图
每次请求都要一定的请求开销,一个浏览器下载小图片所需的时间由请求的开销决定,你可以使用一整张贴图一个请求而不是每张图片一个请求来减少开销。
缓存图片使用CSS贴图
长缓存周期的贴图图片意味着这张图片一旦被浏览器缓存将不需要往返请求。
最小化贴图图片的空白空间
为了显示一张图片,浏览器必须解压和解码这张图片。解码图像的大小是与图片的像素成比例的。因此,虽然sprited图像空的空间可能不会显著影响图像文件的大小,但未显示的像素的sprite却会增加你的网页的内存使用,这可能会导致浏览器变得不那么敏感。
使用类似调色板生成贴图图像
制作贴图图片时使用超过256色会导致生成的贴图使用PNG真彩类型而不是调色板类型,这将增加贴图的体积大小。为了生成更加的贴图,请使用相同的256色调色板合并图像。如果你的图像颜色有一定的灵活性,考虑减少所产生的贴图调色板为256色。

优化图片

概览
尽量减小图片尺寸,以缩减用户等待资源加载的时间。适当地设置图片的格式并进行压缩可以节省大量的数据字节空间。这样可以为那些网络连接较慢的用户节约时间,还可以为有流量套餐限制的用户节省成本。
什么是优化Web图像?
你用Photoshop或Illustrator、Fireworks程序创建的图像看起来是惊人的,但往往文件都非常大。这是因为,图像的制作格式使得它们更易于手工以不同的方式进行操作。
随着每个图像体积以兆字节般的增大,如果你把这些图像放到网页上,网页的加载会变得非常缓慢。
优化您的Web图像意味着以对网页友好的格式保存或编译你的图片,这取决于图像包含什么内容。
图像保存数据不只是我们在屏幕上看到的像素等。这些数据可以增加不必要的尺寸从而导致用户等待图像下载需要更长的加载时间。
如果你还没有优化,那么在好处方面来说,优化图片应该是你网页速度优化早期要做的事。
它是如何工作的?
简单来说,优化图像是通过删除不必要的保存在图像中的数据,从而减少图像的大小,这要以用在网页哪里为基础。
通过Web优化图像可以减少高达80%的总页面加载大小。
我们要知道压缩有两种形式,有损和无损。
保存有损格式的图片看起来比原始图像略有不同。请记住,这只是在非常接近的样子可见。有损压缩对网页来说是非常好的,因为图像使用少量的存储器,但也可以是充分地像原始图像。
保存无损格式的图像保留所有需要产生原始图像的信息。出于这个原因,这些图片承载大量的数据,因此是一个非常大的文件。
我们也可以通过保存为相应的尺寸优化Web图像。使用CSS在网页里调整图像大小是有帮助的,但问题是Web浏览器还是会下载整个原始文件,然后调整它的大小和显示。
你能想象采用一张海报大小的图像,但使用它只作为一个缩略图?一个小小的只有20像素的图像,却需要加载整个原始海报的时间,我们其实可以只需要装载一个20像素的图像的时间。
为什么优化图片这么重要?
优化图片是如此重要的最主要的原因是,因为90%的大多数网站都依赖于图像,所以有很多的图像文件。使用未经压缩的图像和不正确的格式,会大大减慢你的网页加载时间。
怎样优化网页图片?
图像的全面优化可以说是通往完美的一个艺术,因为有很多各种各样的你可能会处理的图像。下面是最常见的优化您的网页图片的方法。
  • 减少图像周围的空白。 一些开发人员使用空白的填充这是万万要不得的。裁剪图像,删除图像周围任何空白,并使用CSS来填充。
  • 使用正确的文件格式。如果你有图标,或者没有太多颜色的图形,可以保存为GIF这种较少颜色的图形。如果你有更详细的图形,可以使用JPG文件格式,降低质量保存图像。
  • 以适当的尺寸保存图像。如果您正在使用HTML和CSS来调整您的图像,那么不要这样。以期望的大小保存你的图像,从而减少文件大小。
要调整图片大小,你将不得不使用一些程序。对于基本的压缩,您可以使用一个简单的编辑程序如GIMP。对于更高级的优化,你可以使用Photoshop,Illustrator或Fireworks来保存特定的文件。
Google建议
您应对所有图片进行基本优化和高级优化。基本优化包括裁剪不必要的区域,将颜色深度降至可接受的最低水平,移除图片评论以及将图片保存为恰当的格式。您可以使用任意图片编辑程序(例如,GIMP)执行基本优化。高级优化包括对JPEG和PNG文件执行进一步的压缩(无损压缩)。
使用图片压缩工具
市面上有许多工具可用来对图片文件执行进一步的无损压缩,且不会对图片质量造成任何影响。可以使用webkaka的在线图片压缩优化工具。
选择恰当的图片文件格式
您应测试一下哪种格式最适合您的图片,尽管我们在下面推荐了一些较高级别的格式:
  • PNG格式几乎一直优于GIF格式,尽管某些旧版浏览器只能为PNG格式提供部分支持。
  • 为较小或简单的图形(例如,小于10x10像素的图形或调色板小于3色的图形)以及包含动画的图片使用GIF格式。
  • 为所有摄影风格的图片使用JPG格式。
  • 请勿使用BMP格式或TIFF格式。
JPG图片保存为“标准式”还是“渐进式”?
JPG图片保存时可以选择不同的形式,“标准式”和“渐进式”,“标准式”图片是从上到下逐渐显示,“渐进式”图片是先显示图片轮廓,,再由模糊逐渐变清晰。
两种方式各有优点和缺点,但是请注意,“渐进式”图像在IE里的表现是相当糟糕的,对于“渐进式”图像,IE浏览器根本不预先显示低分辨率的模糊图片轮廓,而是一片空白!只有当图片完全加载完后,才唰的一下显示整张图片。这给用户的体验是很坏的。详细分析和演示请看文章:JPG图片保存时慎用“渐进式浏览器显示”格式。

JavaScript的SEO优化建议

避免document.write

概览
在文档中特别是在早期使用document.write() 获得外部资源,将显著增加网页显示的时间。
详细说明
现代浏览器使用推测解析器更有效地发现在HTML标记引用的外部资源。这些推测解析器有助于减少网页的加载时间。由于推测解析器快、轻,他们不执行JavaScript。因此,使用JavaScript的document.write()来获取外部资源使得它不可能为推测解析器发现这些资源,这样会推迟这些资源的下载、解析和渲染。
在外部JavaScript资源使用document.write()是特别昂贵的,因为它序列化外部资源的下载。浏览器必须在执行document.write()获取额外的外部资源之前下载、解析和执行第一个外部JavaScript资源。例如,如果外部JavaScript资源first.js包含以下内容:

document.write('<script src="second.js"></script>');
first.jssecond.js的下载在所有浏览器将被序列。使用下面描述的推荐技术之一,可以减少阻塞和序列这些资源,从而缩短了显示页面的时间。
建议
直接在HTML标记声明资源
在HTML标记声明资源允许推测解析器发现这些资源。
使用异步资源更好
在某些情况下,可能无法在HTML中直接声明资源。例如,如果在客户端上动态地确定资源的URL,JavaScript必须被用来构造该URL。在这些情况下,尽量使用异步加载技术。
使用“易用的iframe”
在某些情况下,例如不能用其他推荐技术加载旧代码的优化,它可能无法避免的document.write()。在这种情况下,易用的iframe可以用来避免阻塞主页。
易用的iframe是一个与他父文档具有相同的起源的iframe。在易用的iframe里引用的资源与主页上引用的资源并行加载。因此,在易用的iframe里调用document.write()不会阻止父页面的加载。尽管不堵父页面,在易用iframe里使用document.write()仍然可以减慢IFRAME里的内容加载,所以其他推荐技术应优先于“易用的iframe”技术。

简化JavaScript

概览
简化JavaScript代码能够节省很多字节和加速下载、解析和执行时间。
范例
简化前的外部JavaScript代码:

/*

 * This external script is part of the optimize javascript example.

 * This comment will be removed.

 */

// Print on the screen. This comment will also be removed.

document.write("This is updated by external javascript");
简化后的JavaScript代码:

document.write("This is updated by external javascript");
建议
“简化”代码是指删除不必要的字节,例如多余的空格、换行符和缩进。压缩JavaScript代码有一些好处:
  • 第一,对于不用缓存的内嵌和外部的JavaScript ,较小的体积能够在每次网页下载的时候减少网络延迟。
  • 第二,简化能大大增强外部JS和内嵌JS代码的网页文件的压缩。
  • 第三,较小的文件被网页浏览器加载和执行更快。
一些免费工具可以简化JavaScript ,例如webkaka的JavaScript 压缩工具。建议简化那些4096字节(4KB)以上的JS文件。你应该知道任何文件减少25字节或更多(小于这不会有任何明显的性能提高)的好处。

延迟解析JavasSript

概览
为了加载一个页面,浏览器必须分析所有的<script>标记,这增加了额外的时间来加载页面内容。通过最小化渲染页面所需的JavaScript数量,并推迟不必要的JavaScript解析,直到需要它时才执行,这可以减少你的页面初始加载时间。
说明及方法
这有几种可用于延迟JavaScript解析的技术。
  • 最简单的和优选的方法是延迟加载JavaScript,直到它需要的时候。
  • 第二种技术是在适当情况下使用<script async>属性,延迟到浏览器的UI线程不是忙着做别的时候,以防止因解析堵塞初始页面的加载。
如果没有这些合适的技术,这有一些在移动应用中附加的通常使用的技术,描述如下:
  • 在构建移动应用程序时,它能加载前面应用程序需要的所有JavaScript,所以应用程序可以在用户处于离线状态的时候继续工作。在这种情况下,一些应用中,如移动Gmail,找出对它有用的JavaScript加载在注释里和后面在需要的时候eval() 这些JavaScript。这种方法可以保证所有的JavaScript是在初始页面加载时加载,而不要求解析JavaScript。
  • 另一种在注释存储代码的方法是在JavaScript字符串中存储代码。当使用这种技术,JavaScript是在需要的时候才解析,再需要时通过在字符串中调用eval()函数。这种技术也允许应用程序在早期加载JavaScript,但是延迟解析,直到它被需要的时候。
  • 简单地来说,就是先加载所有JavaScript,然后哪个地方需要就在哪个地方解析。如果你对这个说明还不够明白或者对这项技术还不太了解的话,请看看这里的例子合并外部JavaScript,里面使用了eval(),其实就是“先加载后解析”的意思。
必要性
请注意,移动<script>标记到页面底部是次要的,因为浏览器还会继续显示忙碌的指示,直到页面完成解析这个JavaScript为止。用户可能需要等待到页面加载指示器显示页面加载已经完成,才可以与页面进行交互,所以把加载JavaScript所花费的用以浏览器指示加载网页完毕的时间最小化是重要的。
在测试中,我们发现,在现代移动设备,JavaScript每增加一千字节将使整体页面加载增加1ms解析时间。因此,在初始页面中包含加载100KB的JavaScript将为您的用户增加100ms的加载时间。因为JavaScript必须在每访问一个页面时都要解析,这个增加的加载时间将是每一个页面加载的一部分,无论是从网络加载,还是通过浏览器缓存或HTML5离线模式加载。

延迟加载JavaScript

概览
延迟加载JavaScript可以减少网页初始下载体积,并允许其他资源能够并行下载和加速执行以及渲染时间。
说明
像样式表一样,在浏览器开始呈现网页之前脚本必须被下载、解析和执行。即使脚本包含在被高速缓存的外部文件里,脚本后面的所有元素的处理也会被阻止直到浏览器从磁盘加载代码并执行之后。然而,对于一些浏览器,情况比样式更糟:当JavaScript正在处理时,浏览器将会打断所有其他资源的下载。对于使用很多JavaScript代码的AJAX类型的应用程序,会增加相当大的延迟。
对于很多脚本应用程序,大量的JavaScript代码需要处理用户初始化事件,例如鼠标点击和拖动,表单填充和提交,隐藏元素展开,等等,所有这些用户触发的事件都会在页面加载和onload事件被触发后发生。因此,通过推迟JavaScript加载,很多延迟可在“关键时候”(加载主页的启动时间)避免,直到真正需要它的时候。虽然,这种“lazy”的加载方法并没有降低总的JS有效载荷,它可以显著减少加载网页的初始状态所需要的字节数,并允许在后台异步加载剩余的字节。
方法
使用这种技术,你应该先确定所有的onload事件之前未实际使用的文档的JavaScript函数。对于包含超过25个功能没有使用的文件,将所有这些功能,合并为一个单独引用的外部JS文件。这可能需要你根据文件之间的依赖关系进行代码重构。 (对于含有少于25个功能没有使用的文件,它不需要重构。)
然后,在onload事件后,在包含文档的头部插入JavaScript事件侦听器,强制外部文件加载。您可以通过任何常用的脚本手段做到这一点,但我们推荐一个很简单的脚本DOM元素(以避免跨浏览器和同域的政策问题)。
警告:延迟JavaScript通常会显着提高一个网站的渲染速度,但需要仔细评估,以确保该网站继续正常运行。

合并外部JavaScript

概览
合并JavaScript是通过把多个不同的JavaScript文件用一个来代替,从而减少HTTP请求数,以及减少下载其他资源的延迟时间。
详细说明
良好的前端开发人员会构建模块化的、可重用组件的Web应用程序。而把代码划分为模块化软件组件是一个良好的工程实践,通过导入模块到一个HTML页面,可以大大提高网页的加载时间。首先,对于空缓存的客户,浏览器必须为每个资源发出HTTP请求,从而产生相关的往返时间。其次,大多数浏览器在JavaScript文件被下载并进行解析时会阻止页面的其余部分加载。
建议
划分文件的最佳方法
下面是合并JavaScript文件的一些规则:
  • 把JavaScript分为两个文件:一个包含渲染网页时启动所需要的最少代码,另一个包含的代码直到网页加载完成才需要。
  • 在<head>里放置尽可能少的JavaScript文件,同时保持这些文件的体积最小化。
  • 很少使用的JavaScript放到一个文件里,只有当有需要时才使用这个文件。
  • 对于不能缓存的小JavaScript代码,考虑把它们嵌入到网页里。
  • 在head里代码的位置要正确。
不管是外部的还是内嵌的代码,以正确的顺序放置都是有好处的,使其他元素可以最大限度地并行下载。
合并JavaScript实例
先看看网页上的显示效果,合并前和合并后都不变:
example:合并JavaScript
代码如下,合并前
html代码

<html>

  <head>

    <title>combine_javascript example</title>

    <script src="js1.js"></script>

    <script src="js2.js"></script>

  </head>

  <body>

    Hello, PageSpeed!

  </body>

</html>
js1.js代码为:

function logText(message) {

  document.body.appendChild(document.createTextNode(message));

  document.body.appendChild(document.createElement("br"));

}
js2.js代码为:

window.onload = function() {

  logText("Application started.");

  logText("Library operation confirmed.");

}
合并后
html代码

<html>

  <head>

    <title>combine_javascript example</title>

    <script src="js1-js2.js"></script>

    <script>eval(mod1);</script>  <!-- 这里使用了eval()函数 //-->

    <script>eval(mod2);</script> <!-- 这里使用了eval()函数 //-->

  </head>

  <body>

    Hello, PageSpeed!

  </body>

</html>
合并文件js1-js2.js的代码为:

var mod1 = "function logText(message){document.body.appendChild(document.createTextNode(message));document.body.appendChild(document.createElement("br"));}";

var mod2 = "window.onload=function(){logText("Application started.");logText("Library operation confirmed.");}";
合并原理很简单,就是把前面几个js的代码分别赋给一个变量,然后在网页里用eval()这个函数执行。
重要:合并后js文件不宜太大,一般来说,合并后的js文件不要大于92160(90KB)

移除阻止呈现的JavaScript

概览
浏览器必须先解析网页,然后才能将其呈现给用户。如果浏览器在解析过程中遇到系统阻止的外部脚本,必须停止解析并且下载该JavaScript。每次遇到这种情况时,浏览器都会增加一个网络往返过程,这样就会导致首次呈现网页的时间延迟。
建议
建议您以内嵌方式处理呈现首屏区域所需的JavaScript,并让为网页添加其他功能所需的JavaScript延迟加载,直到首屏内容发送完毕为止。请注意,要通过这种方式缩短加载时间,您还必须优化CSS发送过程。内嵌较小的JavaScript。
如果外部脚本较小,您可以直接将它们添加到HTML文档。通过这种方式内嵌较小文件可让浏览器继续呈现网页。例如,如果HTML文档如下所示:

<html>

  <head>

    <script type="text/javascript" src="small.js"></script>

  </head>

  <body>

    <div>

      Hello, world!

    </div>

  </body>

</html>
资源small.js如下所示:

/* contents of a small JavaScript file */
那么,您即可按如下这样内嵌脚本:

<html>

  <head>

    <script type="text/javascript">

      /* contents of a small JavaScript file */

    </script>

  </head>

  <body>

    <div>

      Hello, world!

    </div>

  </body>

</html>
这样,您就可以将small.js内嵌在HTML文档中,从而消除对它的外部请求。
延迟加载JavaScript
为防止JavaScript阻止网页加载,建议您在加载JavaScript时使用HTML异步属性。例如:

<script async src="my.js">
如果您的JavaScript资源使用的是document.write,则使用异步加载就会不安全。我们建议您重写使用document.write的脚本,以改用其他技术。
此外,异步加载JavaScript时,如果您的网页加载互相依赖的脚本,请务必谨慎,以确保您的应用以合适的依赖顺序加载脚本。
常见问题解答
如果我使用的是JavaScript库(例如jQuery),该怎么做?
很多JavaScript库(例如jQuery)都可用来增强网页,从而为网页增添额外的互动性、动画和其他效果。不过,这些行为大多可在首屏内容呈现后再安全添加。请考虑是否可以将此类JavaScript的执行和加载延迟到网页加载后。
如果我使用JavaScript框架来构造网页,该如何操作?
如果网页内容由客户端JavaScript构造,那么您应考虑一下是否可以嵌入相关的JavaScript模块,从而避免产生额外的网络往返过程。同样,利用服务器端呈现可显著提升首次网页加载的效果,方式如下:在服务器上呈现JS模板,并将结果内嵌到HTML,然后在应用加载后使用客户端模板。

CSS的SEO优化建议

优化CSS发送过程

概览
屏幕显示内容之前,浏览器会阻止外部CSS文件。这会导致额外的网络延迟,并延长屏幕显示内容的时间。
建议
如果外部CSS资源较小,您可以直接将这些内容插入到HTML文档中,这称为“内嵌”。通过这种方式内嵌较小CSS资源,浏览器可以继续呈现网页。如果CSS文件较大,您需要识别和内嵌呈现首屏内容所需的CSS,并暂缓加载其余样式,直到首屏内容显示之后为止。
内嵌较小CSS文件的示例
如果HTML文档如下所示:

<html>

  <head>

    <link rel="stylesheet" href="small.css">

  </head>

  <body>

    <div class="blue">

      Hello, world!

    </div>

  </body>

</html>
并且small.css资源如下所示:

.yellow {background-color: yellow;}

.blue {color: blue;}

.big { font-size: 8em; }

.bold { font-weight: bold; }
您就可以内嵌关键的CSS,具体方法如下:

<html>

  <head>

    <style>

      .blue{color:blue;}

    </style>

    </head>

  <body>

    <div class="blue">

      Hello, world!

    </div>

  </body>

</html>

<link rel="stylesheet" href="small.css">
在网页加载之后,原始small.css才会加载。通过JavaScript将所有<style><link>元素插入到文档中,以维护CSS规则的应用顺序。
请勿内嵌较大数据URI
在CSS文件中内嵌数据URI时,请务必慎重。您可以在CSS中选择使用较小数据URI,因为内嵌较大数据URI会导致首屏CSS变大,进而延缓网页呈现时间。
请勿内嵌CSS属性
应尽量避免在HTML元素(例如,< p style=...>)中内嵌CSS属性,因为这经常会导致出现多余的重复代码。此外,内容安全政策(CSP)会在默认情况下阻止在HTML元素上内嵌CSS。

优先主要CSS

概览

在HTML头部内嵌渲染页面需要的CSS样式,延迟加载所有的CSS资源。

说明

通过内嵌页面使用的CSS样式而延缓加载所有CSS资源,这避免了在开始渲染页面时的任何堵塞CSS请求,收集所有CSS标识和在HTML里以相同的顺序展开,使所有样式规则在网页加载后是可用的。

推迟文档没有使用的样式规则,可以延迟下载不需要的字节和允许浏览器更快地开始渲染。

实例

例如,如果HTML文档是这样的


<html>

  <head>

    <link rel="stylesheet" href="small.css">

  </head>

  <body>

    <div class="blue">

      Hello, world!

    </div>

  </body>

</html>

small.css的代码如下


  .yellow {background-color: yellow;}

  .blue {color: blue;}

  .big { font-size: 8em; }

  .bold { font-weight: bold; }

改写后,HTML文档变成这样


<html>

  <head>

    <style>

      .blue{color:blue;}

    </style>

    </head>

  <body>

    <div class="blue">

      Hello, world!

    </div>

  </body>

</html>

<noscript><link rel="stylesheet" href="small.css"></noscript>

small.css在网页加载后加载,通过JavsScript插入所有<style><link>元素到HTML文档里,且保留CSS规则顺序。

避免CSS表达式

概览
CSS表达式会降低渲染性能,用另外的替换他们以为IE用户提高浏览器渲染速度。
注:在IE8标准版以上的浏览器已经不再支持CSS表达式。
说明
IE5导入CSS表达式,或“动态属性”,是作为一种动态地改变文档属性以响应各种事件的方法。它们由CSS声明的作为CSS属性值嵌入的JavaScript表达式组成。在大多数情况下,它们被用于以下用途:
  • 效仿其他浏览器的支持,但IE尚未落实的标准CSS属性。
  • 以一种比成熟的JavaScript注入样式更小巧方便的方式提供动态的样式和高级的事件处理。
不幸的是,由CSS表达式所实行的性能损失是相当大的,因为每当任何事件被触发时浏览器都需重新评估每个表达式,如窗口调整大小,鼠标移动等。CSS表达式糟糕的性能表现是他们现在弃用IE8的原因,如果你已经在你的页面中使用CSS表达式,你应该尽一切努力将其删除,并用其他的方法来实现相同的功能。
使用JavaScript脚本样式。
如果你正在为动态样式使用CSS表达式,那么用纯JavaScript重写他们对提高IE的性能是有意义的,此外还对获得其他浏览器相同的功能支持有好处。

避免CSS @import

概览
在外部样式表使用CSS @import会在网页加载中增加延迟。
详细
CSS @import允许把样式表导入到其他样式表里,当CSS @import 在外部样式表中使用,浏览器是不能并行下载这些样式表的,这将增加网络请求的来回时间。例如,如果first.css包含如下内容:

@import url("second.css")
浏览器必须先下载、分析和执行first.css,再去下载second.css
建议
使用 <link> 标记代替 CSS @import
对每个样式表使用 <link> 标记代替 CSS @import,以便浏览器能并行下载样式表,这将加速网页的加载时间:

<link rel="stylesheet" href="first.css" />

<link rel="stylesheet" href="second.css" />

CSS移至头部

概览
通过允许所有CSS在head单元被声明,可以优化浏览器渲染速度。
说明
这种重写,通过确保所有CSS样式(内嵌和外部)在任何body元素引入之前在文档头部解析,可以减少浏览器必须回流文档的次数。所有<style><link>标签,在头部和body里的,全部移到头部,保留他们的相对顺序。
操作
这个重写分析HTML文档,找出所有<style><link>标记,然后把它们的标签移到头部单元后面。
实例
例如,HTML原先是这样的

<html>

  <head>

  </head>

  <body>

    <style type="text/css"> .big { font-size: 8em; } </style>

    <div class="big">

      Hello, world!

    </div>

  </body>

</html>
重写后,是这样的

<html>

  <head>

    <style type="text/css"> .big { font-size: 8em; } </style>

  </head>

  <body>

    <div class="big">

      Hello, world!

    </div>

  </body>

</html>

简化CSS

概览
压缩CSS代码可以节省很多字节和加速下载、解析以及执行时间。
简化CSS的好处跟简化JS一样:减少网络延迟,增强压缩,以及使浏览器更快加载和执行,webkaka提供了在线简化CSS的免费工具。
说明
通过分析链接和内嵌CSS,重写发现的图片和简化CSS,CSS在<style>块和<link>引用中发现。
许多图片在CSS里引用而不是在HTML,如果优化图片能重写这些图片,那么可以节省字节和延长缓存时间。
简化可以大大的减少公共CSS的字节数,通过删除所有说明文字和大多数空白符和缩短颜色名称。
只有headers里包含public或没有Cache-Control的URLs资源需要优化。
操作
这个重写分析HTML文档和找到所有在<link>标签引用的CSS,以及在<style>
实例
例如,在HTML文档看到这样的

<html>

  <head>

    <style>

      /* This comment will be stripped */

      #iddy, .anotherId {

        border: solid 1px #cccccc;

        padding: 1.2em;

        float: left;

        color:##ff0000;

      }

    </style>

    <link rel="stylesheet" type="text/css" href="extStyle.css">

  </head>

  <body>

    Wow, <div class="classy" id="iddy">

    CSS is <span>stylin'</span>.</div>

  </body>

</html>
extStyle.css代码如下

div.classy span, div.classy img {

    display: block;

    border: none !important;

    background: none !important;

  }
那么,可以简化成这样

<html>

  <head>

    <style>#iddy,#anotherId{border:solid 1px #ccc;padding:1.2em;float:left;color:red}</style>

    <link rel="stylesheet" type="text/css" href="extStyle.HASH.css">

  </head>

  <body>

    Wow, <div class="classy" id="iddy">

    CSS is <span>stylin'</span>.</div>

  </body>

</html>
而重写文件extStyle.HASH.css包含这些代码

dif.classy span,div.classy img{display:block;border:none!important;background:none!important}

合并外部CSS

概览
合并外部样式表到尽可能少的文件可以减少网络往返时间,以及下载其他资源的延迟时间。
说明
“合并CSS”是通过单一的CSS文件替换多个不同的CSS文件,这个CSS含有它们所有的内容,以减少在页面刷新时浏览器的HTTP请求的数量。除了减少HTTP标头和通信的开销,这种方法对TCP / IP慢启动的效果也很好,增加了通过浏览器网络连接的有效比特率载荷。
像外部JavaScript一样,多个外部CSS文件会带来额外的网络往返开销。如果您的网站包含许多CSS文件,合并成更少的输出文件可以减少延迟。我们建议最多是3,最好是2个CSS文件。
在开发周期中常常使用许多不同的CSS文件是有道理的,然后捆绑这些CSS文件一起作为部署过程的一部分。请参阅下面的推荐方式区分您的文件,您还需要参考作为部署过程一部分的捆绑文件更新您的所有网页。
建议
划分文件的最佳方法
下面是合并CSS文件的一些规则:
  • 把CSS分为两个文件:一个包含渲染网页时启动所需要的最少代码,另一个包含的代码直到网页加载完成才需要。
  • 很少使用的CSS放到一个文件里,只有当有需要时才使用这个文件。
  • 对于不能缓存的CSS,考虑把它们嵌入到网页里。
  • 不要在CSS中使用 CSS @import规则,如果可能的话,把imported的CSS嵌入到主CSS文件里,或者在HTML里嵌入imported CSS。
在文档头中正确地放置CSS
以正确的顺序引用外部CSS是有好处的,这样能够并行下载。
操作
查找所有CSS<link>标签,如果多于一个则移除那些链接并用一个单独的<link>代替后嵌入文档,把它放到第一个CSS<link>的位置上。
例如,在HTML里这样:

<html>

  <head>

    <link rel="stylesheet" type="text/css" href="1.css">

    <link rel="stylesheet" type="text/css" href="2.css">

    <link rel="stylesheet" type="text/css" href="3.css">

    <link rel="stylesheet" type="text/css" href="4.css">

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>
合并CSS后,变成这样:

<html>

  <head>

    <link rel="stylesheet" type="text/css" href="1-2-3-4.css">

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>

HTML的SEO优化建议

HTML内嵌小资源

概览
通过在HTML里内嵌CSS、JS和图片,可以减少网络往返时间(RTT:Round Trip Time)。
说明
此改写通过直接插入外部的小CSS内容、JavaScript和图像文件到HTML文档,可以减少网页的请求数量。这可以减少花费来显示内容给用户,特别是在旧的浏览器的时间。此改写上不同类型的资源,以及相应的实施例的操作如下。
实例
  • 内嵌CSS
  • 内嵌JavaScript
  • 内嵌图片

内嵌CSS

内嵌CSS前HTML代码是这样的

<html>

  <head>

    <link rel="stylesheet" href="small.css">

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>
small.css的代码是这样的

  .yellow {background-color: yellow;}

  .blue {color: blue;}

  .big { font-size: 8em; }

  .bold { font-weight: bold; }
使用内嵌CSS的方法重写后,HTML代码是这样的

<html>

  <head>

    <style>

      .yellow {background-color: yellow;}

      .blue {color: blue;}

      .big { font-size: 8em; }

      .bold { font-weight: bold; }

    </style>

    </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>
这样,浏览器将去除对small.css的请求,变为把代码写在HTML里。

内嵌JavaScript

例如,HTML原先是这样写的

<html>

  <head>

    <script type="text/javascript" src="small.js"></script>

  </head>

  <body>

    <div>

      Hello, world!

    </div>

  </body>

</html>
small.js的代码为

/* contents of a small JavaScript file */
内嵌JavaScript后,HTML代码变为这样

<html>

  <head>

    <script type="text/javascript">

      /* contents of a small JavaScript file */

    </script>

  </head>

  <body>

    <div class="blue yellow big bold">

      Hello, world!

    </div>

  </body>

</html>
这样,浏览器将去除对small.js的请求,变为把代码写在HTML里。

内嵌图片

这里将使用到一种图片转码技术,先把图片转换成base64编码,然后使用data:URL直接把编码写入HTML里。
例如,原先HTML代码是这样的

<html>

  <head>

    <title>Image test example</title>

  </head>

  <body>

    <img src="images/Cuppa.png">

  </body>

</html>
通过重写,HTML代码变成这样

<html>

  <head>

    <title>Image test example</title>

  </head>

  <body>

    <img src="data:image/png;base64,...Base64 data">

  </body>

</html>
这样,浏览器将去除对Cuppa.png的请求,变为内嵌到HTML里。
,使用图片内嵌的方法时需要慎重考虑图片的base64编码的代码长度,并且视整个HTML页面有多少图片以及内嵌图片后HTML的总体积,而选择是否需要内嵌图片。

避免meta标签指定字符集

概览
在Internet Explorer8浏览器,在meta http-equiv标签指定字符集将不能超前下载,不能先行下载会大大增加加载页面的时间。
操作
例如如下的meta标签设置了字符集

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>example</title>

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<meta content="avoid setting charset in meta tag" name="description">

<meta content="meta,charset" name="keywords">

</head>

<body>

<!-- content -->

</body>

</html>
应把设置charset的meta标签去掉,改在http响应头指定字符集。
Web开发人员应在HTTP的Content-Type响应头指定字符集,因为这可以确保先行下载的性能优势得以实现。(参见:在服务器设置字符集)

压缩HTML代码

概览
压缩HTML代码,包括任何内嵌的JavaScript和CSS,可以减少很多字节和加速下载、分析和执行时间。
详细
优化HTML的好处跟简化CSS和JS一样:减少网络延迟,增强压缩,以及使浏览器更快加载和执行,此外,HTML中常含有内嵌的JS代码(在<script>标记)和内嵌CSS(在<style>标记),所以压缩这些是非常有用的。
注:此规则是实验性的,目前集中在尺寸缩小而不是严格的HTML格式良好。规则的未来版本也将考虑到正确性。
操作范例
如下是一些重写说明
  • 删除空白符
  • 合并Heads
  • 转换Meta标签
  • ELide属性(省略属性)
  • 删除注释
  • 删除引号
  • 裁剪网址
删除空白符
这种重写是用一个空白字符替换连续的空格,可以减少HTML文件传输的字节,因为HTML是经常格式化额外的空格以增强可读性或作为用于生成它的模板的附带的效果,这种技术可以减少传输的HTML资源所需的字节数。
例如,之前HTML是这样的

<html>



  <head>

    <title>Hello,   world!   </title>

    <script> var x = 'Hello,   world!';</script>

  </head>



  <body>

    Hello, World!

    <pre>

      Hello,

        World!

    </pre>

  </body>



</html>
重写后变成这样

<html>

<head>

<title>Hello, world!</title>

<script> var x = 'Hello,   world!';</script>

</head>

<body>

Hello, World!

<pre>

      Hello,

        World!

</pre>

</body>

</html>
这个重写不改变出现在 <pre>, <textarea>, <script> and <style> 标签里空白符,包含在scripts和styles里的空白符可以使用简化JavaScript和简化CSS的方法重写。这个重写将试图保留换行符的程度 - 至少有一个新行的空白的连续序列将会折叠到一个单一的新行。
条件限制
虽然在HTML中的连续空白(超出第一空间)通常被浏览器的标签外部忽略,如<PRE>和<textarea>,可以用CSS属性如“white-space: pre”使浏览器保留文档内的一部分空白。使用这种性能比较少见,然而,这种改写CSS尚未识别,因此,任何可能使用这个CSS特性的网页(静态或动态),都不应该在此时使用该重写。
合并Heads
HTML文档不允许有多个<head>单元,但是一些网页合集多个源码便有可能出现多个<head>的情况,这时我们便需要把多个<head>合并在一起,以改良HTML源码运行性能,提高执行速度。参见合并Heads
条件限制
如果在body的两个head之间有样式或脚本标签,那么重写可以改变它们的顺序。如果还启用了缩小CSS重写,风险会有所降低。此外,就是后来的<head>之前执行的JavaScript会在这个重写中看到不同的DOM。如果有JavaScript嵌入在页面的中间,那么这个重写可能会改变其行为。
转换Meta标签
转换Meta标签是为所有具有“http-equiv”属性的Meta标签增加一个响应头。参见:转换Meta标签
Elide属性(省略属性)
这种重写通过从标签移除属性减少HTML文件传输大小,移除属性时指定的值等于该属性的默认值。这样可以节省字节数量,而且可能使由canonicalizing受影响标签的文档更可压缩。
有两种情况,其中一个属性值可以被删除。首先,一些属性是“单值”或“布尔”的,即该属性指定的值是不相关的 - 所有重要的是该属性是否存在与否。在这种情况下,重写将从标签删除值,只留下属性名称。
例如,下面的tag

<button name="ok" disabled="disabled">
能被重写成这样

<button name="ok" disabled>
第二种情况是有一个默认值的可选属性。如果一个HTML属性包括一个属性(也许是为了增加可读性)等于默认属性的显式值,重写将删除属性名称和价值,知道浏览器会推断出预期的属性而已。
例如,下面的tag

<form method="get">
可改写成这样

<form>
删除注释
这种重写消除HTML注释,这往往是用来记录的代码或注释实验。请注意,CSS注释在简化CSS里消除,Javascript注释在简化JavaScript里消除。
这种重写通过删除最HTML注释减少HTML文件传输大小。根据HTML文件,这可以显著减少在网络上传输的字节数。
例如,html文档看起来是这样

<html>



  <head>

    <title>Hello,   world!   </title>

    <script> var x = 'Hello,   world!';</script>

  </head>



  <body>

    Hello, World!

    <pre>

      Hello,

        World!

    </pre>

  </body>



</html>
可以重写成这样

<html>

<head>

<title>Hello, world!</title>

<script> var x = 'Hello,   world!';</script>

</head>

<body>

Hello, World!

<pre>

      Hello,

        World!

</pre>

</body>

</html>
条件限制
一些网页使用注释来嵌入数据或JavaScript,以减少在HTML文档的解析时间。此重写不应使用在此类页面里,因为它会除去含有所需要由这些网页的数据或JavaScript的说明文字。
删除引号
这种重写从HTML属性消除了不必要的引号(无论是''或"")。当被各种HTML规格请求,如果属性的值是由字符(字母,数字以及一些标点符号字符)的特定子集组成,浏览器允许其遗漏。
在大多数的网页,去除引号能产生适度的节约字节数。它也可以通过canonicalizing name = value对的文字表述,以有利于gzip压缩。
例如,如果HTML是这样的

<html>

  <head>

  </head>

  <body>

    <img src="BikeCrashIcn.png" align='left' alt="" border="0" width='70' height='30' >

  </body>

</html>
可以重写成这样

<html>

  <head>

  </head>

  <body>

    <img src=BikeCrashIcn.png align=left alt="" border=0 width=70 height=30 >

  </body>

</html>
裁剪网址
这种重写裁剪URL是通过解析他们,使他们相对于页面的基础URL网址。例如在http://www.example.com/的网页,“http://www.example.com/foo”将被缩短为“foo”。该重写仅适用于那些由SRC或HREF属性指定的值的URL。它还裁剪图像的URL在CSS,如果使用了简化CSS。
这种重写通过缩短大部分网址减少HTML文件传输大小。根据HTML文件,这可以改写显著减少在网络上传输的字节数。虽然充分指定URLs对开发是有好处的,当一些东西移动之后这样的链接不会被打断,但这些都是在网络上不必要发送的字节数。
例如,如果HTML看起来是这样的

<html>

  <head>

  <base href="http://www.example.com/">

  </head>

  <body>

    <a href="http://www.example.com/bar">Link with long URL</a>

    <img src="http://www.othersite.example.org/image.jpg">

  </body>

</html>
可以改写成这样

<html>

  <head>

  <base href="http://www.example.com/">

  </head>

  <body>

    <a href="bar">Link with long URL</a>

    <img src="//www.othersite.example.org/image.jpg">

  </body>

</html>
条件限制
只有在href和SRC属性引用的URLs可以使用这种重写,在CSS文件里使用的URL可以在简化CSS里重写。在其他地方的URL不能改变。
使用在线HTML压缩工具
如果人工压缩HTML会比较不现实,为此,卡卡网推出了HTML在线压缩工具,使用此工具,可以把HTML代码压缩20%以上,推荐使用。

调整内容的尺寸,使其符合视口设置

概览
在桌面设备和移动设备上,用户习惯于垂直(而非水平)滚动浏览网站,而强制用户水平滚动或缩小以查看完整网页会给用户带来很差的体验。
在使用元视口代码开发移动网站的过程中,您往往会在无意中创建并不适用于指定视口的网页内容。例如,如果在视口中显示大于视口宽度的图片,会迫使用户水平滚动该视口。您应调整此内容,使其符合视口的宽度。这样一来,用户就不用水平滚动视口了。
建议
不同的设备其屏幕尺寸会有很大的差异(例如,手机和平板电脑,甚至是不同款的手机),为此您应配置相应视口,以便您的网页能在许多不同的设备上正确呈现。然而,由于视口宽度(以CSS像素为单位)可能会有所不同,因此,您的网页内容不应依赖于能正常显示的特定视口宽度。
  • 避免为网页元素设置较大的绝对CSS宽度(例如,div{width:360px;}),因为这可能会导致该元素在宽度较窄的设备(例如,像iPhone这类其宽度为320 CSS像素的设备)上显得过宽。请考虑使用相对宽度值(例如,width:100%)。同样,您应注意使用较大的绝对定位值可能会导致元素超出较小屏幕的视口。
  • 如有必要,您可以使用CSS媒体查询为较小或较大屏幕应用不同的样式。这篇HTML5 Rocks文章提供了有关如何实现这一目标的进一步建议。
  • 针对图像,请参阅这篇文章(响应式图片-怎样防止网页重排),其中提供了有关如何在网页呈现期间且在不产生不必要网页重排的情况下提供相应大小图片的完整概览。

启用GZIP压缩功能

概览
许多网络服务器可以通过调用第三方模块或使用内置程序将文件压缩为GZIP格式,然后再发送该压缩文件以供下载。这样可以在下载呈现网站所需的资源时,为您节省一些时间。
  • 减少高达70%的网页大小
  • 提高网页速度
  • 需要访问.htaccess文件或者服务器管理文件
什么是Gzip压缩?
当用户点击你的网站时,由您的服务器提供所要求的文件,这些文件越大,到你的浏览器并显示在屏幕上所需的时间就越长。
GZIP在传输他们到浏览器之前压缩您的网页和样式表,这大大减少了传输时间,因为这些文件小得多。
GZIP压缩是网页速度优化的基本方法,现在绝大多数网站都已经启用GZIP。
GZIP是怎样工作的?
GZIP实际上是一个相当简单的想法,但是善加利用是非常强大的。 GZIP把一个文本文件的字符串替换使整个文件大小更小。
由于CSS文件和HTML文件使用了大量重复的文字,并有空白的字符,而GZIP压缩公用字符串,这可以减少页面和样式表的高达70%的大小!而对您的Web服务器启用Gzip是相对简单的。
当浏览器访问一个Web服务器时,会先检查看看是否有服务器启用GZIP,并请求该网页。如果启用,它就接收gzip文件,否则它会接收未压缩的版本,但这页面大小将大得多。
为什么这么重要
压缩GZip如此重要的主要的原因是,它减少了一个网站传输网页文件和样式表所需的时间,最终降低你的网站加载时间。
怎样添加GZip
添加GZip的方法,根据你所使用的服务器不同而不同,这取决于你使用的是IIS还是Apache或其他web服务器。
以下是某些热门网络服务器上所启用的压缩功能:
  • Apache:Apache启用Gzip功能
  • IIS:IIS配置HTTP压缩功能
  • lighttpd:lighttpd配置gzip
  • Nginx:Nginx配置Gzip功能
对于Apache服务器
你需要添加如下脚本到.htaccess文件:

<IfModule mod_deflate.c>

# Compress HTML, CSS, JavaScript, Text, XML and fonts

AddOutputFilterByType DEFLATE application/javascript

AddOutputFilterByType DEFLATE application/rss+xml

AddOutputFilterByType DEFLATE application/vnd.ms-fontobject

AddOutputFilterByType DEFLATE application/x-font

AddOutputFilterByType DEFLATE application/x-font-opentype

AddOutputFilterByType DEFLATE application/x-font-otf

AddOutputFilterByType DEFLATE application/x-font-truetype

AddOutputFilterByType DEFLATE application/x-font-ttf

AddOutputFilterByType DEFLATE application/x-javascript

AddOutputFilterByType DEFLATE application/xhtml+xml

AddOutputFilterByType DEFLATE application/xml

AddOutputFilterByType DEFLATE font/opentype

AddOutputFilterByType DEFLATE font/otf

AddOutputFilterByType DEFLATE font/ttf

AddOutputFilterByType DEFLATE image/svg+xml

AddOutputFilterByType DEFLATE image/x-icon

AddOutputFilterByType DEFLATE text/css

AddOutputFilterByType DEFLATE text/html

AddOutputFilterByType DEFLATE text/javascript

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/xml

# Remove browser bugs (only needed for really old browsers)

BrowserMatch ^Mozilla/4 gzip-only-text/html

BrowserMatch ^Mozilla/4.0[678] no-gzip

BrowserMatch bMSIE !no-gzip !gzip-only-text/html

Header append Vary User-Agent

</IfModule>
当你保存.htaccess文件后,使用webkaka的GZip压缩检测以确认是否已经压缩成功。

常见问题

怎么知道网站的GZip压缩是否起作用了?
使用webkaka的网站速度诊断,在“优化建议”里可以看到网站各文件是否使用了GZip。
为什么图片、PDF和视频文件没有压缩?
GZip压缩对图片、PDF、视频和其他已经使用二进制压缩过的文件是无效的,如果你想压缩图片文件,可以看看压缩图片这里。
Flash被破坏
flash预加载器不能处理压缩的flash文件,如果你已经压缩的flash被破坏了,请不要压缩flash文件。
为什么GZip压缩没有生效?
GZip压缩没有生效的原因有很多,不同的服务器,原因也可能不一样,可以在这里查找解决方法:GZip常见问题及解决方法汇总。

建议

把网页内容写得使压缩更有效
为了使用你的网页内容得到更好的压缩,请参照如下方法:
1、确保HTML和CSS代码的一致性。为了实现一致性
  • 在可能的情况以相同的顺序指定CSS关键值,例如按字母顺序排列它们。
  • 以相同的顺序指定HTML属性,例如按字母顺序排列它们。把HREF第一个链接(因为它是最常见的),然后按字母顺序排列剩下的。例如,谷歌的搜索结果页面,当HTML属性是按字母顺序排列时,gzip压缩过的输出的大小减少1.5%。
  • 保持字母的一致性,例如在任何时候都是小写。
  • 保持引号的一致性,例如全部使用单引号,或者全部使用双引号,又或者如果可能的话干脆连引号也不要。
2、优化CSS和优化Javascript。优化CSS和Javascript不仅可以帮助外部的CSS和Javascript文件的压缩,还可以帮助HTML页面内嵌的CSS和Javascript代码。
不要使用GZip压缩图片和其他二进制文件
网页支持已经压缩过的图片文件,同样支持已经压缩过的视频、PDF等二进制文件;使用GZip压缩这些文件,不会提供额外的好处,反而使他们的体积变得更大。要压缩图片,请来这里:图片压缩优化。

缩减首屏内容的大小

缩减首页概览
如果所需的数据量超出初始拥塞窗口的限制,系统就需要在服务器和用户浏览器之间进行更多次的往返。如果用户使用的是延迟时间较长的网络(例如,移动网络),该问题会严重延迟网页的加载。
建议
为提高网页加载速度,请限制呈现网页首屏内容所需的数据(HTML标记、图片、CSS和JavaScript)大小。为此,您可以尝试以下几种方法:
  • 结构化HTML,以便首先加载关键的首屏内容
  • 减少资源所用的数据量
结构化HTML,以便首先加载关键的首屏内容
请首先加载网页的主要内容。结构化网页,以便服务器发出的初始响应能发送必要数据,从而迅速呈现网页的关键部分并暂缓呈现其余部分。这可能意味着,您必须将CSS拆分为两个部分:负责调整内容ATF部分的格式的内嵌部分,以及可暂缓呈现的部分。
参考以下示例,了解有关如何结构化网站以提高加载速度:
  • 如果您的HTML先加载第三方小部件,再加载主要内容,请将该加载顺序更改为先加载主要内容。
  • 如果您的网站采用的是两列布局(即导航边栏加文章),而HTML先加载边栏,再加载文章,请考虑首先加载文章。
减少资源所用的数据量
如果经过重新设计的网站可以在多个设备上正常运行,并能首先加载关键内容,请使用以下技术来减少呈现网页所需的数据量:
  • 缩减资源的大小:通过移除不必要的空格和评论来缩减HTML、CSS和JavaScript的大小。通过使用可重命名资源中变量名称的工具,实现进一步的优化。
  • 尽可能考虑使用CSS,而非图片。
  • 启用压缩功能

减小,缩减资源(HTML、CSS和JavaScript)的大小

缩减资源简介
缩减资源大小是指删除不必要的字节(例如,多余的空格、换行符和缩进)。压缩HTML、CSS和JavaScript可提高下载、解析和执行的速度。此外,对于CSS和JavaScript,还可通过以下方式进一步缩小文件体积:在对HTML进行适当更新的过程中重命名变量名称,以确保选择器继续运行。
SEO建议
您应缩减HTML、CSS和JavaScript的大小。
要缩减HTML的大小,除了压缩HTML代码外,还包含其中内嵌的JavaScript和CSS代码,这样可以减少字节数,加快下载、解析和执行时间。
常用工具
要缩减CSS的大小,您可以尝试使用webkaka的在线压缩CSS工具。
要缩减JavaScript的大小,您可尝试使用webkaka的在线压缩JavaScript工具。
您可以创建一个使用这些工具的构建流程,以便缩减开发文件的大小并对其进行重命名,然后将其保存到正式版目录。