高性能表现的网站(译)(2)
作者:mask 来源:经典论坛 发布时间:2008-08-31 20:26:00
标签:性能,网站,优化,雅虎
9.减少DNS查询
10.减小脚本体积
有两个比较流行的工具是用来减小脚本的体积的--JSMin和YUI Compressor
(按:这个压缩和Gzip压缩是不一样的,Gzip是传输压缩,这个是代码压缩)
11.避免重定向
重定向会减慢用户体验,它会延迟所有的东西直至到达新页面。一个最浪费的重定向经常会发生而我们的开发者又会经常忽略的就是比如http://astrology.yahoo.com/astrology的结果是重定向到http://astrology.yahoo.com/astrology/ 在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。
从一个旧网站跳转到新网站也是经常要用到重定向,还有就是连接一个网站中的不同部分和在某些情况下(比如不同浏览器,不同的用户帐号类型,等等)的用户导向。用重定向很简单,而且只需要一点额外的代码,虽然在这些情况下用重定向减少了开发者的复杂度,但它降低了用户的体验,变通的做法是用Alias和mod_rewrite如果两个部分是在同一主机上的话,如果是由域名变更引起的重定向,变通的做法是通过Alias或mod_rewrite创建一个CNAME(一个DNS记录,创建一个别名,从一个域名指向另一个域名)
12.去掉重复的脚本
(按:简单的说,同一个脚本如果被调用多次,浏览器并不会忽略后续的脚本,而总是覆盖加载,覆盖运行,这样会增加开销)
13.配置ETags
ETags(Entity tags)是服务器和浏览器的一个功能,它用来判断浏览器缓存里的元素是否和原来服务器上的一致。ETags比last-modified date更具有弹性,它用一个独一无二的字符串来标识一个元素的版本。
源服务器用响应头里的ETag来特定一个元素的ETag:
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
之后,如果浏览器要验证这个元素,它就会用If-None-Match头来回传ETag到源服务器。如果符合的话,一个304状态的代码就会从源服务器返回到浏览器,这样源服务器就节省了传输具体数据的开销。
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
用Etags的问题就在于它会标识那个特定的服务器,如果换了服务器,Etags也就失去了原有的功能,但是这种现在在网络上太常见了,因为我们经常用服务器集群。默认情况下,Apache和IIS会在Etag中内嵌数据,这样会动态减少验证成功的机会。
Apache1.3和2.x的ETag格式是inode-size-timestamp。虽然一个文件可能在不同服务器的同一个目录,同样的大小,安全级,时间戳等等,它的inode会随着服务器的不同而不同。
IIS5.0和6.0有同样类似Etags的东西,叫时间戳:ChangeNumber(更改号),更改号是一个用来追踪IIS配置变化的计数器,ChangeNumber在不同IIS服务器之间是不一样的。
它最终的问题就是,IIS和Apache产生的Etags会在不同服务器之间无法匹配,这样我们的浏览器就无法得到我们期待的304响应,而给我们的是一个普通的200响应,和正常的数据流。如果你的网站只有一个服务器还无所谓,如果是集群,而你用的是默认的ETag配置,你的用户就会获得更慢的页面,你的服务器也会有更高的负载,消耗更大的带宽资源,代理也无法高效缓存你的内容,甚至即使你有一个长时间过期的头部(按:见第三条规则),也不会阻止它重新载入内容。
如果你不想发挥Etags提供的这个弹性验证模型的优势,你最好关掉它。Apache中关掉它的方法是在Apache的配置文件中写这么一句:
FileETag none
14.让Ajax缓存
人们会问这些规则同样适用于web2.0吗?当然!这个规则是我在雅虎工作做web2.0后得出的第一条规则。
Ajax的一个好处是它会给你实时的回馈,因为它和后台的服务器是异步传输的,然而,用Ajax并不能保证你的用户不用无聊的拨弄手指头来等待这个回馈,在很多应用中,用户是否需要等待取决于Ajax是怎么用的,举例说,在一个基于网页的邮件客户端,用户会持续等待Ajax的回馈来搜索符合他的标准的邮件信息。记住“异步”并不意味着“实时”。让它缓存的方式同样是加一个过期头部。
原文来自:http://developer.yahoo.com/performance/rules.html
2007.3.20 Steve Souders


猜你喜欢
- 一张损坏的表的症状通常是查询意外中断并且你能看到例如这些错误:◆ “tbl_name.frm”被锁定不能改变。◆ 不能找到文件“tbl_na
- 打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢?到底该装 Python2 呢还是 Python3 ?为什么安装 P
- 连接mysql#!/usr/bin/python#-*- coding:utf-8 -*-import timeimport pymysql
- 本文将展示一个开源JavaScript库,该脚本库给AJAX应用程序带来了书签和后退按钮支持。在学习完这个教程后,开发人员将能够获得对一个A
- 在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证。一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,
- 如果在prop中传的值为一个没有使用特殊命名规则的变量如:(type),可以顺利传值:<code class="langua
- 许多网页开发者想从ASP.NET 页面传递一个值到另一个页面(比如从一个框架frame页面到一个弹窗页面)。看了代码就明白了。呵呵。(一)向
- 本文实例为大家分享了Vue实现导航栏菜单的具体代码,供大家参考,具体内容如下这里是刚学习vue的时候,没有用vue的任何UI组件库写的导航栏
- HTTP、HTTPS协议下session共享解决cookie失效 的办法:(也许不是最好的,但是实用)原理就是把session id设置到本
- 本文实例为大家分享了JS实现长图上下滚动的具体代码,供大家参考,具体内容如下案例描述将一张长图放在某一固定长宽的盒子里,当鼠标置于盒子的上半
- 一般常规的我们保存数据为dict类型时,系统会自动帮我们排序;但有时我们想按照输入顺序的key:value保存到dict中,而不想要改变顺序
- 创建项目django-admin startproject meiduo_mall添加工程完整结构包启动前端python -m http.s
- 导读:如何使用scrapy框架实现爬虫的4步曲?什么是CrawSpider模板?如何设置下载中间件?如何实现Scrapyd远程部署和监控?想
- 我的大体思路是:时时监听鼠标的坐标,当鼠标移动时,透明层随着鼠标移动,大图片相对透明层的移动而移动。不废话了,看代码。 <!DOCTY
- 准备我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了。 使用Speech API原理我们的
- 1. ES语法的getter和setter在开始了解 Vue 的数据响应式原理前应该先搞清楚 ES语法 中的 getter 和 setter
- <title>动态序列比对</title> <script> function pairaln(seq1
- 前言URLconf 就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。你就
- 0x01介绍PySocks使您可以通过SOCKS和HTTP代理服务器发送流量。它是SocksiPy的现代分支,具有错误修复和其他功能。0x0
- 只有mdf文件的数据库附加失败的修复 附加时报如下错误: 服务器: 消息 1813,级别 16,状态 2,行 1 未能打开新数据库 '