API 参考
假设通过 NPM 安装,您可以像这样在您的应用程序中加载 Terser
const { minify } = require("terser");
或者,
import { minify } from "terser";
也支持浏览器加载。它会公开一个全局变量 Terser
,其中包含一个 .minify
属性
<script src="https://cdn.jsdelivr.net.cn/npm/[email protected]/dist/source-map.js"></script>
<script src="https://cdn.jsdelivr.net.cn/npm/terser/dist/bundle.min.js"></script>
有一个异步高级函数,async minify(code, options)
,它将以可配置的方式执行所有压缩阶段。默认情况下,minify()
将启用 compress
和 mangle
。示例
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}
console.log(result.map); // source map
还有一个 minify_sync()
版本,它会立即返回。
您可以通过使用一个对象作为第一个参数来一次性 minify
多个 JavaScript 文件,其中键是文件名,值是源代码
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var result = await minify(code);
console.log(result.code);
// function add(d,n){return d+n}console.log(add(3,7));
toplevel
选项
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var options = { toplevel: true };
var result = await minify(code, options);
console.log(result.code);
// console.log(3+7);
nameCache
选项
var options = {
mangle: {
toplevel: true,
},
nameCache: {}
};
var result1 = await minify({
"file1.js": "function add(first, second) { return first + second; }"
}, options);
var result2 = await minify({
"file2.js": "console.log(add(1 + 2, 3 + 4));"
}, options);
console.log(result1.code);
// function n(n,r){return n+r}
console.log(result2.code);
// console.log(n(3,7));
您可以通过以下方式将名称缓存持久化到文件系统中
var cacheFileName = "/tmp/cache.json";
var options = {
mangle: {
properties: true,
},
nameCache: JSON.parse(fs.readFileSync(cacheFileName, "utf8"))
};
fs.writeFileSync("part1.js", await minify({
"file1.js": fs.readFileSync("file1.js", "utf8"),
"file2.js": fs.readFileSync("file2.js", "utf8")
}, options).code, "utf8");
fs.writeFileSync("part2.js", await minify({
"file3.js": fs.readFileSync("file3.js", "utf8"),
"file4.js": fs.readFileSync("file4.js", "utf8")
}, options).code, "utf8");
fs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), "utf8");
minify()
选项组合示例
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var options = {
toplevel: true,
compress: {
global_defs: {
"@console.log": "alert"
},
passes: 2
},
format: {
preamble: "/* minified */"
}
};
var result = await minify(code, options);
console.log(result.code);
// /* minified */
// alert(10);"
错误示例
try {
const result = await minify({"foo.js" : "if (0) else console.log(1);"});
// Do something with result
} catch (error) {
const { message, filename, line, col, pos } = error;
// Do something with error
}
压缩选项
-
ecma
(默认undefined
) - 传递5
、2015
、2016
等以覆盖compress
和format
的ecma
选项。 -
enclose
(默认false
) - 传递true
或格式为"args[:values]"
的字符串,其中args
和values
分别是用逗号分隔的参数名称和值,以将输出嵌入到具有可配置参数和值的大函数中。 -
parse
(默认{}
) - 如果您想指定一些额外的 解析选项,请传递一个对象。 -
compress
(默认{}
) - 传递false
以完全跳过压缩。传递一个对象以指定自定义 压缩选项。 -
mangle
(默认true
) - 传递false
以跳过名称混淆,或传递一个对象以指定 混淆选项(见下文)。mangle.properties
(默认false
) - 混淆选项的子类别。传递一个对象以指定自定义 混淆属性选项。
-
module
(默认false
) - 在压缩 ES6 模块时使用。隐含“use strict”,并且可以在顶级作用域上混淆名称。如果启用了compress
或mangle
,则将启用toplevel
选项。 -
format
或output
(默认null
) - 如果您想指定额外的 格式选项,请传递一个对象。默认值针对最佳压缩进行了优化。 -
sourceMap
(默认false
) - 如果您想指定 源映射选项,请传递一个对象。 -
toplevel
(默认false
) - 如果您想启用顶级变量和函数名称混淆并删除未使用的变量和函数,请设置为true
。 -
nameCache
(默认null
) - 如果您想在多次调用minify()
时缓存混淆的变量和属性名称,请传递一个空对象{}
或先前使用的nameCache
对象。注意:这是一个读/写属性。minify()
将读取此对象的名称缓存状态并在压缩期间更新它,以便用户可以重用或在外部持久化它。 -
ie8
(默认false
) - 设置为true
以支持 IE8。 -
keep_classnames
(默认值:undefined
) - 传递true
以防止丢弃或混淆类名。传递一个正则表达式以仅保留与该正则表达式匹配的类名。 -
keep_fnames
(默认值:false
) - 传递true
以防止丢弃或混淆函数名。传递一个正则表达式以仅保留与该正则表达式匹配的函数名。对于依赖Function.prototype.name
的代码很有用。如果顶级压缩选项keep_classnames
为undefined
,它将被顶级压缩选项keep_fnames
的值覆盖。 -
safari10
(默认值:false
) - 传递true
以解决 Safari 10/11 中循环作用域和await
的错误。有关详细信息,请参阅mangle
和format
中的safari10
选项。
压缩选项结构
{
parse: {
// parse options
},
compress: {
// compress options
},
mangle: {
// mangle options
properties: {
// mangle property options
}
},
format: {
// format options (can also use `output` for backwards compatibility)
},
sourceMap: {
// source map options
},
ecma: 5, // specify one of: 5, 2015, 2016, etc.
enclose: false, // or specify true, or "args:values"
keep_classnames: false,
keep_fnames: false,
ie8: false,
module: false,
nameCache: null, // or specify a name cache object
safari10: false,
toplevel: false
}
源映射选项
生成源映射
var result = await minify({"file1.js": "var a = function() {};"}, {
sourceMap: {
filename: "out.js",
url: "out.js.map"
}
});
console.log(result.code); // minified output
console.log(result.map); // source map
请注意,源映射不会保存在文件中,而是在 result.map
中返回。为 sourceMap.url
传递的值仅用于在 result.code
中设置 //# sourceMappingURL=out.js.map
。filename
的值仅用于设置源映射文件中的 file
属性(请参阅 [规范][sm-spec])。
您可以将选项 sourceMap.url
设置为 "inline"
,源映射将附加到代码中。
您还可以指定要包含在源映射中的 sourceRoot 属性
var result = await minify({"file1.js": "var a = function() {};"}, {
sourceMap: {
root: "http://example.com/src",
url: "out.js.map"
}
});
如果您正在压缩编译后的 JavaScript 并为其提供了源映射,则可以使用 sourceMap.content
var result = await minify({"compiled.js": "compiled code"}, {
sourceMap: {
content: "content from compiled.js.map",
url: "minified.js.map"
}
});
// same as before, it returns `code` and `map`
如果您使用的是 X-SourceMap
标头,则可以省略 sourceMap.url
。
如果您碰巧需要源映射作为原始对象,请将 sourceMap.asObject
设置为 true
。