webpack配置terser-webpack-plugin 去掉項(xiàng)目中多余的debugger

入門

如果你使用的是 webpack v5 或以上版本,你不需要安裝這個(gè)插件捂人。webpack v5 自帶最新的 terser-webpack-plugin。如果使用 webpack v4趟章,則必須安裝 terser-webpack-plugin v4 的版本慨默。

首先,你需要安裝 terser-webpack-plugin

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

然后將插件添加到你的 webpack 配置文件中耻瑟,直接在optimization中配置旨指。例如:

webpack.config.js

const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
    optimization: {
        minimize: true,
        minimizer: [new TerserPlugin({
            test: /\.js(\?.*)?$/i,    //匹配參與壓縮的文件
            parallel: true,    //使用多進(jìn)程并發(fā)運(yùn)行
            terserOptions: {    //Terser 壓縮配置
                output:{comments: false}
            },
            extractComments: true,    //將注釋剝離到單獨(dú)的文件中
                compress: {//console刪除
                    pure_funcs: ["console.log"]
                }
        })],
    },
};

選項(xiàng)

test

類型: String|RegExp|Array<String|RegExp> 默認(rèn)值:/\.m?js(\?.*)?$/i

用來匹配需要壓縮的文件。

webpack.config.js

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

include

類型: String|RegExp|Array<String|RegExp> 默認(rèn)值: undefined

匹配參與壓縮的文件喳整。

webpack.config.js

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

exclude

類型: String|RegExp|Array<String|RegExp> 默認(rèn)值: undefined

匹配不需要壓縮的文件谆构。

webpack.config.js

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

parallel

類型: Boolean|Number 默認(rèn)值: true

使用多進(jìn)程并發(fā)運(yùn)行以提高構(gòu)建速度。 并發(fā)運(yùn)行的默認(rèn)數(shù)量: os.cpus().length - 1 框都。

并發(fā)運(yùn)行可以顯著提高構(gòu)建速度搬素,因此強(qiáng)烈建議添加此配置

如果你使用 Circle CI 或任何其他不提供 CPU 實(shí)際可用數(shù)量的環(huán)境瞬项,則需要顯式設(shè)置 CPU 數(shù)量蔗蹋,以避免 Error: Call retries were exceeded(請(qǐng)參閱 #143#202 )囱淋。

Boolean

啟用/禁用多進(jìn)程并發(fā)運(yùn)行功能猪杭。

webpack.config.js

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

Number

啟用多進(jìn)程并發(fā)運(yùn)行并設(shè)置并發(fā)運(yùn)行次數(shù)。

webpack.config.js

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

minify

類型: Function 默認(rèn)值: undefined

允許你自定義壓縮函數(shù)妥衣。 默認(rèn)情況下皂吮,插件使用 terser 庫(kù)。 對(duì)于使用和測(cè)試未發(fā)布的版本或 fork 的代碼很幫助税手。

?? 啟用 parallel 選項(xiàng)時(shí)蜂筹,在 minify 函數(shù)內(nèi)部只能使用 require

webpack.config.js

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          myCustomOption: true,
        },
        // Can be async
        minify: (file, sourceMap, minimizerOptions) => {
          // The `minimizerOptions` option contains option from the `terserOptions` option
          // You can use `minimizerOptions.myCustomOption`
          const extractedComments = [];

          // Custom logic for extract comments

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

          return { map, code, extractedComments };
        },
      }),
    ],
  },
};

terserOptions

類型: Object 默認(rèn)值: 默認(rèn)

Terser 壓縮配置 芦倒。

webpack.config.js

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,
        },
      }),
    ],
  },
};

extractComments

類型: Boolean|String|RegExp|Function<(node, comment) -> Boolean|Object>|Object 默認(rèn)值: true

是否將注釋剝離到單獨(dú)的文件中(請(qǐng)參閱詳細(xì)信息)艺挪。 默認(rèn)情況下,僅剝離 /^\**!|@preserve|@license|@cc_on/i 正則表達(dá)式匹配的注釋兵扬,其余注釋會(huì)刪除麻裳。 如果原始文件名為 foo.js 口蝠,則注釋將存儲(chǔ)到 foo.js.LICENSE.txtterserOptions.format.comments 選項(xiàng)指定是否保留注釋津坑,即可以在剝離其他注釋時(shí)保留一些注釋妙蔗,甚至保留已剝離的注釋。

Boolean

啟用/禁用剝離注釋功能疆瑰。

webpack.config.js

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

String

