TerserWebpackPlugin详解

一、简单实用

注:此文章来自于github翻译来,仅供参考,具体配置需要结合自己的技术框架配置(vue/react等)


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


new TerserPlugin({
       test: /\.js(\?.*)?$/i,   //用来匹配需要压缩的文件
       include: /\/includes/,   //匹配参与压缩的文件。
       exclude: /\/excludes/,   //匹配不需要压缩的文件
       cache: true,//降版本后添加
       sourceMap: false,//降版本后添加
       parallel: true,//使用多进程并发运行以提高构建速度。 并发运行的默认数量: os.cpus().length - 1 。
       extractComments: true, //是否将注释剥离到单独的文件中,默认值: true
       terserOptions: {
         ecma: undefined,
         warnings: false,
         parse: {},
         compress: {
           drop_console: true,
           drop_debugger: false,
           pure_funcs: ['console.log'], // 移除console
         },
       },
}),
terserOptions配置
terserOptions: {
//默认未定义)-通过5、2015、2016等来覆盖压缩和格式化的ecma选项
ecma: undefined,

//如果您希望指定一些额外的解析选项,则传递一个对象。
parse: {},

//default{})--传递false可完全跳过压缩。传递一个对象以指定自定义压缩选项。
compress: {},

//默认为true)--传递false以跳过篡改名称,或者传递对象以指定篡改选项(请参见下文)。
mangle: true, // Note `mangle.properties` is `false` by default.

(默认值false)--在缩小ES6模块时使用。“use strict”是隐含的,名称可以在顶部范围内被篡改。如果启用了压缩或损毁,则将启用顶级选项。
module: false,

// Deprecated
//format或output(默认为null)--如果希望指定其他格式选项,则传递一个对象。默认值经过优化以获得最佳压缩效果。
output: null,
format: null,

//(默认为false)-如果希望启用顶级变量和函数名称篡改并删除未使用的变量和函数,请设置为true。
toplevel: false,

//nameCache(默认为null)-如果希望在多个minify()调用之间缓存损坏的变量和属性名称,请传递一个空对象{}或以前使用过的nameCache对象。注意:这是一个读/写属性。minivy()将读取此对象的名称缓存状态,并在缩小过程中对其进行更新,以便用户可以重用或从外部持久化它。
nameCache: null,

//(默认为false)-设置为true以支持IE8。
ie8: false,

//(默认值:undefined)-传递true以防止丢弃或损坏类名。传递一个正则表达式以仅保持类名与该正则表达式匹配。
keep_classnames: undefined,

//keep_names(默认值:false)-传递true以防止丢弃或损坏函数名。传递一个正则表达式以仅保持函数名与该正则表达式匹配。对于依赖Function.prototype.name的代码很有用。如果未定义顶级迷你选项keep_classnames,则它将被顶级迷你选项keep_names的值覆盖。
keep_fnames: false,

//safari10(默认值:false)-传递true以解决循环范围和等待中的Safari 10/11错误。有关详细信息,请参阅safari10的mangle和format选项。
safari10: false,
},
terserOptions ------ compress配置
defaults(默认值:true)--传递false可禁用大多数默认启用的压缩转换。当您只想启用几个压缩选项而禁用其余选项时,这很有用。

arrows(默认值:true)--如果生成的代码更短,则类和对象文字方法也将转换为箭头表达式:m(){return x}变为m:()=>x。要对不使用this或参数的常规ES5函数执行此操作,请参见unsaf_arrows。

arguments(默认值:false)--尽可能将arguments[index]替换为函数参数名称。

booleans(默认值:true)--对布尔上下文的各种优化,例如!!一b:c→ 一b:c
booleans_as_tegers(默认值:false)--将布尔值转换为0和1,并使用==和!=与布尔值进行比较而不是===和!===。

collapse_vars(默认值:true)--在允许副作用的情况下,折叠一次性非常量变量。

comparisons(默认值:true)--对二进制节点应用某些优化,例如!a ____ b→ a>b(仅当unsaf_comps时),尝试否定二进制节点,例如a=!bcde→ 一(b||c||d||e)等。注意:启用lhs_constants时比较效果最佳。

computed_props(默认值:true)--将常量计算属性转换为常规属性:{[“computed”]:1}转换为{computed:1}。

conditionals(默认值:true)--对if-s和条件表达式应用优化

dead_code(默认值:true)--删除无法访问的代码
指令(默认值:true)--删除冗余或非标准指令

drop_console(默认值:false)--传递true可放弃对console.*函数的调用。如果你只想丢弃console的一部分,你可以传递一个像这样的数组['log','info'],它只会丢弃console.log、console.info。

drop_debug(默认值:true)—删除调试器;声明

ecma(默认值:5)--通过2015或更高版本以启用压缩选项,将ES5代码转换为更小的ES6+等效形式。

