Vue 项目性能优化之gzip

JavaScript027

Vue 项目性能优化之gzip,第1张

终端中可以看到build后台文件Size很大,同时给出了预期压缩后的大小,gzip相对来说很小,请求gzip预期时间减少

但我们看dist文件中只有js文件,默认没有gzip文件

项目放到服务器上访问,查看js请求,加载的是js文件

使用compression-webpack-plugin插件 https://www.npmjs.com/package/compression-webpack-plugin

deleteOriginalAssets为true时,会删除js文件,访问时会报404

'W/' (区分大小写)表示使用 弱验证器 。弱 etags 很容易生成,但在比较时用处不大。强验证器是比较的理想选择,但很难有效地生成。 ETag 相同资源的两个表示的弱值可能在语义上是等效的,但不是逐字节相同的。这意味着当使用 字节范围请求 时,弱 etag 会阻止缓存,但强 etag 意味着范围请求仍然可以被缓存。

因为Nginx下的gzip默认不压缩javascript、图片等静态资源文件

可以通过gzip_types指定需要压缩的MIME类型

gzip on

gzip_types text/plain application/x-javascript text/css text/javascript

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

常见MIME类型参考:

格式前面为后辍名,后面为对应的MIME型(例如:rar application/x-rar-compressed 表示。RAR对应的是application/x-rar-compressed )

{ ".apk", "application/vnd.android.package-archive" },

{ ".asp", "application/x-asap" },

{ ".flv", "flv-application/octet-stream" },

{ ".gif", "image/gif" },

{ ".gz", "application/x-gzip" },

{ ".htc", "text/x-component" },

{ ".htm", "text/html" },

{ ".html", "text/html" },

{ ".ico", "image/x-icon" },

{ ".jpeg", "image/jpeg" },

{ ".jpg", "image/jpeg" },

{ ".js", "application/x-javascript" },

{ ".mht", "message/rfc822" },

{ ".mhtml", "message/rfc822" },

{ ".mp3", "audio/mpeg" },

{ ".mp4", "video/mp4" },

{ ".mpa", "video/mpeg" },

{ ".mpeg", "video/mpeg" },

{ ".mpg", "video/mpeg" },

{ ".mpg4", "video/mp4" },

{ ".pdf", "application/pdf" },

{ ".png", "image/png" },

{ ".ppt", "application/vnd.ms-powerpoint" },

{ ".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },

{ ".pqf", "application/x-cprplayer" },

{ ".rf", "image/vnd.rn-realflash" },

{ ".rgb", "image/x-rgb" },

{ ".rmvb", "audio/x-pn-realaudio" },

{ ".shtml", "magnus-internal/parsed-html" },

{ ".swf", "application/x-shockwave-flash" },

{ ".tif", "image/tiff" },

{ ".wml", "text/vnd.wap.wml" },

{ ".xhtm", "application/xhtml+xml" },

{ ".xhtml", "application/xhtml+xml" },

{ ".xla", "application/vnd.ms-excel" },

{ ".xlc", "application/vnd.ms-excel" },

{ ".xll", "application/x-excel" },

{ ".xlm", "application/vnd.ms-excel" },

{ ".xls", "application/vnd.ms-excel" },

{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },

{ ".xlt", "application/vnd.ms-excel" },

{ ".xlw", "application/vnd.ms-excel" },

{ ".xm", "audio/x-mod" },

{".xml","text/plain"},

{".xml","application/xml"},[1]

{ ".zip", "application/zip" },

{ ".json", "application/json" },

由于我们团队的前端项目越来越庞大,加之Vue的SPA首屏加载特性,导致系统第一次加载速度越来越缓慢,可能达到几十秒的程度,所以为了优化用户性能体验,我们选择了开启Gzip进行文件压缩,确实达到了显著的效果。

Gzip原本用户UNIX系统的文件压缩,后来逐渐成为Internet最主流的数据压缩格式。

当用户访问我们的web站点时,服务器就将我们的网页文件进行压缩,将压缩后的文件传输到客户端,对于纯文本文件我们可以至少压缩到原大小的40%,这样大大提高了传输效率,页面便可更快的加载出来。

由于目前我们项目是使用ngxin来部署前端的,nginx自带 HttpGzip模块 所以我们直接对 nginx.conf 文件的http配置项进行配置即可。但相对的由于nginx自身处理请求然后压缩返回,会消耗对应的服务器内存。

测试效果

我们应尽可能减少对服务端内存的使用,毕竟服务端的资源是十分宝贵的,这里我们仍然使用nginx进行前端部署,我们在客户端替nginx处理压缩文件这一步操作,nginx便可直接使用我们压缩好的文件,下面是一个基于vue-cli配置的前端项目。

这里最好安装低版本,防止报错。

这里可以根据大家不同的配置,总之就是将webpack插件进行注册。

成功运行后,便可以在打包文件中看到.gz结尾的文件了,将打包后的文件上传到指定的nginx文件夹下。

这里需要nginx对应的插件 http_gzip_static_module ,之前我是通过yum安装的nginx,这里似乎不可以,需要手动安装。这里目录可以根据大家个人情况而定。

安装nginx

修改nginx.conf

启动nginx服务

这里我们虽然服务端js文件夹里只有.gz格式的文件(其他的文件已删除),但客户端却成功读取了。

无论是服务端与客户端进行gzip的压缩,我们都大大缩小了文件体积,给用户带来了更好的体验。

服务端处理gzip优点是只需配置一下即可,无需复杂操作,但缺点是会消耗服务器内存。

客户端处理gzip优点是无需服务器进行文件压缩,减少服务器内存消耗,但配置起来相比服务端gzip会稍加繁琐。

Nginx中文文档

什么是GZIP,有什么优势,如何开启GZIP?

vue-cli4 开发项目中开启gzip压缩,优化打包体积,提升加载速度

Nginx gzip static静态压缩

配置nginx直接使用webpack生成的gz压缩文件,而不用nginx自己压缩