親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Vue.jsでビルド時にgzipファイルを出力する方法


出力ファイルは極力圧縮したい

Webサービスにおいて、コンテンツ内容や機能面の充実度が重要であることは言うまでもありませんが、ページのパフォーマンスも重要ですよね。
当然遅いより早い方が良いに決まっています。

今回はパフォーマンス改善策の1つである、ファイルの圧縮についてです。
正直ファイルの圧縮は違いが体感できるほど大きな効果は期待できないものですが、工数をあまりかけずに対応できるなら対応しておいた方が良いでしょう。

GoogleのPageSpeed Insightsも圧縮しろってうるさいですしね…w

Vue.jsでのnpmビルド時に同時に圧縮

Vue.jsでは、ビルド時(コンパイル時)に圧縮したい場合、非常に簡単にできるため、その方法を共有します。

今回はhtmlファイル、cssファイル、jsファイルのみをgzip化します。
画像などは頻繁に変更が起きないので、必要があれば随時手動で行えば良いですし、毎回gzip化させるのは無駄に時間がかかるので。




手順

まずは、vue/config/index.jsで以下のパラメータをtrueにします。

vue/config/index.js

productionGzip: true,

これだけ見ると、もうgzipに圧縮できてしまいそうですよね。

意気揚々とこの状態で
npm run buildすると

Error: Cannot find module 'compression-webpack-plugin’

と早速エラーが。
エラー内容を見ると、compression-webpack-pluginのモジュールがないと言っていますね。
そういえばvue/config/index.jsのproductionGzipの上にもこんな文言が

// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin

compression-webpack-pluginをインストールしてって書いてましたね。

ということで、目的のモジュールをインストールします。

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


さあ、これで今度こそ大丈夫だろうと再度ビルドを実行してみると、
以下のようなエラーが

/********/src/main/vue/node_modules/compression-webpack-plugin/node_modules/schema-utils/src/validateOptions.js:32
    throw new ValidationError(ajv.errors, name);
    ^

ValidationError: Compression Plugin Invalid Options

options should NOT have additional properties

色々調べてみると、どうやらwebpackConfigのpluginsに設定の追加が必要らしく、webpack.prod.conf.jsに(webpack.base.conf.jsでも大丈夫です。環境によってどちらかに入れてください。)以下を追加しました。

webpack.prod.conf.js

// 上の方の変数宣言してるあたりに追加
var CompressionPlugin = require('compression-webpack-plugin’)



var webpackConfig = merge(baseWebpackConfig, {
     ・
     ・
     ・
  plugins: [
     ・
     ・
     ・
    new CompressionPlugin() // ここに追加
  ]
})

これで良いだろうと実行してみたのですが、再度上記と同じエラーが出ました。
なかなかうまくいきませんね。。。

ここはだいぶハマりましたが、解決法としては、先ほどインストールしたcompression-webpack-pluginのバージョンを下げれば上手くいきました。
ということで、2.0.0から1.1.11に下げてみます。
package.jsonの、

"compression-webpack-plugin": “^2.0.0”,

の箇所を

"compression-webpack-plugin": "^1.1.11”,

に変更し、以下コマンドの実行です。

npm install

さあ、これでビルドしてみましょう。

npm run buildの実行結果
npm run buildの実行結果

jsやcss、htmlのgzファイルが作られていることがわかりますね。
ついにgzip化に成功です!



サーバ側でgzipを読み込む設定にする

さて、みなさんご存知とは思いますが、gzip化できたと言っても、ただディレクトリ上にgzファイルが存在していれば読み込んでくれるというわけではありません。

ApacheやNginx、または.htaccessで、gzipファイルを読み込むよう設定する必要があるので、gzファイルができたからと言って安心せずにサーバ側の設定も変更してください。