Terser 是一个用于 JavaScript 的压缩和美化工具,它可以帮助减少代码体积,提高加载速度。Terser 提供了许多选项来控制压缩过程。以下是一些常用的压缩选项及其含义:
压缩选项(Compress Options)
这些选项控制在压缩过程中如何转换和优化代码。
defaults
设置为 true 以启用大多数默认的压缩转换。如果你设置了一些选项,你可能需要将其设置为 false 以避免覆盖。
arrows
将 ES6 的箭头函数转换为函数表达式(如果函数体只是一个表达式,并且没有 this 或 arguments 的使用,则可能更短)。默认情况下,当函数体是单个表达式时,箭头函数已经被简洁地表示,但此选项可以进一步转换。
arguments
将函数中 arguments[index] 替换为对应的参数名,如果可能的话。
booleans
优化布尔表达式,例如将 !!a 转换为 Boolean(a) 或者根据上下文转换为 a 或 !a。
booleans_as_integers
将布尔值视为 0 和 1,从而进行一些算术优化,但可能会改变类型。
collapse_vars
将变量声明合并,尽可能将变量内联到使用处。
comparisons
简化比较表达式,例如将 !(a <= b) 转换为 a > b。
computed_props
简化计算属性,例如将 {["computed"]: 1} 转换为 {computed: 1}。
conditionals
优化条件表达式,例如将 a ? b : c 转换为 if(a) b; else c; 的形式,并进一步优化。
dead_code
删除不可达的代码。
directives
删除指令语句(如 "use strict";)中的引号,如果安全的话。
drop_console
删除所有 console.* 调用。也可以指定删除特定的 console 方法,如 drop_console: ['log', 'info']。
drop_debugger
删除 debugger 语句。
ecma
指定 ECMAScript 版本,默认为 5。更高的版本可能启用更多优化。
evaluate
尝试计算常量表达式,例如将 2+3 转换为 5。
expression
将整个脚本包装在一个表达式中,从而允许 Terser 进行更多优化。
global_defs
定义全局常量,用于替换。例如 { "@DEBUG": false } 会将代码中的 @DEBUG 替换为 false。
hoist_funs
将函数声明提升到作用域顶部。
hoist_props
将对象属性提升,将多个对象的相同属性提升为一个变量。
hoist_vars
将变量声明提升到作用域顶部。
if_return
优化 if 和 return 语句,例如将 if (a) return b; else return c; 转换为 return a ? b : c;。
inline
内联函数调用,如果可能的话。可以设置一个阈值(如 3)来控制内联。
join_vars
合并连续的变量声明。
keep_classnames
保留类名,不进行压缩。
keep_fargs
保留函数参数名,不进行压缩。
keep_fnames
保留函数名,不进行压缩。
keep_infinity
保留 Infinity,不将其转换为 1/0。
loops
优化循环,例如将 for (var i = 0; i < 10; i++) console.log(i); 转换为 for (var i = 0; i < 10; i++) console.log(i);(这里只是示例,实际上可能会优化循环条件)。
module
设置 true 以处理 ES6 模块。这会影响 toplevel 选项。
negate_iife
否定立即执行函数表达式,以避免括号。
passes
运行压缩的次数,默认为 1。多次运行可能会进一步压缩代码。
properties
重命名属性名,使用更短的名称。
pure_funcs
指定一些函数为纯函数,这样如果它们的返回值没有被使用,Terser 可以删除它们。例如 ['Math.floor']。
pure_getters
如果属性访问是纯的(没有副作用),则允许删除。
reduce_funcs
减少函数表达式,内联函数等。
reduce_vars
减少变量使用,内联变量。
sequences
将多个语句合并为一个序列,使用逗号运算符。
side_effects
删除没有副作用的函数调用。
switches
优化 switch 语句,合并重复的 case。
toplevel
压缩顶级作用域的变量和函数名。
top_retain
指定顶级作用域中要保留的变量名列表。
typeofs
优化 typeof 操作,例如将 typeof undefined 转换为 "undefined"。
unsafe
启用一些不安全的转换,例如将 new Array(1,2,3) 转换为 [1,2,3]。
unsafe_arrows
在箭头函数中启用不安全的转换。
unsafe_comps
启用不安全的比较优化。
unsafe_Function
启用对 Function 构造函数的不安全优化。
unsafe_math
启用不安全的数学优化,例如将 2 * x 转换为 x << 1。
unsafe_symbols
启用不安全的符号优化。
unsafe_methods
启用不安全的方法调用优化。
unsafe_proto
启用对 proto 的不安全优化。
unsafe_regexp
启用不安全的正则表达式优化。
unsafe_undefined
启用对 undefined 的不安全优化,例如将 void 0 替换为 undefined。
unused
删除未使用的变量和函数。
varify
将 let 和 const 转换为 var,如果安全的话。
格式化选项(Format Options)
这些选项控制输出代码的格式。
ascii_only
转义非 ASCII 字符。
beautify
美化输出代码,默认为 false。
braces
在块语句中使用大括号。
comments
保留注释。可以设置为 "all"、"some"、正则表达式或函数。
indent_level
缩进级别。
indent_start
起始缩进,默认为 0。
inline_script
转义 HTML 脚本标签中的 。
keep_numbers
保留数字的字面量,不进行优化。
max_line_len
最大行长度。
preamble
在输出文件前添加的内容。
quote_keys
引用对象键,即使它们可以是有效的标识符。
quote_style
引用样式,0-3,分别表示自动、单引号、双引号、保留原始。
preserve_annotations
保留特定注释,如 @license。
safari10
Safari 10 兼容性处理。
semicolons
在语句末尾添加分号。
shebang
保留 shebang(如 #!/usr/bin/env node)。
webkit
启用 WebKit 兼容性处理。
width
指定每行的最大字符数,用于换行。
wrap_iife
包装立即执行函数表达式。
wrap_func_args
包装函数参数。
其他选项
sourceMap
生成源映射。
toplevel
压缩顶级作用域的变量和函数名。
nameCache
缓存变量名,以便在多个文件之间共享。
keep_fnames
保留函数名。
ie8
支持 IE8。
safari10
支持 Safari 10。
使用示例
在配置文件中,你可以这样设置:
javascript
{
compress: {
defaults: true,
drop_console: true,
drop_debugger: true,
pure_funcs: ['console.log']
},
mangle: {
toplevel: true,
keep_fnames: false
},
format: {
beautify: false,
comments: false
}
}
或者在命令行中:
bash
terser input.js --compress drop_console=true,pure_funcs=['console.log'] --mangle toplevel=true --format beautify=false
这些选项可以根据你的需求进行组合,以达到最佳的压缩效果。注意,有些选项可能会改变代码的行为,特别是在启用不安全选项时,请确保测试充分。
