フロントエンドの注意事項 - TerserWebpackPlugin の構成

1. 参考資料

TerserWebpackPlugin リファレンス ドキュメント

2.インストール

npm install terser-webpack-plugin --save-dev

3. Webpackの構成例

webpack.config.js

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

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
};

4. オプションの説明

オプション名 タイプ デフォルト 説明
テスト 文字列|正規表現|配列<文字列|正規表現> /.m?js(?.*)?$/i 圧縮する必要があるファイルを一致させるために使用されます。
含む 文字列|正規表現|配列<文字列|正規表現> 未定義 圧縮に参加したファイルと一致します。
除外する 文字列|正規表現|配列<文字列|正規表現> 未定義 圧縮する必要のないファイルに一致します。
平行 ブール値|数値 真実 複数のプロセスを同時に実行してビルド速度を向上させます。
縮小する 関数 TerserPlugin.terserMinify 圧縮機能をカスタマイズできます。
ターサーオプション 物体 デフォルト Terser の縮小オプション。
コメントの抽出 Boolean|String|RegExp|Function<(node, comment) -> Boolean|Object>|Object 真実 コメントを別のファイルに抽出する必要があるかどうか。

5. パラメータの使用例

5.1 テスト

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        test: /\.js(\?.*)?$/i,
      }),
    ],
  },
};

5.2 を含む

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        include: /\/includes/,
      }),
    ],
  },
};

5.3 除外する

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        exclude: /\/excludes/,
      }),
    ],
  },
};

5.4パラレル

5.4.1 ブール値

複数プロセス同時実行機能の有効/無効を設定します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true,
      }),
    ],
  },
};
5.4.2 数値

複数のプロセスの同時実行を有効にし、同時実行の数を設定します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: 4,
      }),
    ],
  },
};

5.5 縮小

並列オプションが有効な場合、minify 関数内で使用できるのは require のみです。

// Can be async
const minify = (input, sourceMap, minimizerOptions, extractsComments) => {
  // The `minimizerOptions` option contains option from the `terserOptions` option
  // You can use `minimizerOptions.myCustomOption`

  // Custom logic for extract comments
  const { map, code } = require("uglify-module") // Or require('./path/to/uglify-module')
    .minify(input, {
      /* Your options for minification */
    });

  return { map, code, warnings: [], errors: [], extractedComments: [] };
};

// Used to regenerate `fullhash`/`chunkhash` between different implementation
// Example: you fix a bug in custom minimizer/custom function, but unfortunately webpack doesn't know about it, so you will get the same fullhash/chunkhash
// to avoid this you can provide version of your custom minimizer
// You don't need if you use only `contenthash`
minify.getMinimizerVersion = () => {
  let packageJson;

  try {
    // eslint-disable-next-line global-require, import/no-extraneous-dependencies
    packageJson = require("uglify-module/package.json");
  } catch (error) {
    // Ignore
  }

  return packageJson && packageJson.version;
};

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          myCustomOption: true,
        },
        minify,
      }),
    ],
  },
};

5.6 ターサーオプション

簡潔な構成アイテム

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          ecma: undefined,
          parse: {},
          compress: {},
          mangle: true, // Note `mangle.properties` is `false` by default.
          module: false,
          // Deprecated
          output: null,
          format: null,
          toplevel: false,
          nameCache: null,
          ie8: false,
          keep_classnames: undefined,
          keep_fnames: false,
          safari10: false,
        },
      }),
    ],
  },
};

5.7 コメントの抽出

5.7.1 ブール値

コメントの削除を有効/無効にします。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: true,
      }),
    ],
  },
};
5.7.2 文字列

すべてまたは一部のコメント (/^**!|@preserve|@license|@cc_on/i 正規表現と一致) を削除します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: "all",
      }),
    ],
  },
};
5.7.3 正規表現

指定された式に一致するすべてのコメントは、別のファイルに取り除かれます。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: /@extract/i,
      }),
    ],
  },
};
5.7.4 関数<(ノード, コメント) -> ブール値>

指定された式に一致するすべてのコメントは、別のファイルに取り除かれます。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: (astNode, comment) => {
          if (/@extract/i.test(comment.value)) {
            return true;
          }

          return false;
        },
      }),
    ],
  },
};
5.7.5 オブジェクト

コメントを削除する条件をカスタマイズしたり、削除するファイル名やタイトルを指定したりできます。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: {
          condition: /^\**!|@preserve|@license|@cc_on/i,
          filename: (fileData) => {
            // The "fileData" argument contains object with "filename", "basename", "query" and "hash"
            return `${fileData.filename}.LICENSE.txt${fileData.query}`;
          },
          banner: (licenseFile) => {
            return `License information can be found in ${licenseFile}`;
          },
        },
      }),
    ],
  },
};
5.7.6 条件

削除する必要がある注釈をカスタマイズします。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: {
          condition: "some",
          filename: (fileData) => {
            // The "fileData" argument contains object with "filename", "basename", "query" and "hash"
            return `${fileData.filename}.LICENSE.txt${fileData.query}`;
          },
          banner: (licenseFile) => {
            return `License information can be found in ${licenseFile}`;
          },
        },
      }),
    ],
  },
};
5.7.7 ファイル名

