Skip to content
⚠️ This article was written in 2019. Some content may be outdated.

Webpack 4のコード圧縮と最適化

Webpack 4のコード圧縮と最適化に関する記事はネット上に多くありますが、実践的な経験を持つものは少ないです。本記事では実際のプロジェクトをベースにベストプラクティスを探ります。

TerserによるJavaScript圧縮

Webpack 4のプロダクションモードはデフォルトでTerserPluginを使用します:

javascript
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
  mode: "production",
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          compress: {
            drop_console: true, // console.logを削除
            drop_debugger: true, // debugger文を削除
            pure_funcs: ["console.log"],
          },
          mangle: true, // 変数名を難読化
          output: {
            comments: false, // コメントを削除
          },
        },
        extractComments: false, // コメントを別ファイルに抽出しない
      }),
    ],
  },
};

CSS圧縮

javascript
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, "css-loader"],
      },
    ],
  },
  plugins: [new MiniCssExtractPlugin({ filename: "[name].[contenthash].css" })],
  optimization: {
    minimizer: [new CssMinimizerPlugin()],
  },
};

バンドル分析

bash
# アナライザーをインストール
npm install --save-dev webpack-bundle-analyzer

# 統計ファイルを生成
webpack --profile --json > stats.json

# 可視化
npx webpack-bundle-analyzer stats.json
javascript
// またはプラグインを直接使用
const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");

module.exports = {
  plugins: [process.env.ANALYZE && new BundleAnalyzerPlugin()].filter(Boolean),
};

ANALYZE=true npm run buildを実行するとバンドルのビジュアルツリーマップが開きます——最適化の機会を見つけるための最初のステップです。

MIT Licensed