JavaScript 压缩和美化工具 Terser 常用的压缩选项和含义

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

这些选项可以根据你的需求进行组合,以达到最佳的压缩效果。注意,有些选项可能会改变代码的行为,特别是在启用不安全选项时,请确保测试充分。

我的笔记