本文整理了本书的最后7条法则《高性能网站建设指南》。8.使用外部Jacascript和css1。如果需要呈现给用户的页面可以完全缓存,那么使用外部的Jacascript和css会提高网站性能。2、使用外部Jacascript和css时,可以设置为页面加载后下载,这样可以保证页面首屏的效果。九。减少DNS查询1.Internet使用IP地址来查找服务器。由于IP地址比较难记,通常用包含主机名的URL代替,但浏览器发送请求时仍然需要IP地址。这是域名系统(DNS)的作用,它将主机名映射到IP地址。当您输入网址时,链接到服务器的DNS解析器会返回服务器的IP地址。2.DNS开销:浏览器查找给定主机名的IP地址通常需要20-120毫秒,在查找完成之前浏览器不能从主机下载任何东西。3.使用Keep-Alive和更少的域名来减少DNS查询十。精简JavaScript精简是从代码中去除不必要的字符,例如空格(空格、换行符、制表符)等以减小文件大小,进而改善加载时间。11.避免重定向1.重定向用于将用户从一个url重新路由到另一个url。重定向有很多种:301和302是常见的两种。当Web服务器向浏览器返回重定向时,响应将具有3xx范围内的状态代码(注意:“304NotModified”不是真正的重定向-它用于响应GET请求,避免下载已经存在的数据存在于浏览器的缓存中。)。3.重定向损坏:在重定向完成并下载HTML文档之前,不会向用户显示任何内容。12.删除重复的脚本重复的脚本会通过两种方式损害性能:不必要的HTTP请求和执行JavsScript所浪费的时间。13.如何配置或删除ETag1.Etag?实体标签(EntityTagETag)是Web服务器和浏览器用来确认缓存组件有效性的一种机制。2.浏览器缓存和确认?Step1:Expiresheader:当浏览器下载该组件时,它会被存储在缓存中。当再次请求该组件时,会确认该组件是否过期,以决定是否再次请求该组件,过期时间由Expires头的值决定。当请求组件时,服务器会根据其选项在响应中返回一个Expires标头。第二步:条件GET请求:如果缓存的组件过期(或者用户显式重写页面),浏览器必须先检查它是否仍然有效,然后再使用它。这称为条件GET请求。如果组件有效,则源服务器返回“304NotModified”状态代码。服务端检测缓存组件是否有效有两种方式:1.比较最新修改日期2.比较实体标签2.1最新修改时间:原始服务器通过Last-Modified返回组件的最新修改时间responseheader,它要求server只有在与client时间完全一致时才有意义。2.1实体标签:ETag提供了另一种方式来检测浏览器缓存中的组件是否与原始服务器上的组件匹配。ETag在HTTP1.1中被引用。ETag是一个字符串,用于唯一标识组件的特定版本。唯一的格式约束是字符串必须用引号引起来。原始服务器使用指定组件的ETag进行响应。ETag为验证实体提供了比最新修改日期更灵活的机制。例如,如果实体根据User-Agent或Accept-Language标头发生更改,则实体的状态可以反映在ETag中。此后,如果浏览器必须验证组件,它将使用If-None-Match标头将ETag传回源服务器。如果ETag匹配,将返回304状态。3.ETag带来的问题ETag的问题在于它通常是使用组件的某些属性构建的,这些属性对于托管网站的特定服务器是唯一的。当浏览器从一台服务器获取原始组件,然后向另一台服务器发起条件GET请求时,ETag将不匹配——对于使用服务器集群处理请求的网站来说,这是一种很常见的情况。默认情况下,对于有多台服务器的网站,APache和IIS中嵌入的数据会大大降低有效性验证的成功率。3.1Apache1.3和2.X的ETag格式为inode-size-timestamp。即使文件系统的所有信息都一致,不同服务器上的inode还是不一样的。3.2IIS5.0和6.0有类似ETag的问题。IIS上的ETag格式为Fletimestamp:ChangNumber。ChangNumber是一个适用于跟踪IIS配置更改的计数器。ChangNumber对于网站背后的服务器是不同的。3.3最终结果,对于完全相同的组件,Apache和IIS从一台服务器到另一台服务器生成的ETag是不同的。如果使用服务器集群,使用ETags会造成不必要的组件重复加载,影响服务器性能,增加宽带成本。4.使用还是不使用ETag?如果您使用的是默认ETag配置的服务器集群,您的用户将面临缓慢的页面,您的服务器将处于高负载下,您将消耗大量带宽,代理将无法有效缓存您的内容。为了使用ETag灵活的身份验证功能并消除它带来的问题,有一个自定义ETag配置的选项。例如,您可以使用根据浏览器是否为InternetExplorer而改变的脚本。如果您使用PHP生成脚本,您可以设置ETag标头以反映浏览器的状态。如果您的组件必须通过最新修改日期以外的其他方式进行验证,则自定义ETag是一种强大的方法。如果您无法自定义ETag,建议您移除ETag。十四、使用Ajax可以缓存众所周知,主动的Ajax请求是异步的,用户可能仍然需要等待响应。但是用户不必忍受整个页面的重新加载,并且在用户等待时UI仍然可以响应。由于Ajax毕竟是一个请求,为了更好的用户体验,我们还是需要结合上面其他的性能优化规则来使用,比如缓存。