evaluate(默认值:true)--尝试对常量表达式求值

expression(默认值:false)--传递true以保留终端语句的完成值而不返回,例如在bookmarklets中。

global_defs(默认值:{})--请参阅条件编译
提升函数声明
提升_props(默认值:true)--将属性从常量对象和数组文字提升到受一组约束的正则变量中。例如:var o={p:1,q:2};f(o.p,o.q);被转换为f(1,2);。注意:如果启用了mangle,压缩选项设置为2或更高,并且压缩选项为top level,则井道_props的工作效果最好。
提升var(默认值:false)--提升var声明(默认情况下这是false,因为它通常会增加输出的大小)
if_return(默认值:true)--if/return和if/contence的优化
inline(默认值:true)--使用简单/return语句对函数进行内联调用:
false--与0相同
0--已禁用内联
1——内联简单函数
2——带参数的内联函数
3——带参数和变量的内联函数
true——与3相同

join_vars(默认值:true)--连接连续的var、let和const语句

keep_classnames(默认值:false)--传递true以防止压缩器丢弃类名。传递一个正则表达式以仅保持类名与该正则表达式匹配。另请参见:keep_classnames mangle选项。

keep_args(默认值:true)--防止压缩器丢弃未使用的函数参数。对于依赖Function.length的代码,您需要这样做。

keep_names(默认值:false)--传递true以防止压缩器丢弃函数名。传递一个正则表达式以仅保持函数名与该正则表达式匹配。对于依赖Function.prototype.name的代码很有用。另请参阅:keep_names-mangle选项。

keep_infinity(默认值:false)--传递true以防止infinity被压缩为1/0,这可能会导致Chrome上的性能问题。

lhs_constants(默认值:true)--将常数值移动到二进制节点的左侧。foo==42→ 42==foo
循环(默认值:true)——当我们可以静态地确定条件时,对do、while和for循环进行优化。

module(默认为false)--压缩ES6模块时传递true。严格模式是隐含的,顶层选项也是隐含的。

never_iife(默认值:true)--否定“立即调用的函数表达式”,其中丢弃返回值,以避免代码生成器插入parens。

passs(默认值:1)--运行压缩的最大次数。在某些情况下,多次传递会导致进一步压缩的代码。记住,更多的传球需要更多的时间。

properties(默认值:true)--使用点表示法重写属性访问,例如foo[“bar”]→ foo.bar

