在前端开发中如何提高网站性能是每一个前端工程师必须所考虑的内容。经过阅读《高性能网站建设指南》加深了对提高网站性能的各类方法的认识,同时在从此的开发中也能更好的运用。javascript
使用场景:css
缺点:html
内容发布网络(CDN)是一组分布在多个不一样地理位置的Web服务器,用于更加有效地向用户发布内容。
经常使用的CDN有:前端
页面中都包含大量的组件,经过web服务器使用一个长久的expires头,使得这些组件能够被缓存,这样在后续页面中避免没必要要的HTTP请求
缺点:要求服务器和客户端的时间严格同步,过时日期须要检查,并提供新日期
HTTP1.1引入Cache-Control头来克服Expires头的限制
cache-control使用max-age指令
max-age请求的内容过多久过时(相对于请求时间Date)失效,默认以秒为单位
具体的过时时间配置可在Apache配置文件中添加mod_expires.c配置信息。java
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "now plus 1 month" ExpiresByType application/x-javascript "now plus 5 day" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/bmp "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType image/png "access plus 1 minutes" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresDefault "now plus 1 minutes" </IfModule>
配置信息可参考Apache Module mod_expiresnode
经过开启gzip压缩来减少HTTP响应数据包的大小
值得压缩的内容有HTML xml css js json
不应压缩的内容图片 pdf,他们在上传到服务器的时候通常就已压缩好,再压缩只会浪费CPU
经过配置Apache 2.x的mod_deflate模块web
<IfModule mod_deflate.c> DeflateCompressionLevel 6 SetOutputFilter DEFLATE SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/json <IfModule mod_setenvif.c> BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html </IfModule> </IfModule>
配置信息可参考Apache Module mod_deflateajax
将样式表放在head标签里能够避免白屏,这样浏览器能更快的展示内容,用户体验更好
而将样式表放在底部会致使浏览器阻止内容逐步呈现,为避免当样式变化时重绘页面,浏览器会延迟显示页面中的元素express
在下载脚本时浏览器会阻塞并行下载,缘由:apache
将脚本放到页面底部,这不会阻止页面内容呈现并且页面中的可视组件能尽早下载
表达式的问题在于对其进行的求值的频率比人们指望的要高,它们不仅在页面呈现和大小改变时求值,当页面滚动、甚至用户鼠标在页面上移过期都要被求值。频繁地求值计算会致使性能底下
解决方法:
好处:
方法:
经过精简从代码中移除没必要要的字符,注释,空白符等,从而达到减少请求文件大小的目的
在实际开发中通常将js和css经过工具压缩为min文件
常见的重定向状态码有:
重定向会延长从发出请求到请求资源被下载的这段时间
有一种重定向最浪费也发生的很频繁 缺乏结尾的斜线
当缺乏结尾的斜线时它容许自动索引(自动转到默认的index.html)而且可以得到与当前目录相关的URL
避免重定向方法
重复脚本损伤性能的两种方式
Etag是web服务器和浏览器用于确认缓存组件的有效性的一种机制
服务器在检测缓存的组件是否和原始服务器上的组件匹配时有两种方式:
原始服务器经过Last-Modified响应头来返回组件的最新修改日期
当组件第一次被请求成功后浏览器缓存了该组件以及它的最新修改日期(容许缓存),当再次请求该组件时,浏览器会使用If-Modified-Since头将最新修改时间和原始服务器上该组件的最新修改时间进行比较,若是相同则返回一个304,而不传输数据,浏览器将使用缓存数据。
ETag是惟一标识了一个组件的一个特性版本的字符串
ETag:"24-54c6a9bd53bd1"
当组件第一次被请求成功后浏览器缓存了该组件以及它的最新修改日期(容许缓存)还有ETag信息,当再次请求该组件时,浏览器会使用If-None-Match头将ETag和原始服务器上该组件的ETag进行比较,若是相同则返回一个304,而不传输数据,浏览器将使用缓存数据。
当你使用服务器集群时,相同的组件从一台服务器带另外一台服务器,Aapache和IIS产生的ETag是不一样的,这样组件下载次数将增长,致使性能降低
当If-None-Match比If-Modified-Since共存时,只有If-Modified-Since和If-None-Match在彻底匹配时,服务器才能返回304。不然因为If-None-Match比If-Modified-Since具备更高的优先级,ETag不一样,服务器就会返回200
FileEtag INode Mtime Size INode:文件的索引节点(inode)数 MTime:文件的最后修改日期及时间 Size:文件的字节数 All:全部存在的域,等价于:FileETag INode MTime Size None:移除ETag
有网友建议只是用MTime和Size就行了,有待验证
FileETag none
若是使用ajax向服务器发起大量的GET请求则能够为其请求的资源设置长久的expires头