剝離 allsome (使用 /^\**!|@preserve|@license|@cc_on/i 正則表達(dá)式進(jìn)行匹配)注釋眉反。

webpack.config.js

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

RegExp

與指定表達(dá)式匹配的所有注釋將會(huì)被剝離到單獨(dú)的文件中。

webpack.config.js

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

Function<(node, comment) -> Boolean> {#functionnode-comment --- boolean} {#functionnode-comment---boolean-#functionnode-comment-----boolean}

與指定表達(dá)式匹配的所有注釋將會(huì)被剝離到單獨(dú)的文件中穆役。

webpack.config.js

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

          return false;
        },
      }),
    ],
  },
};

Object

允許自定義剝離注釋的條件寸五,指定剝離的文件名和標(biāo)題。

webpack.config.js

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}`;
          },
        },
      }),
    ],
  },
};
condition

類型: Boolean|String|RegExp|Function<(node, comment) -> Boolean|Object>

自定義需要?jiǎng)冸x的注釋孵睬。

webpack.config.js

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}`;
          },
        },
      }),
    ],
  },
};
filename

類型: String|Function<(string) -> String> 默認(rèn)值: [file].LICENSE.txt [query]

可用的占位符: [file] 播歼, [query][filebase] (webpack 5 使用 [base] )。

剝離出來的注釋將被存儲(chǔ)到的文件的文件名掰读。 默認(rèn)是將后綴 .LICENSE.txt 附加到原始文件名。

??我們強(qiáng)烈建議使用 txt 擴(kuò)展名叭莫。

使用 js / cjs / mjs 擴(kuò)展名可能會(huì)與現(xiàn)有資源文件沖突蹈集,從而導(dǎo)致代碼運(yùn)行出錯(cuò)。

webpack.config.js

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}`;
          },
        },
      }),
    ],
  },
};
banner

類型: Boolean|String|Function<(string) -> String> 默認(rèn)值: /*! For license information please see ${commentsFile} */

指向剝離文件的標(biāo)語(yǔ)文本將被添加到原始文件的頂部雇初。 可以為 false (無標(biāo)題)拢肆, String 或一個(gè)函數(shù):Function<(string) -> String> ,該函數(shù)將被使用存儲(chǔ)剝離的注釋的文件名來調(diào)用靖诗。 標(biāo)語(yǔ)內(nèi)容將被合并到注釋中郭怪。

webpack.config.js

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}`;
          },
        },
      }),
    ],
  },
};

示例

保留注釋

剝離所有有效的注釋(即 /^\**!|@preserve|@license|@cc_on/i )并保留 /@license/i 注釋。

webpack.config.js

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

刪除注釋

如果要在構(gòu)建時(shí)去除注釋刊橘,請(qǐng)使用以下配置:

webpack.config.js

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

自定義壓縮函數(shù)

覆蓋默認(rèn)的 minify 函數(shù) - 使用 uglify-js 進(jìn)行壓縮鄙才。

webpack.config.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);
        },
      }),
    ],
  },
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市促绵,隨后出現(xiàn)的幾起案子攒庵,更是在濱河造成了極大的恐慌,老刑警劉巖败晴,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓冒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尖坤,警方通過查閱死者的電腦和手機(jī)稳懒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慢味,“玉大人场梆,你說我怎么就攤上這事墅冷。” “怎么了辙谜?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵俺榆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我装哆,道長(zhǎng)罐脊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任蜕琴,我火速辦了婚禮萍桌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凌简。我一直安慰自己上炎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布雏搂。 她就那樣靜靜地躺著藕施,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凸郑。 梳的紋絲不亂的頭發(fā)上裳食,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音芙沥,去河邊找鬼诲祸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛而昨,可吹牛的內(nèi)容都是我干的救氯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歌憨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼着憨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躺孝,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤享扔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后植袍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧眠,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年于个,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氛魁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秀存,靈堂內(nèi)的尸體忽然破棺而出捶码,到底是詐尸還是另有隱情,我是刑警寧澤或链,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布惫恼,位于F島的核電站,受9級(jí)特大地震影響澳盐,放射性物質(zhì)發(fā)生泄漏祈纯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一叼耙、第九天 我趴在偏房一處隱蔽的房頂上張望腕窥。 院中可真熱鬧,春花似錦筛婉、人聲如沸簇爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)入蛆。三九已至,卻和暖如春硕勿,著一層夾襖步出監(jiān)牢的瞬間安寺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工首尼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人言秸。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓软能,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親举畸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子查排,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容