terser 库

372 阅读14分钟

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 配置

  1. ecma :(默认值 undefined

    • 参数:5、 2015、 2016、 etc

    • 描述: 指定ECMAScript版本,注意:会覆盖 compressformatecma选项

  2. enclose :(默认值 false

    • 参数:false、 true、 args[:values]

    • 描述: 函数中的 args 和 values 分别是以逗号分隔的参数名称和值,以将输出嵌入具有可配置参数和值的大函数中。

  3. parse :(默认值 {}

    • 参数:ParseOptions

    • 描述: 如果你希望指定一些额外的 解析选项,则传递一个对象。

  4. compress :(默认值 {}

    • 参数:false、 true | CompressOptions

    • 描述: 传递 false 以完全跳过压缩。传递一个对象来指定自定义 压缩选项

  5. mangle :(默认值 true

    • 参数:false、 true | MangleOptions

    • 描述: 传递 false 以跳过名称修改,或传递对象以指定 混淆选项(见下文)。

    • mangle.properties(默认 false)— mangle 选项的子类别。传递一个对象来指定自定义 破坏属性选项

  6. module :(默认值 false

    • 参数:false、 true

    • 描述: 在最小化 ES6 模块时使用。隐含“use strict”,名称可以在顶层范围内进行修改。如果启用了 compress 或 mangle,则将启用 toplevel 选项

  7. format or output :(默认值 null

    • 参数:FormatOptions

    • 描述: 如果你希望指定额外的压缩配置选项: Format options、(中文 Format options),则传递一个对象。默认值已针对最佳压缩进行了优化。

  8. sourceMap :(默认值 false

    • 参数:false、 true | SourceMapOptions

    • 描述: 如果你想指定 源映射选项,请传递一个对象。

  9. toplevel :(默认值 false

    • 参数:false、 true

    • 描述: 如果您希望启用顶级变量和函数名称修改并删除未使用的变量和函数,请设置为 true。

  10. nameCache :(默认值 null

    • 参数:null | object

    • 描述: 如果你希望在多次调用 minify() 时缓存混淆的变量和属性名称,请传递空对象 {} 或以前使用过的 nameCache 对象。注意:这是一个读/写属性。minify() 将读取该对象的名称缓存状态并在压缩期间更新它,以便用户可以重用或在外部保留它

  11. ie8 :(默认值 false

    • 参数:false、 true

    • 描述: 设置为 true 以支持 IE8。

  12. keep_classnames :(默认值 undefined

    • 参数:false、true | RegExp

    • 描述: 通过 true 以防止丢弃或混淆类名。传递正则表达式以仅保留与该正则表达式匹配的类名。

  13. keep_fnames :(默认值 false

    • 参数:false、true | RegExp

    • 描述: 通过 true 以防止丢弃或修改函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称

  14. safari10 :(默认值 false

    • 参数:false、true

    • 描述: 通过 true 来解决 Safari 10/11 循环范围和 await 中的错误

Parse options [解析选项]

  • bare_returns (default false) -- 支持顶层 return 语句

  • html5_comments (default true)

  • shebang (default true) -- 支持 #!command 作为第一行

  • spidermonkey (default false) -- 接受 Spidermonkey (Mozilla) AST

Compress options [压缩选项]

  1. defaults (默认值: true) --

    • 传递 false 以禁用大多数默认启用的 compress 转换。当你只想启用几个 compress 选项而禁用其余选项时很有用
  2. arrows (默认值: true) --

    • 如果生成的代码较短,则转换的类和对象字面量方法也将转换为箭头表达式:m(){return x} 变成 m:()=>x。要对不使用 this 或 arguments 的常规 ES5 函数执行此操作,请参阅 unsafe_arrows
  3. arguments (默认值: false) --

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

    • 布尔上下文的各种优化,例如 !!a ? b : c → a ? b : c
  5. booleans_as_integers (默认值: false) --

    • 将布尔值转换为 0 和 1,也使用 == 和 != 而不是 === 和 !== 与布尔值进行比较。
  6. collapse_vars (默认值: true) --

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

    • 对二进制节点应用某些优化,例如 !(a <= b) → a > b(仅当 unsafe_comps 时),尝试否定二进制节点,例如 a = !b && !c && !d && !e → a=!(b||c||d||e) 等 注:comparisons 在启用 lhs_constants 的情况下效果最佳。
  8. computed_props (默认值: true) --

    • 将常量计算属性转换为常规属性:{["computed"]: 1} 转换为 {computed: 1}
  9. conditionals (默认值: true) --

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

    • 删除无法访问的代码
  11. directives (默认值: true) --

    • 删除冗余或非标准指令
  12. drop_console (默认值: false) --

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

    • 删除 debugger; 语句
  14. ecma (默认值: 5) --

    • 传递 2015 或更高版本以启用 compress 选项,将 ES5 代码转换为更小的 ES6+ 等效形式。
  15. evaluate (默认值: true) --

    • 尝试计算常量表达式
  16. expression (默认值: false) --

    • 传递 true 以保留不带 return 的终端语句的完成值,例如 在小书签中。
  17. global_defs (默认值: {}) --

  18. hoist_funs (默认值: false) --

    • 提升机功能声明
  19. 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 的情况下效果最佳。
  20. hoist_vars (默认值: false) --

    • 提升 var 声明(默认为 false,因为它通常会增加输出的大小)
  21. if_return (默认值: true) --

    • if/return 和 if/ continue 的优化
  22. inline (默认值: true) --

    • 使用 simple/return 语句内联调用函数:

      • false - 与 0 相同

      • 0 - 禁用内联

      • 1 - 内联简单函数

      • 2 - 带参数的内联函数

      • 3 - 带有参数和变量的内联函数

      • true - 与 3 相同

  23. join_vars (默认值: true) --

    • 连接连续的 varlet 和 const 语句
  24. keep_classnames (默认值: false) -

    • 传递 true 以防止压缩器丢弃类名。传递正则表达式以仅保留与该正则表达式匹配的类名。也可以看看:keep_classnames 混淆选项
  25. keep_fargs (默认值: true) --

    • 防止压缩器丢弃未使用的函数参数。对于依赖 Function.length 的代码,你需要这个。
  26. keep_fnames (默认值: false) --

    • 传递 true 以防止压缩器丢弃函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称。对于依赖 Function.prototype.name 的代码很有用。也可以看看:keep_fnames 混淆选项
  27. keep_infinity (默认值: false) --

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

    • 将常量值移动到二进制节点的左侧。foo == 42 → 42 == foo
  29. loops (默认值: true) --

    • 当我们可以静态确定条件时,对 dowhile 和 for 循环进行优化。
  30. module (默认值 false) --

    • 压缩 ES6 模块时传递 true。隐含了严格模式以及 toplevel 选项。
  31. negate_iife (默认值: true) --

    • 对 "立即调用函数表达式" 取反,其中返回值被丢弃,以避免代码生成器插入括号。
  32. passes (默认值: 1) --

    • 运行压缩的最大次数。在某些情况下,不止一次传递会导致进一步压缩代码。请记住,更多的传递将花费更多的时间。
  33. properties (默认值: true) --

    • 使用点符号重写属性访问,例如 foo["bar"] → foo.bar
  34. pure_funcs (默认值: null) --

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

    • 如果为此传递 true,Terser 将假定对象属性访问(例如 foo.bar 或 foo["bar"])没有任何副作用。仅当 foo 确定不会抛出时(即不是 null 或 undefined),才指定 "strict" 将 foo.bar 视为无副作用。
  36. pure_new (默认值: false) --

    • 设置为 true 以假定 new X() 永远不会产生副作用。
  37. reduce_vars (默认值: true) --

    • 改进对分配并用作常量值的变量的优化。
  38. reduce_funcs (默认值: true) --

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

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

    • 删除没有副作用且不使用其结果的表达式。
  3. switches (默认值: true) --

    • 去重复并删除无法访问的 switch 分支
  4. toplevel (默认值: false) --

    • 删除顶层范围中未引用的函数 ("funcs") 和/或变量 ("vars")(默认为 falsetrue 删除未引用的函数和变量)
  5. top_retain (默认值: null) --

    • 防止特定的顶层函数和变量从 unused 删除(可以是数组、逗号分隔、RegExp 或函数。隐含 toplevel
  6. typeofs (默认值: true) --

    • 将 typeof foo == "undefined" 转换为 foo === void 0。注意:由于已知问题,对于 IE10 及更早版本,建议将此值设置为 false
  7. unsafe (默认值: false) --

    • 应用 "unsafe" 转换 (details)。
  8. unsafe_arrows (默认值: false) --

    • 如果函数体没有引用 this,则将 ES5 风格的匿名函数表达式转换为箭头函数。注意:如果代码依赖于具有 prototype 的函数(箭头函数缺少该函数),则执行此转换并不总是安全的。此转换要求将 ecma 压缩选项设置为 2015 或更大。
  9. unsafe_comps (默认值: false) --

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

    • 当 args 和 code 都是字符串字面量时,压缩和重整 Function(args, code)
  11. unsafe_math (默认值: false) --

    • 将 2 * x * 3 等数值表达式优化为 6 * x,这可能会给出不精确的浮点结果。
  12. unsafe_symbols (默认值: false) --

    • 从原生符号声明中删除键,例如 Symbol("kDog") 变为 Symbol()
  13. unsafe_methods(默认值:false) --

    • 将 { m: function(){} } 转换为 { m(){} }ecma 必须设置为 6 或更大才能启用此转换。如果 unsafe_methods 是 RegExp,则键与 RegExp 匹配的键/值对将转换为简洁方法。注意:如果启用,则任何代码尝试对前一个函数进行 new 操作时,都会有出现“<method name> 不是构造函数”TypeError 的风险
  14. unsafe_proto (默认值: false) --

    • 将 Array.prototype.slice.call(a) 等表达式优化为 [].slice.call(a)
  15. unsafe_regexp (默认值: false) --

    • 允许用 RegExp 值替换变量,就像它们是常量一样。
  16. unsafe_undefined (默认值: false) --

    • 如果作用域中有名为 undefined 的变量,则替换 void 0 (变量名将被破坏,通常会缩减为单个字符)
  17. unused (默认值: true) --

    • 删除未引用的函数和变量(简单的直接变量赋值不计为引用,除非设置为 "keep_assign"

Mangle options [混淆选项]

  1. eval (默认值 false) --

    • 将 true 传递给在使用 eval 或 with 的范围内可见的 mangle 名称。
  2. keep_classnames (默认值 false) --

    • 传递 true 以不破坏类名。传递正则表达式以仅保留与该正则表达式匹配的类名。也可以看看:keep_classnames 压缩选项
  3. keep_fnames (默认值 false) --

    • 传递 true 以不破坏函数名称。传递正则表达式以仅保留与该正则表达式匹配的函数名称。对于依赖 Function.prototype.name 的代码很有用。也可以看看:keep_fnames 压缩选项
  4. module (默认值 false) --

    • 将 true 传递给 ES6 模块,其中顶层作用域不是全局作用域。暗示 toplevel 并假设输入代码是严格模式 JS。
  5. reserved (默认值 []) --

    • 传递应从重整中排除的标识符数组。示例:["foo", "bar"]
  6. toplevel (默认值 false) --

    • 将 true 传递给顶层范围中声明的 mangle 名称。
  7. safari10 (默认值 false) --

    • 传递 true 以解决 Safari 10 循环迭代器 bug "不能两次声明 let 变量" 的问题。也可以看看:safari10 格式选项

示例:

// 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 [格式选项]

  1. ascii_only (默认值 false) --

    • 转义字符串和正则表达式中的 Unicode 字符(影响非 ASCII 字符无效的指令)
  2. braces (默认值 false) --

    • 始终在 iffordowhile 或 with 语句中插入大括号,即使它们的主体是单个语句。
  3. comments (默认值 "some") --

    • 默认情况下,它保留包含 "@license"、"@copyright"、"@preserve" 或以 ! 开头的 JSDoc 风格注释,传递 true 或 "all" 来保留所有注释,传递 false 来省略输出中的注释、正则表达式字符串(例如 /^!/)或函数。
  4. ecma (默认值 5) --

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

  6. indent_start (默认值 0) --

    • 在所有行前面添加那么多空格
  7. inline_script (默认值 true) --

    • 转义 HTML 注释和字符串中 </script> 出现的斜杠
  8. keep_numbers (默认值 false) --

    • 保留原始代码中的数字字面量(禁用诸如将 1000000 转换为 1e6 之类的优化)
  9. keep_quoted_props (默认值 false) --

    • 打开时,可防止从对象字面量中的属性名称中去除引号。
  10. max_line_len (默认值 false) --

    • 最大行长度(对于精简代码)
  11. preamble (默认值 null) --

    • 传递时它必须是一个字符串,并且它将按字面意思添加到输出之前。源映射将针对此文本进行调整。例如,可用于插入包含许可信息的注释。
  12. quote_keys (默认值 false) --

    • 通过 true 来引用字面量对象中的所有键
  13. quote_style (默认值 0) --

    • 字符串的首选引号样式(也会影响带引号的属性名称和指令):

      • 0 -- 更喜欢双引号,当字符串本身有更多双引号时切换到单引号。0 最适合 gzip 大小。

      • 1 - 始终使用单引号

      • 2 - 始终使用双引号

      • 3 - 始终使用原始引号

  14. preserve_annotations --(默认 false) --

  15. safari10 (默认值 false) --

  16. semicolons (默认值 true) --

    • 用分号分隔语句。如果你传递 false,那么只要有可能,我们将使用换行符而不是分号,从而使压缩代码的输出更具可读性(gzip 之前的大小可能会更小;gzip 之后的大小会稍微大一些)。
  17. shebang (默认值 true) --

    • 在序言中保留 shebang #!(bash 脚本)
  18. spidermonkey (默认值 false) --

    • 生成 Spidermonkey (Mozilla) AST
  19. webkit (默认值 false) --

    • 启用 WebKit 错误的解决方法。PhantomJS 用户应将此选项设置为 true
  20. wrap_iife (默认值 false) --

    • 传递 true 来封装立即调用的函数表达式。详细信息请参见 #640
  21. wrap_func_args (默认值 true) --

    • 如果你不想将作为参数传递的函数表达式封装在括号中,请传递 false。详细信息请参见 OptimizeJS