使用 gzip 压缩优化 Vue 的项目

因 chunk-vendors 过大导致首屏加载太慢的优化。

安装插件

安装 compression-webpack-plugin 插件。

前端将文件打包成.gz 文件,然后通过 nginx 的配置,让浏览器直接解析.gz 文件,可以大大提升文件加载的速度。

npm 使用下面命令安装

npm install --save-dev compression-webpack-plugin

修改配置

修改 vue 的配置文件 vue.config.js:

const webpack = require('webpack')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const productionGzipExtensions = ['js', 'css']


module.exports = {
  configureWebpack: {
    plugins: [
      // 配置compression-webpack-plugin压缩
      new CompressionWebpackPlugin({
        algorithm: 'gzip',
        test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
        threshold: 10240,
        minRatio: 0.8
      }),
      new webpack.optimize.LimitChunkCountPlugin({
        maxChunks: 5, 
        minChunkSize: 100
      })
    ]
  }
}

Nginx 配置

server{
    listen 8087;
    server_name localhost;

    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    location /appShare {
       client_max_body_size    10m;
       root /home/test/webIndex/appShare;
       try_files $uri $uri/ /appShare/index.html;
       index index.htm index.html;
    }

}

问题解决

打包的时候报了如下错误:

ERROR  TypeError: Cannot read property 'tapPromise' of undefined
TypeError: Cannot read property 'tapPromise' of undefined

这是插件版本的问题。

安装这个插件的时候安装的是最新版本,但脚手架配置 gzip 打包还不支持这个版本的。

在降低版本后发现使用正常:

npm install compression-webpack-plugin@6.1.1 --save-dev