该插件使用 terser 来压缩 JavaScript

webpack v5 开箱即带有最新版本的 terser-webpack-plugin。如果你使用的是 webpack v5 或更高版本,同时希望自定义配置,那么仍需要安装 terser-webpack-plugin。如果使用 webpack v4,则必须安装 terser-webpack-plugin v4 的版本。

  1. const TerserPlugin = require("terser-webpack-plugin");
  2. module.exports = {
  3. optimization: {
  4. minimize: true,
  5. minimizer: [new TerserPlugin({
  6. extractComments: false,
  7. })],
  8. },
  9. };

属性

test

用来匹配需要压缩的文件。

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. minimizer: [
  5. new TerserPlugin({
  6. test: /\.js(\?.*)?$/i,
  7. }),
  8. ],
  9. },
  10. };

include

匹配参与压缩的文件

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. minimizer: [
  5. new TerserPlugin({
  6. include: /\/includes/,
  7. }),
  8. ],
  9. },
  10. };

exclude

匹配不需要压缩的文件

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. minimizer: [
  5. new TerserPlugin({
  6. exclude: /\/excludes/,
  7. }),
  8. ],
  9. },
  10. };

parallel

使用多进程并发运行以提高构建速度。 并发运行的默认数量: os.cpus().length - 1 。

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. minimizer: [
  5. new TerserPlugin({
  6. parallel: true // 4,
  7. }),
  8. ],
  9. },
  10. };

terserOptions

Terser 配置项

  1. module.exports = {
  2. optimization: {
  3. minimize: true,
  4. minimizer: [
  5. new TerserPlugin({
  6. terserOptions: {
  7. ecma: undefined,
  8. parse: {},
  9. compress: {},
  10. mangle: true, // Note `mangle.properties` is `false` by default.
  11. module: false,
  12. // Deprecated
  13. output: null,
  14. format: null,
  15. toplevel: false,
  16. nameCache: null,
  17. ie8: false,
  18. keep_classnames: undefined,
  19. keep_fnames: false,
  20. safari10: false,
  21. },
  22. }),
  23. ],
  24. },
  25. };

extractComments

  1. 是否将注释剥离到单独的文件中
  1. const TerserPlugin = require("terser-webpack-plugin");
  2. module.exports = {
  3. optimization: {
  4. minimize: true,
  5. minimizer: [new TerserPlugin({
  6. extractComments: false,
  7. })],
  8. },
  9. };

minify

允许你自定义压缩函数。 默认情况下,插件使用 terser 库。 对于使用和测试未发布的版本或 fork 的代码很帮助。
⚠️ 启用 parallel 选项时,在 minify 函数内部只能使用 __require

  1. const minify = (input, sourceMap, minimizerOptions, extractsComments) => {
  2. const { map, code } = require("uglify-module") // Or require('./path/to/uglify-module')
  3. .minify(input, {
  4. });
  5. return { map, code, warnings: [], errors: [], extractedComments: [] };
  6. };
  7. minify.getMinimizerVersion = () => {
  8. let packageJson;
  9. try {
  10. packageJson = require("uglify-module/package.json");
  11. } catch (error) {
  12. // Ignore
  13. }
  14. return packageJson && packageJson.version;
  15. };
  16. new TerserPlugin({
  17. terserOptions: {
  18. myCustomOption: true,
  19. },
  20. minify,
  21. }),

使用

功能

  1. 移除console.log
  2. 移除debugger
  3. 不将注释剥离到单独的文件中
    1. module.exports = {
    2. optimization: {
    3. minimize: true,
    4. minimizer: [
    5. new TerserPlugin({
    6. drop_console: true,
    7. drop_debugger: true,
    8. pure_funcs: ['console.log'],
    9. extractComments:false
    10. }),
    11. ],
    12. },
    13. };