github 中文官方
介绍
适用于 ES6+ 的 JavaScript 压缩器/压缩工具包。
Terser 建议您使用 RollupJS 来捆绑您的模块,因为这样可以生成更小的代码。
安装
npm install terser -g
API 参考
const { minify } = require("terser");
或者
import { minify } from "terser";
使用方式 minify(当前需要压缩代码,option)
var code = "function add(first, second) { return first + second; }";
var result = await minify(code, { sourceMap: true });
console.log(result.code); // minified output: function add(n,d){return n+d}
option 配置
-
ecma :(默认值
undefined)-
参数:
5、 2015、 2016、 etc -
描述: 指定ECMAScript版本,注意:会覆盖
compress和format的ecma选项
-
-
enclose :(默认值
false)-
参数:
false、 true、 args[:values] -
描述: 函数中的 args 和 values 分别是以逗号分隔的参数名称和值,以将输出嵌入具有可配置参数和值的大函数中。
-
-
parse :(默认值
{})-
参数:
ParseOptions -
描述: 如果你希望指定一些额外的 解析选项,则传递一个对象。
-
-
compress :(默认值
{})-
参数:
false、 true|CompressOptions -
描述: 传递
false以完全跳过压缩。传递一个对象来指定自定义 压缩选项。
-
-
mangle :(默认值
true) -
module :(默认值
false)-
参数:
false、 true -
描述: 在最小化 ES6 模块时使用。隐含“use strict”,名称可以在顶层范围内进行修改。如果启用了 compress 或 mangle,则将启用 toplevel 选项
-
-
format or output :(默认值
null)-
参数:
FormatOptions -
描述: 如果你希望指定额外的压缩配置选项: Format options、(中文 Format options),则传递一个对象。默认值已针对最佳压缩进行了优化。
-
-
sourceMap :(默认值
false)-
参数:
false、 true|SourceMapOptions -
描述: 如果你想指定 源映射选项,请传递一个对象。
-
-
toplevel :(默认值
false)-
参数:
false、 true -
描述: 如果您希望启用顶级变量和函数名称修改并删除未使用的变量和函数,请设置为 true。
-
-
nameCache :(默认值
null)-
参数:
null|object -
描述: 如果你希望在多次调用
minify()时缓存混淆的变量和属性名称,请传递空对象{}或以前使用过的nameCache对象。注意:这是一个读/写属性。minify()将读取该对象的名称缓存状态并在压缩期间更新它,以便用户可以重用或在外部保留它
-
-
ie8 :(默认值
false)-
参数:
false、 true -
描述: 设置为
true以支持 IE8。
-
-
keep_classnames :(默认值
undefined)-
参数:
false、true|RegExp -
描述: 通过
true以防止丢弃或混淆类名。传递正则表达式以仅保留与该正则表达式匹配的类名。
-
-
keep_fnames :(默认值
false)-
参数:
false、true|RegExp -
描述: 通过
true以防止丢弃或修改函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称
-
-
safari10 :(默认值
false)-
参数:
false、true -
描述: 通过
true来解决 Safari 10/11 循环范围和await中的错误
-
Parse options [解析选项]
-
bare_returns(defaultfalse) -- 支持顶层return语句 -
html5_comments(defaulttrue) -
shebang(defaulttrue) -- 支持#!command作为第一行 -
spidermonkey(defaultfalse) -- 接受 Spidermonkey (Mozilla) AST
Compress options [压缩选项]
-
defaults(默认值:true) --- 传递
false以禁用大多数默认启用的compress转换。当你只想启用几个compress选项而禁用其余选项时很有用
- 传递
-
arrows(默认值:true) --- 如果生成的代码较短,则转换的类和对象字面量方法也将转换为箭头表达式:
m(){return x}变成m:()=>x。要对不使用this或arguments的常规 ES5 函数执行此操作,请参阅unsafe_arrows。
- 如果生成的代码较短,则转换的类和对象字面量方法也将转换为箭头表达式:
-
arguments(默认值:false) --- 尽可能将
arguments[index]替换为函数参数名称。
- 尽可能将
-
booleans(默认值:true) --- 布尔上下文的各种优化,例如
!!a ? b : c → a ? b : c
- 布尔上下文的各种优化,例如
-
booleans_as_integers(默认值:false) --- 将布尔值转换为 0 和 1,也使用
==和!=而不是===和!==与布尔值进行比较。
- 将布尔值转换为 0 和 1,也使用
-
collapse_vars(默认值:true) --- 在副作用允许的情况下,折叠一次性使用的非常量变量。
-
comparisons(默认值:true) --- 对二进制节点应用某些优化,例如
!(a <= b) → a > b(仅当unsafe_comps时),尝试否定二进制节点,例如a = !b && !c && !d && !e → a=!(b||c||d||e)等 注:comparisons在启用lhs_constants的情况下效果最佳。
- 对二进制节点应用某些优化,例如
-
computed_props(默认值:true) --- 将常量计算属性转换为常规属性:
{["computed"]: 1}转换为{computed: 1}。
- 将常量计算属性转换为常规属性:
-
conditionals(默认值:true) --- 对
if-s 和条件表达式应用优化
- 对
-
dead_code(默认值:true) --- 删除无法访问的代码
-
directives(默认值:true) --- 删除冗余或非标准指令
-
drop_console(默认值:false) --- 传递
true以放弃对console.*函数的调用。如果你只想丢弃控制台的一部分,你可以传递一个像['log', 'info']这样的数组,这样只会丢弃console.log、console.info。
- 传递
-
drop_debugger(默认值:true) --- 删除
debugger;语句
- 删除
-
ecma(默认值:5) --- 传递
2015或更高版本以启用compress选项,将 ES5 代码转换为更小的 ES6+ 等效形式。
- 传递
-
evaluate(默认值:true) --- 尝试计算常量表达式
-
expression(默认值:false) --- 传递
true以保留不带return的终端语句的完成值,例如 在小书签中。
- 传递
-
global_defs(默认值:{}) --- 参见 条件编译
-
hoist_funs(默认值:false) --- 提升机功能声明
-
hoist_props(默认值:true) --- 将常量对象和数组字面量中的属性提升到受一组约束约束的常规变量中。例如:
var o={p:1, q:2}; f(o.p, o.q);转换为f(1, 2);。注意:hoist_props在启用mangle、将compress选项passes设置为2或更高以及启用compress选项toplevel的情况下效果最佳。
- 将常量对象和数组字面量中的属性提升到受一组约束约束的常规变量中。例如:
-
hoist_vars(默认值:false) --- 提升
var声明(默认为false,因为它通常会增加输出的大小)
- 提升
-
if_return(默认值:true) --- if/return 和 if/ continue 的优化
-
inline(默认值:true) ---
使用 simple/
return语句内联调用函数:-
false- 与0相同 -
0- 禁用内联 -
1- 内联简单函数 -
2- 带参数的内联函数 -
3- 带有参数和变量的内联函数 -
true- 与3相同
-
-
-
join_vars(默认值:true) --- 连接连续的
var、let和const语句
- 连接连续的
-
keep_classnames(默认值:false) -- 传递
true以防止压缩器丢弃类名。传递正则表达式以仅保留与该正则表达式匹配的类名。也可以看看:keep_classnames混淆选项。
- 传递
-
keep_fargs(默认值:true) --- 防止压缩器丢弃未使用的函数参数。对于依赖
Function.length的代码,你需要这个。
- 防止压缩器丢弃未使用的函数参数。对于依赖
-
keep_fnames(默认值:false) --- 传递
true以防止压缩器丢弃函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称。对于依赖Function.prototype.name的代码很有用。也可以看看:keep_fnames混淆选项。
- 传递
-
keep_infinity(默认值:false) --- 传递
true以防止Infinity被压缩为1/0,这可能会导致 Chrome 上的性能问题。
- 传递
-
lhs_constants(默认值:true) --- 将常量值移动到二进制节点的左侧。
foo == 42 → 42 == foo
- 将常量值移动到二进制节点的左侧。
-
loops(默认值:true) --- 当我们可以静态确定条件时,对
do、while和for循环进行优化。
- 当我们可以静态确定条件时,对
-
module(默认值false) --- 压缩 ES6 模块时传递
true。隐含了严格模式以及toplevel选项。
- 压缩 ES6 模块时传递
-
negate_iife(默认值:true) --- 对 "立即调用函数表达式" 取反,其中返回值被丢弃,以避免代码生成器插入括号。
-
passes(默认值:1) --- 运行压缩的最大次数。在某些情况下,不止一次传递会导致进一步压缩代码。请记住,更多的传递将花费更多的时间。
-
properties(默认值:true) --- 使用点符号重写属性访问,例如
foo["bar"] → foo.bar
- 使用点符号重写属性访问,例如
-
pure_funcs(默认值:null) --- 你可以传递名称数组,Terser 会假设这些函数不会产生副作用。危险:不会检查名称是否在范围内重新定义。这里举一个例子,比如
var q = Math.floor(a/b)。如果变量q没有在其他地方使用,Terser 会删除它,但仍会保留Math.floor(a/b),但不知道它的作用。你可以传递pure_funcs: [ 'Math.floor' ]让它知道该函数不会产生任何副作用,在这种情况下整个语句将被丢弃。当前的实现增加了一些开销(压缩会更慢)。
- 你可以传递名称数组,Terser 会假设这些函数不会产生副作用。危险:不会检查名称是否在范围内重新定义。这里举一个例子,比如
-
pure_getters(默认值:"strict") --- 如果为此传递
true,Terser 将假定对象属性访问(例如foo.bar或foo["bar"])没有任何副作用。仅当foo确定不会抛出时(即不是null或undefined),才指定"strict"将foo.bar视为无副作用。
- 如果为此传递
-
pure_new(默认值:false) --- 设置为
true以假定new X()永远不会产生副作用。
- 设置为
-
reduce_vars(默认值:true) --- 改进对分配并用作常量值的变量的优化。
-
reduce_funcs(默认值:true) --
- 尽可能使用内联一次性函数。取决于 `reduce_vars` 是否启用。禁用此选项有时会提高输出代码的性能。
-
sequences(默认值:true) --- 使用逗号运算符连接连续的简单语句。可以设置为正整数以指定将生成的连续逗号序列的最大数量。如果此选项设置为
true,则默认sequences限制为200。将选项设置为false或0以禁用。最小的sequences长度是2。1的sequences值被继承为等于true,因此意味着200。在极少数情况下,默认序列限制会导致压缩时间非常慢,在这种情况下,建议使用20或更小的值。
- 使用逗号运算符连接连续的简单语句。可以设置为正整数以指定将生成的连续逗号序列的最大数量。如果此选项设置为
-
side_effects(默认值:true) --- 删除没有副作用且不使用其结果的表达式。
-
switches(默认值:true) --- 去重复并删除无法访问的
switch分支
- 去重复并删除无法访问的
-
toplevel(默认值:false) --- 删除顶层范围中未引用的函数 (
"funcs") 和/或变量 ("vars")(默认为false,true删除未引用的函数和变量)
- 删除顶层范围中未引用的函数 (
-
top_retain(默认值:null) --- 防止特定的顶层函数和变量从
unused删除(可以是数组、逗号分隔、RegExp 或函数。隐含toplevel)
- 防止特定的顶层函数和变量从
-
typeofs(默认值:true) --- 将
typeof foo == "undefined"转换为foo === void 0。注意:由于已知问题,对于 IE10 及更早版本,建议将此值设置为false。
- 将
-
unsafe(默认值:false) --- 应用 "unsafe" 转换 (details)。
-
unsafe_arrows(默认值:false) --- 如果函数体没有引用
this,则将 ES5 风格的匿名函数表达式转换为箭头函数。注意:如果代码依赖于具有prototype的函数(箭头函数缺少该函数),则执行此转换并不总是安全的。此转换要求将ecma压缩选项设置为2015或更大。
- 如果函数体没有引用
-
unsafe_comps(默认值:false) --- 将
<和<=反转为>和>=以改进压缩。当两个操作数中的至少一个是具有计算值的对象时,由于使用get或valueOf等方法,这可能是不安全的。这可能会导致比较中的操作数切换后执行顺序发生变化。仅当comparisons和unsafe_comps都设置为 true 时,压缩才起作用。
- 将
-
unsafe_Function(默认值:false) --- 当
args和code都是字符串字面量时,压缩和重整Function(args, code)。
- 当
-
unsafe_math(默认值:false) --- 将
2 * x * 3等数值表达式优化为6 * x,这可能会给出不精确的浮点结果。
- 将
-
unsafe_symbols(默认值:false) --- 从原生符号声明中删除键,例如
Symbol("kDog")变为Symbol()。
- 从原生符号声明中删除键,例如
-
unsafe_methods(默认值:false) --- 将
{ m: function(){} }转换为{ m(){} }。ecma必须设置为6或更大才能启用此转换。如果unsafe_methods是 RegExp,则键与 RegExp 匹配的键/值对将转换为简洁方法。注意:如果启用,则任何代码尝试对前一个函数进行new操作时,都会有出现“<method name>不是构造函数”TypeError 的风险
- 将
-
unsafe_proto(默认值:false) --- 将
Array.prototype.slice.call(a)等表达式优化为[].slice.call(a)
- 将
-
unsafe_regexp(默认值:false) --- 允许用
RegExp值替换变量,就像它们是常量一样。
- 允许用
-
unsafe_undefined(默认值:false) --- 如果作用域中有名为
undefined的变量,则替换void 0(变量名将被破坏,通常会缩减为单个字符)
- 如果作用域中有名为
-
unused(默认值:true) --- 删除未引用的函数和变量(简单的直接变量赋值不计为引用,除非设置为
"keep_assign")
- 删除未引用的函数和变量(简单的直接变量赋值不计为引用,除非设置为
Mangle options [混淆选项]
-
eval(默认值false) --- 将
true传递给在使用eval或with的范围内可见的 mangle 名称。
- 将
-
keep_classnames(默认值false) --- 传递
true以不破坏类名。传递正则表达式以仅保留与该正则表达式匹配的类名。也可以看看:keep_classnames压缩选项。
- 传递
-
keep_fnames(默认值false) --- 传递
true以不破坏函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称。对于依赖Function.prototype.name的代码很有用。也可以看看:keep_fnames压缩选项。
- 传递
-
module(默认值false) --- 将
true传递给 ES6 模块,其中顶层作用域不是全局作用域。暗示toplevel并假设输入代码是严格模式 JS。
- 将
-
reserved(默认值[]) --- 传递应从重整中排除的标识符数组。示例:
["foo", "bar"]。
- 传递应从重整中排除的标识符数组。示例:
-
toplevel(默认值false) --- 将
true传递给顶层范围中声明的 mangle 名称。
- 将
-
safari10(默认值false) --
示例:
// test.js
var globalVar;
function funcName(firstLongName, anotherLongName) {
var myVariable = firstLongName + anotherLongName;
}
var code = fs.readFileSync("test.js", "utf8");
await minify(code).code;
// 'function funcName(a,n){}var globalVar;'
await minify(code, { mangle: { reserved: ['firstLongName'] } }).code;
// 'function funcName(firstLongName,a){}var globalVar;'
await minify(code, { mangle: { toplevel: true } }).code;
// 'function n(n,a){}var a;'
Format options [格式选项]
-
ascii_only(默认值false) --- 转义字符串和正则表达式中的 Unicode 字符(影响非 ASCII 字符无效的指令)
-
braces(默认值false) --- 始终在
if、for、do、while或with语句中插入大括号,即使它们的主体是单个语句。
- 始终在
-
comments(默认值"some") --- 默认情况下,它保留包含 "@license"、"@copyright"、"@preserve" 或以
!开头的 JSDoc 风格注释,传递true或"all"来保留所有注释,传递false来省略输出中的注释、正则表达式字符串(例如/^!/)或函数。
- 默认情况下,它保留包含 "@license"、"@copyright"、"@preserve" 或以
-
ecma(默认值5) --- 设置输出所需的 EcmaScript 标准版本。将
ecma设置为2015或更大以触发简写对象属性 - 例如:{a}而不是{a: a}。ecma选项只会改变直接控制美化器的输出。输入中不兼容的功能仍将按原样输出。例如:ecma设置为5不会将现代代码转换为 ES5。
- 设置输出所需的 EcmaScript 标准版本。将
-
indent_level(默认4) -
indent_start(默认值0) --- 在所有行前面添加那么多空格
-
inline_script(默认值true) --- 转义 HTML 注释和字符串中
</script>出现的斜杠
- 转义 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) --- 在输出中保留 简洁的注释。
-
safari10(默认值false) --- 将此选项设置为
true以解决 Safari 10/11 等待 bug 问题。也可以看看:safari10混淆选项。
- 将此选项设置为
-
semicolons(默认值true) --- 用分号分隔语句。如果你传递
false,那么只要有可能,我们将使用换行符而不是分号,从而使压缩代码的输出更具可读性(gzip 之前的大小可能会更小;gzip 之后的大小会稍微大一些)。
- 用分号分隔语句。如果你传递
-
shebang(默认值true) --- 在序言中保留 shebang
#!(bash 脚本)
- 在序言中保留 shebang
-
spidermonkey(默认值false) --- 生成 Spidermonkey (Mozilla) AST
-
webkit(默认值false) --- 启用 WebKit 错误的解决方法。PhantomJS 用户应将此选项设置为
true。
- 启用 WebKit 错误的解决方法。PhantomJS 用户应将此选项设置为
-
wrap_iife(默认值false) --- 传递
true来封装立即调用的函数表达式。详细信息请参见 #640。
- 传递
-
wrap_func_args(默认值true) --- 如果你不想将作为参数传递的函数表达式封装在括号中,请传递
false。详细信息请参见 OptimizeJS。
- 如果你不想将作为参数传递的函数表达式封装在括号中,请传递