js / cjs / mjs 拡張機能を使用すると、既存のリソース ファイルと競合し、コードが正しく実行されない可能性があります。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: {
          condition: /^\**!|@preserve|@license|@cc_on/i,
          filename: "extracted-comments.js",
          banner: (licenseFile) => {
            return `License information can be found in ${licenseFile}`;
          },
        },
      }),
    ],
  },
};
5.7.8 バナー

ストリップされたファイルを指すバナー テキストが、元のファイルの上に追加されます。false (タイトルなし)、String、または関数 Function<(string) -> String> を指定できます。これは、削除されたコメントが保存されているファイル名で呼び出されます。キャッチフレーズの内容はメモに組み込まれます。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        extractComments: {
          condition: true,
          filename: (fileData) => {
            // The "fileData" argument contains object with "filename", "basename", "query" and "hash"
            return `${fileData.filename}.LICENSE.txt${fileData.query}`;
          },
          banner: (commentsFile) => {
            return `My custom banner about license information ${commentsFile}`;
          },
        },
      }),
    ],
  },
};

6. クイック設定

6.1 コメントを保存する

すべての有効なコメント (つまり、 /^**!|@preserve|@license|@cc_on/i ) を削除し、 /@license/i コメントを保持します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          format: {
            comments: /@license/i,
          },
        },
        extractComments: true,
      }),
    ],
  },
};

6.2 コメントの削除

ビルド時にコメントを削除する場合は、次の構成を使用します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          format: {
            comments: false,
          },
        },
        extractComments: false,
      }),
    ],
  },
};

6.3 uglify-js

UglifyJS は、JavaScript パーサー、コンプレッサー、およびビューティファイアーを 1 つのツール セットにまとめたものです。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        minify: TerserPlugin.uglifyJsMinify,
        // `terserOptions` options will be passed to `uglify-js`
        // Link to options - https://github.com/mishoo/UglifyJS#minify-options
        terserOptions: {},
      }),
    ],
  },
};

6.4 スイッチ

swc は Rust で書かれた超高速コンパイラで、最新の標準および TypeScript 構文から広く使用されている JavaScript を生成できます。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        minify: TerserPlugin.swcMinify,
        // `terserOptions` options will be passed to `swc` (`@swc/core`)
        // Link to options - https://swc.rs/docs/config-js-minify
        terserOptions: {},
      }),
    ],
  },
};

6.5エスビルド

esbuild は、非常に高速な JavaScript バンドラーおよびミニファイアーです。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        minify: TerserPlugin.esbuildMinify,
        // `terserOptions` options will be passed to `esbuild`
        // Link to options - https://esbuild.github.io/api/#minify
        // Note: the `minify` options is true by default (and override other `minify*` options), so if you want to disable the `minifyIdentifiers` option (or other `minify*` options) please use:
        // terserOptions: {
        //   minify: false,
        //   minifyWhitespace: true,
        //   minifyIdentifiers: false,
        //   minifySyntax: true,
        // },
        terserOptions: {},
      }),
    ],
  },
};

6.6 カスタム圧縮機能

デフォルトの minify 関数をオーバーライドします - 縮小には uglify-js を使用します。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        minify: (file, sourceMap) => {
          // https://github.com/mishoo/UglifyJS2#minify-options
          const uglifyJsOptions = {
            /* your `uglify-js` package options */
          };

          if (sourceMap) {
            uglifyJsOptions.sourceMap = {
              content: sourceMap,
            };
          }

          return require("uglify-js").minify(file, uglifyJsOptions);
        },
      }),
    ],
  },
};

6.7 タイプスクリプト

6.7.1 デフォルトのターサー圧縮機能の使用
module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          compress: true,
        },
      }),
    ],
  },
};
6.7.2 組み込みの圧縮関数の使用
import type { JsMinifyOptions as SwcOptions } from "@swc/core";
import type { MinifyOptions as UglifyJSOptions } from "uglify-js";
import type { TransformOptions as EsbuildOptions } from "esbuild";
import type { MinifyOptions as TerserOptions } from "terser";

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin<SwcOptions>({
        minify: TerserPlugin.swcMinify,
        terserOptions: {
          // `swc` options
        },
      }),
      new TerserPlugin<UglifyJSOptions>({
        minify: TerserPlugin.uglifyJsMinify,
        terserOptions: {
          // `uglif-js` options
        },
      }),
      new TerserPlugin<EsbuildOptions>({
        minify: TerserPlugin.esbuildMinify,
        terserOptions: {
          // `esbuild` options
        },
      }),

      // Alternative usage:
      new TerserPlugin<TerserOptions>({
        minify: TerserPlugin.terserMinify,
        terserOptions: {
          // `terser` options
        },
      }),
    ],
  },
};

7. 説明

  1. このドキュメントは、私がTerserWebpackPluginを学習したときの記録のみを目的としており、今後の検索を容易にするための記録として使用されます。
  2. より完全なドキュメントについては、TerserWebpackPluginを参照してください。

おすすめ

転載: blog.csdn.net/m0_38082783/article/details/130739726