pure_funcs(默认值:null)——您可以传递一个名称数组,Terser将假设这些函数不会产生副作用。危险:不会检查名称是否在作用域中重新定义。这里有一个例子,例如var q=Math.floor(a/b)。如果变量q没有在其他地方使用,Terser会删除它,但仍会保留Math.floom(a/b。您可以传递pure_funcs:['Math.floor'],让它知道这个函数不会产生任何副作用,在这种情况下,整个语句将被丢弃。当前的实现增加了一些开销(压缩会更慢)。

pure_getters(默认值:“strict”)——如果您为此传递true,Terser将假设对象属性访问(例如foo.bar或foo[“bar”])没有任何副作用。指定“strict”,仅当foo确定不抛出时(即不为null或未定义),才将foo.bar视为无副作用。

pure_new(默认值:false)--设置为true以假设new X()从不产生副作用。

reduce_vars(默认值:true)--改进使用常数值分配和用作常数值的变量的优化。

reduce_funcs(默认值:true)--尽可能内联一次性函数。取决于是否启用reduce_vars。禁用此选项有时会提高输出代码的性能。

sequences(默认值:true)--使用逗号运算符连接连续的简单语句。可以设置为正整数,以指定将生成的连续逗号序列的最大数目。如果此选项设置为true,则默认序列限制为200。将选项设置为false或0以禁用。最小序列长度为2。1的序列值被认为等价于真,因此意味着200。在极少数情况下,默认序列限制会导致压缩时间非常慢,在这种情况下,建议使用20或更小的值。

side_effects(默认值:true)--删除没有副作用且未使用其结果的表达式。

switchs(默认值:true)--消除重复并删除无法访问的交换机分支

toplevel(默认值:false)--删除顶级作用域中的未引用函数(“funcs”)和/或变量(“vars”)(默认值为false,true用于删除未引用函数和变量)

top_retain(默认值:null)--防止特定的顶层函数和变量被未使用的删除(可以是数组、逗号分隔、RegExp或函数。暗示顶层)

typeofs(默认值:true)--将typeoffoo==“undefined”转换为foo==void 0。注意:由于已知问题,建议将IE10及更早版本的此值设置为false。

unsafe(默认值:false)--应用“不安全”转换(详细信息)。

unsaf_arrows(默认值:false)--如果函数体没有引用ES5风格的匿名函数表达式,则将其转换为箭头函数。注意:若代码依赖于有原型的函数,而箭头函数并没有原型,那个么执行这种转换并不总是安全的。此转换要求ecma压缩选项设置为2015或更大。

unsaf_comps(默认值:false)--将<和<=反转为>和>=以改进压缩。当两个操作数中的至少一个操作数是具有计算值的对象时,由于使用了get或valueOf等方法,这可能是不安全的。这可能会导致比较中的操作数切换后执行顺序发生变化。只有当comparisons和unsaf_comps都设置为true时,压缩才有效。

unsaf.Function(默认值:false)--当参数和代码都是字符串文字时,压缩并损坏函数(参数,代码)。

unsaf.math(默认值:false)--将2*x*3等数字表达式优化为6*x,这可能会产生不精确的浮点结果。

unsaf_symbols(默认值:false)--从本机Symbol声明中删除键,例如Symbol(“kDog”)变成Symbol()。

unsaf.methods(默认值:false)--将{m:function(){}}转换为{m(){}}。ecma必须设置为6或更大才能启用此转换。如果unsaf_methods是RegExp,那么具有与RegExp匹配的键的键/值对将被转换为简明方法。注意:如果启用,则在任何代码尝试新建前一个函数时,都有获得“<method name>不是构造函数”TypeError的风险。

unsaf.proto(默认值:false)--将Array.prototype.stice.call(a)等表达式优化为[].stice.call(a)

unsaf.regexp(默认值:false)--启用用regexp值替换变量的方式与它们是常量的方式相同。

unsafe.undefined(默认值:false)--如果作用域中有一个名为undefine的变量,则替换void 0(变量名将被破坏,通常减少为一个字符)

unused 用(默认值:true)--删除未引用的函数和变量(简单的直接变量赋值不算作引用,除非设置为“keep_assign”)
terserOptions ------ format配置
ascii_only(默认为false)--转义字符串和regexp中的Unicode字符(影响非ascii字符无效的指令)

beautify(默认为false)--(已弃用)是否美化输出。使用旧式-b CLI标志时,默认情况下会将其设置为true。

braces (默认为false)--始终在if、for、do、while或with语句中插入大括号,即使它们的主体是单个语句。

comments(默认为“some”)--默认情况下,它保留JSDoc样式的注释,这些注释包含“@license”、“@copyright”、“@preserve”或以!开头!,传递true或“all”以保留所有注释,传递false以省略输出中的注释,传递正则表达式字符串(例如/^!/)或函数。

ecma(默认值5)--为输出设置所需的EcmaScript标准版本。将ecma设置为2015或更高版本以发出简写对象属性,即:{a}而不是{a:a}。ecma选项只会在美化器的直接控制下更改输出。输入中的不兼容功能仍将按原样输出。例如:ecma设置为5不会将现代代码转换为ES5。

indent_level(默认值4)

indent_start(默认为0)--在所有行前面加上那么多空格

inline_script(默认为true)--转义HTML注释和字符串中出现时的斜杠

keep_numbers(默认为false)--保持原始代码中的数字文本不变(禁用优化,如将1000000转换为1e6)

keep_quoted_props(默认为false)--启用时,防止从对象文字中的属性名称中剥离引号。

max_line_len(默认为false)--最大行长度(用于缩小的代码)

preamble(默认为null)——当传递时,它必须是一个字符串,并且它将在输出前加上前缀。源地图将为此文本进行调整。例如,可用于插入包含许可信息的注释。

quote_keys(默认为false)--传递true以引用文字对象中的所有键

quote_style(默认为0)--字符串的首选引号样式(也影响引用的属性名和指令):
0--首选双引号,当字符串本身中有更多双引号时切换到单引号。0最适合gzip大小。
1--始终使用单引号
2-总是使用双引号
3——始终使用原始引号

preserve_annotations--(默认为false)--在输出中保留Terser注释。

safari10(默认为false)--将此选项设置为true以解决Safari 10/11等待错误。另请参阅:safari10 mangle选项。

semicolons (默认为true)--用分号分隔语句。如果您传递false,那么我们将尽可能使用换行符而不是分号,从而使缩小后的代码输出更可读(gzip之前的大小可能更小;gzip之后的大小可能更大)。

shebang(默认为true)--保留shebang#!在序言中(bash脚本)

spidermonkey(默认为false)--生成Spidermankey(Mozilla)AST

webkit(默认为false)--启用webkit错误的解决方法。PhantomJS用户应将此选项设置为true。

wrap_iife(默认为false)—传递true以包装立即调用的函数表达式。请参阅#640了解更多详细信息。

wrap_func_args(默认为true)—如果不想将作为参数传递的函数表达式包装在括号中,则传递false。有关更多详细信息,请参阅OptimizeJS。

你可能感兴趣的:(web性能优化,webpack)