最近没事升级项目到 vue-cli3.0, 发现没有了 productionGzip 配置,于是查了一下午资料, 解决方案如下:

1.安装如下插件

1
npm i -D compression-webpack-plugin

2.在文件 vue.config.js 里导入 compression-webpack-plugin,并添加压缩文件类型

1
const CompressionWebpackPlugin = require("compression-webpack-plugin");
2
const productionGzipExtensions = ["js", "css"];

3.在 configureWebpack 里配置如下代码
a.简单方式

1
configureWebpack: {
2
     plugins: [
3
         new CompressionWebpackPlugin({
4
             asset: '[path].gz[query]',
5
             algorithm: 'gzip',
6
             test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
7
             threshold: 10240,
8
             minRatio: 0.8
9
         })
10
     ]
11
 },

b.高级方式

1
configureWebpack: config => {
2
    if (process.env.NODE_ENV === 'production') {
3
        // 生产环境
4
        config.plugins.push(
5
            new CompressionWebpackPlugin({
6
                asset: '[path].gz[query]',
7
                algorithm: 'gzip',
8
                test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
9
                threshold: 10240,
10
                minRatio: 0.8
11
            })
12
        );
13
14
    } else {
15
        // 开发环境
16
17
    }
18
},

//配置参数详解

asset: 目标资源名称。 [file] 会被替换成原始资源。[path] 会被替换成原始资源的路径, [query] 会被替换成查询字符串。默认值是 “[path].gz[query]”。

algorithm: 可以是 function(buf, callback) 或者字符串。对于字符串来说依照 zlib 的算法(或者 zopfli 的算法)。默认值是 “gzip”。

test: 所有匹配该正则的资源都会被处理。默认值是全部资源。

threshold: 只有大小大于该值的资源会被处理。单位是 bytes。默认值是 0。

minRatio: 只有压缩率小于这个值的资源才会被处理。默认值是 0.8。

4.然后运行 npm run build 完成

5.附完整 vue.config.js 配置代码

1
const path = require("path");
2
function resolve(dir) {
3
  return path.join(__dirname, dir);
4
}
5
// 导入compression-webpack-plugin
6
const CompressionWebpackPlugin = require("compression-webpack-plugin");
7
// 定义压缩文件类型
8
const productionGzipExtensions = ["js", "css"];
9
10
module.exports = {
11
  baseUrl: "/",
12
  // 输出目录
13
  outputDir: "dist",
14
  lintOnSave: true,
15
  // 是否为生产环境构建生成 source map?
16
  productionSourceMap: false,
17
  // alias 配置
18
  chainWebpack: config => {
19
    config.resolve.alias.set("@", resolve("src"));
20
  },
21
  // 简单的方式
22
  // configureWebpack: {
23
  //     plugins: [
24
  //         new CompressionWebpackPlugin({
25
  //             asset: '[path].gz[query]',
26
  //             algorithm: 'gzip',
27
  //             test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
28
  //             threshold: 10240,
29
  //             minRatio: 0.8
30
  //         })
31
  //     ]
32
  // },
33
  // 高级的方式
34
  configureWebpack: config => {
35
    if (process.env.NODE_ENV === "production") {
36
      // 生产环境
37
      config.plugins.push(
38
        new CompressionWebpackPlugin({
39
          asset: "[path].gz[query]",
40
          algorithm: "gzip",
41
          test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"),
42
          threshold: 10240,
43
          minRatio: 0.8
44
        })
45
      );
46
    } else {
47
      // 开发环境
48
    }
49
  },
50
  // CSS 相关选项
51
  css: {
52
    extract: true,
53
    // 是否开启 CSS source map?
54
    sourceMap: false,
55
    // 为预处理器的 loader 传递自定义选项。比如传递给
56
    // sass-loader 时,使用 `{ sass: { ... } }`。
57
    loaderOptions: {}, // 为所有的 CSS 及其预处理文件开启 CSS Modules。
58
59
    modules: false
60
  },
61
  // 在多核机器下会默认开启。
62
  parallel: require("os").cpus().length > 1,
63
  // PWA 插件的选项。
64
  pwa: {},
65
  // 配置 webpack-dev-server 行为。
66
  devServer: {
67
    open: process.env.NODE_ENV === "development",
68
    host: "localhost",
69
    port: 8888,
70
    https: true,
71
    hotOnly: false,
72
    open: true,
73
    proxy: "", // string | Object
74
    before: app => {}
75
  },
76
  // 第三方插件的选项
77
  pluginOptions: {}
78
};