1.减少http请求数量
到终端用户的响应时间80%花在前端:大部分用于下载组件(js/css/image/flash等等)。减少组件数就是减少渲染页面所需的http请求数。
减少组件数的一个方法就是简化页面设计。保持富内容的页面且能减少http请求,可以从以下几点实现:
①,合并文件,如合并js,合并css都能减少请求数(用webpack打包)。
②,雪碧图可以合并多个背景图片,通过background-image 和 background-position 来显示不同部分。
2,减少DNS查询
就像电话簿,你在浏览器地址栏输入网址,通过DNS查询得到网站真实IP。
DNS查询被缓存来提高性能。这种缓存可能发生在特定的缓存服务器,或者用户的计算机。DNS信息留存在操作系统DNS缓存中,大多浏览器有自己的缓存,独立于操作系统缓存。只要浏览器在自己的缓存里有某条DNS记录,它就不会向操作系统发DNS解析请求。
当客户端的DNS缓存是空的,DNS查找次数等于页面中的唯一域名数。
所以:
由于DNS查找是需要时间的,而且它们通常都是只缓存一定的时间,所以应该尽可能地减少DNS查找的次数。
减少DNS查找次数,最理想的方法就是将所有的内容资源都放在同一个域(Domain)下面,这样访问整个网站就只需要进行一次DNS查找,这样可以提高性能。
但理想总归是理想,上面的理想做法会带来另外一个问题,就是由于这些资源都在同一个域,而浏览器针对每个域只有一定数量的并行度(不同浏览器并行数量不同),那么就会出现下载资源时的排队现象,这样就会降低性能。
如果想减少dns查询,当同源资源过多就会出现下载资源排队,想不排队就又得增加DNS请求。
所以,折中的做法是:建议在一个网站里面使用至少2个域,但不多于4个域来提供资源。我认为这条建议是很合理的,也值得我们在项目实践中去应用
3.使用CDN
CDN是一群不同地点的服务器,可以更高效地分发内容到用户。一些大公司有自己的CDN。
用户离你的服务器越近,响应时间越少,因此使用CDN,用户可以以最短的路径,最快的速度对网站进行访问。因此,CDN可以加速用户访问速度,减少源站中心负载压力。
4.HTTP缓存
缓存是一种保存资源副本并在下次请求时直接使用该副本的技术。当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处有:缓解服务器端压力,提升性能(获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。
服务器可以通过设置Cache-Control或ETag头,来实现缓存。
5.Cookie
http cookie的使用有多种原因,比如授权和个性化。cookie的信息通过http头部在浏览器和服务器端交换。也就是说每次请求与响应都会带上cookie,尽可能减小cookie的大小来降低响应时间。
①,消除不必要的cookie。
②,尽可能减小cookie的大小来降低响应时间。
③,注意设置cookie到合适的域名级别,则其它子域名不会被影响。
④,正确设置Expires日期。早一点的Expires日期或者没有会尽早删除cookie,优化响应时间。
6.HTML文档顺序
①<link>标签放在<head>,这样浏览器就会更早得到css样式,可以加快页面样式的渲染。当我们将css放在底部,页面可以正常逐步呈现,但在css下载并解析完毕之后,已经呈现的文字和图片就要用新的样式重绘了,这就是“无样式内容的闪烁”,这将是一种不好的用户体验。
②<script>标签放在底部,脚本引起的问题是它们阻塞了并行下载,当脚本在下载,浏览器不会再下载其它组件,即使在不同域名下。
7.压缩代码
压缩JS和CSS。
压缩就是删除代码中不必要的字符来减小文件大小,从而提高加载速度。当代码压缩时,注释删除,不需要的空格(空白,换行,tab)也被删除。
8.优化图片
检查gif图片的调色板大小是否匹配图片颜色数。
可以把gif转成png看看有没有变小。除了动画,gif一般可以转成png8。
运行pngcrush或其它工具压缩png。
运行jpegtran或其它工具压缩jpeg。
不要在html中缩放图片,不要因为你可以设置图片的宽高就去用比你需要的大得多的图片,根据需求使用匹配尺寸的图片
PS:避免空src的图片,以避免不必要的请求。
9.gZip
传输时用gzip等压缩组件。
我们压缩文件的目的就是为了把传输文件的体积减小,加快传输速度。我们在 http 传输中开启 gZip的目的也是如此
在 http/1.0 协议中关于服务端发送的数据可以配置一个 Content-Encoding 字段,这个字段用于说明数据的压缩方法
客户端在接收到返回的数据后去检查对应字段的信息,然后根据对应的格式去做相应的解码。客户端在请求时,可以用 Accept-Encoding 字段说明自己接受哪些压缩方法。
gzip一般可减小响应的70%。尽可能去gzip更多(文本)类型的文件。html,脚本,样式,xml和json等等都应该被gzip,而图片,pdf等等不应该被gzip,因为它们本身已被压缩过,gzip它们只是浪费cpu,甚至增加文件大小。