一、文件压缩的好处

前端生产环境中将js、css、图片等文件进行压缩的好处显而易见,通过减少数据传输量减小传输时间,节省服务器网络带宽,提高前端性能。

二、http协议如何支持压缩文件的传输

1、浏览器请求数据时,通过Accept-Encoding说明自己可以接受的压缩方法

2、服务端接收到请求后,选取Accept-Encoding中的一种对响应数据进行压缩

3、服务端返回响应数据时,在Content-Encoding字段中说明数据的压缩方式

4、浏览器接收到响应数据后根据Content-Encoding对结果进行解压

注:如果服务器没有对响应数据进行压缩,则不返回Content-Encoding,浏览器也不进行解压

三、什么时候压缩

四、服务器响应请求时压缩(nginx)

nginx中有关gzip的配置项如下:

1、gzip on|off:默认off

开启或者关闭gzip模块

2、gzip_comp_level 4:默认1,建议选择为4

gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,压缩时间越长,消耗CPU也越大。

3、gzip_min_length  1k:默认0,不管页面多大都压缩

设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。

建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024

4、gzip_static on|off:默认off

gzip_static是nginx对于静态文件的处理模块,可以读取预先压缩的gz文件,多与构建时压缩同时使用,详见下节构建时压缩介绍

5、更多配置信息参考:Nginx的gzip

五、构建时压缩(webpack)

webpack的compression-webpack-plugin插件用于支持构建项目时压缩文件,Vue项目为例,具体配置如下:

1、首先安装插件,命令:npm install --save-dev compression-webpack-plugin

2、在config/index.js文件中打开Gzip开关,配置需要压缩的文件扩展名

3、webpack.prod.conf.js中设置具体压缩配置项

4、打包后会同时保留原文件和压缩后的文件,存储等条件允许的情况下,原文件也建议发布到服务器以支持不兼容gzip的浏览器

5、服务端nginx启动gzip_static

gzip_static是nginx对于静态文件的处理模块,该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。该模块启用后,nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。

为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件(参考文章中提到本文未尝试)。

nginx需要安装http_gzip_static_module以支持gzip_static,具体方法见《源码安装nginx

六、生产环境:proxy_pass+gzip

上线后发现生产环境中静态文件的压缩配置没有起作用,经过定位发现生产环境加了反向代理导致nginx没有返回.gz文件。看到参考文章中二、三两篇时确定是gzip_http_version和proxy_set_header Accept-Encoding配置问题。

如果我们使用了proxy_pass进行反向代理,那么nginx和upstream server之间默认是用HTTP/1.0协议通信的。
如果我们的Cache Server也是nginx,而前端的nginx没有开启gzip。 同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进行gzip压缩。

所以,最终的解决方案是,在静态文件服务nginx中配置gzip_http_version为1.0

同时,反向代理服务器应该添加请求头proxy_set_header Accept-Encoding ‘gzip’,通知静态文件服务器客户端能够理解的gzip压缩文件,使其返回.gz文件

参考

探索HTTP传输中gzip压缩的秘密

Nginx开启Gzip详解(gzip_http_version部分):https://blog.csdn.net/zhuyiquan/article/details/52709864

nginx反向代理和gzip_static模块使用:https://yq.aliyun.com/ziliao/46446

前端性能优化:gzip压缩文件传输数据的更多相关文章

  1. 前端性能优化-gzip

    为什么要开启GZIP 我们需要下载一个100KB的Javascript文件,正常的下载量就是100KB,如果我们把文件在服务端压缩一下,压缩成30kb,下载到客户端再进行解压,这样就减少了大量的HTT ...

  2. Web前端性能优化教程04:压缩组件

    本文是Web前端性能优化系列文章中的第四篇,主要讲述内容:压缩组件.完整教程可查看:Web前端性能优化 基础知识 gzip编码:gzip是GUNzip的缩写,是使用无损压缩算法的一种,最早是用于Uni ...

  3. 前端性能优化之gzip

    前言: 如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要.常用的前端性能优化方法有如下几种 一.减少http请求 ...

  4. 前端性能优化成神之路—资源合并与压缩减少HTTP请求

    资源合并与压缩减少HTTP请求的概要 资源合并与压缩减少HTTP请求主要的两个优化点是减少HTTP请求的数量和减少请求资源的大小 http协议是无状态的应用层协议,意味着每次http请求都需要建立通信 ...

  5. 浅谈前端性能优化(二)——对HTTP传输进行压缩

    1.前端性能优化的一点: 对js.css.图片等进行压缩,尽可能减小文件的大小,减少文件下载的时间,从而减少网页响应的时间. 2.前端性能优化的另一点: 对HTTP传输进行压缩,即在js,css.图片 ...

  6. 专业术语:闭包、网站优化 Gzip 服务器端文件压缩

    1, 闭包:http://baike.baidu.com/view/648413.htm 2, 网站优化 Gzip 服务器端文件压缩 http://baike.baidu.com/view/96662 ...

  7. 大型网站技术架构(3):WEB 前端性能优化

    上次说到了性能优化策略,根据网站的分层架构,可以大致的分为 web 前端性能优化,应用服务器性能优化,存储服务器性能优化三大类 这次来说一下 web 前端性能优化,一般来说,web 前端就是应用服务器 ...

  8. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  9. 移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

随机推荐

  1. NamedParameterJdbcTemplate常用方法总结

    数据库结构 1.插入/修改/删除数据,使用update方法 插入数据1 API: int update(String sql, Map< String, ? > paramMap) 示例: ...

  2. ng开启缓存 造成的问题:

    开启缓存 造成的问题:

  3. Java 保存对象到文件并恢复 ObjectOutputStream/ObjectInputStream

    1.从inputFile文件中获取内容,读入到set对象: 2.然后通过ObjectOutputStream将该对象保存到outputFile文件中: 3.最后通过ObjectInputStream从 ...

  4. ICCS 会议 Latex 压缩文件提交主要事项

    cd papers/conf latex main... check that the are no error messages ...zip -r mypaper.zip * 说明:必须在Linu ...

  5. 学校项目过程中知识点 Java 2015/9/15 晚

    ##命令行运行Java程序1.文件Java的源代码存放在扩展名为“.java”的文件中:Java源文件编译后,得到“.class”的文件2.方法命令行下编译java源代码的方法:javac  文件名. ...

  6. .net collection tips

    1.数组对象都是Array的子类,Array是一个抽象类,不能显示实例化,Array提供了大量操作数组的静态方法 2.ArrayList其实是内部封装了一个array,实现了IList的接口.add ...

  7. hiho1601最大分数 DP

    #1601 : 最大得分 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在玩一个游戏.给定一个数组A=[A1, A2, ... AN],小Hi可以指定M个 ...

  8. ssm+PageHelper实现分页查询

    通过搭建ssm框架,然后通过mybatis的分页插件pagehelp进行分页查询.源码:https://gitee.com/smfx1314/pagehelper 看一下项目结构: 首先创建一个mav ...

  9. 关于python中的循环

    参考下面这一篇: http://www.cnblogs.com/vamei/archive/2012/05/30/2526357.html 其中用range的方式最好!

  10. 第06篇 MEF部件的生命周期(PartCreationPolicy)

    一.演示概述 本演示介绍了MEF的生命周期管理,重点介绍了导出部件的三种创建策略,分别是:CreationPolicy.Any.CreationPolicy.Shared.CreationPolicy ...