API 参考
假如是通过NPM安装的,你可以在你的应用中这样加载UglifyJS:
var UglifyJS = require("uglify-js");
这输出一个高级函数minify(code, options)
,它能根据配置,实现多种最小化(即压缩、混淆等)。 minify()
默认启用压缩和混淆选项。例子:
var code = "function add(first, second) { return first + second; }";
var result = UglifyJS.minify(code);
console.log(result.error); // runtime error, or `undefined` if no error
console.log(result.code); // minified output: function add(n,d){return n+d}
你可以通过一个对象(key为文件名,value为代码)来同时最小化
多个文件:
var code = {
"file1.js": "function add(first, second) { return first + second; }",
"file2.js": "console.log(add(1 + 2, 3 + 4));"
};
var result = UglifyJS.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 = UglifyJS.minify(code, options);
console.log(result.code);
// console.log(3+7);
nameCache
选项例子:
var options = {
mangle: {
toplevel: true,
},
nameCache: {}
};
var result1 = UglifyJS.minify({
"file1.js": "function add(first, second) { return first + second; }"
}, options);
var result2 = UglifyJS.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", UglifyJS.minify({
"file1.js": fs.readFileSync("file1.js", "utf8"),
"file2.js": fs.readFileSync("file2.js", "utf8")
}, options).code, "utf8");
fs.writeFileSync("part2.js", UglifyJS.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
},
output: {
beautify: false,
preamble: "/* uglified */"
}
};
var result = UglifyJS.minify(code, options);
console.log(result.code);
// /* uglified */
// alert(10);"
生成警告提示:
var code = "function f(){ var u; return 2 + 3; }";
var options = { warnings: true };
var result = UglifyJS.minify(code, options);
console.log(result.error); // runtime error, `undefined` in this case
console.log(result.warnings); // [ 'Dropping unused variable u [0:1,18]' ]
console.log(result.code); // function f(){return 5}
生成错误提示:
var result = UglifyJS.minify({"foo.js" : "if (0) else console.log(1);"});
console.log(JSON.stringify(result.error));
// {"message":"Unexpected token: keyword (else)","filename":"foo.js","line":1,"col":7,"pos":7}
Note: unlike uglify-js@2.x
, the 3.x
API does not throw errors. To
achieve a similar effect one could do the following:
var result = UglifyJS.minify(code, options);
if (result.error) throw result.error;
最小化选项
Minify options
warnings
(defaultfalse
) — 传true
的话,会在result.warnings
中返回压缩过程的警告。传"verbose"
获得更详细的警告。parse
(default{}
) — 如果你要指定额外的解析配置parse options,传配置对象。compress
(default{}
) — 传false
就完全跳过压缩。传一个对象来自定义 压缩配置compress options。mangle
(defaulttrue
) — 传false
就跳过混淆名字。传对象来指定混淆配置mangle options (详情如下).mangle.properties
(defaultfalse
) — 传一个对象来自定义混淆属性配置mangle property options.
output
(defaultnull
) — 要自定义就传个对象来指定额外的 输出配置output options. 默认是压缩到最优化。sourceMap
(defaultfalse
) - 传一个对象来自定义
sourcemap配置source map options.toplevel
(defaultfalse
) - 如果你要混淆(和干掉没引用的)最高作用域中的变量和函数名,就传true
。nameCache
(defaultnull
) - 如果你要缓存minify()
多处调用的经混淆的变量名、属性名,就传一个空对象{}
或先前用过的nameCache
对象。
注意:这是个可读/可写属性。minify()
会读取这个对象的nameCache状态,并在最小化过程中更新,以便保留和供用户在外部使用。ie8
(defaultfalse
) - 传true
来支持 IE8.
最小化配置的结构
Minify options structure
{
warnings: false,
parse: {
// parse options
},
compress: {
// compress options
},
mangle: {
// mangle options
properties: {
// mangle property options
}
},
output: {
// output options
},
sourceMap: {
// source map options
},
nameCache: null, // or specify a name cache object
toplevel: false,
ie8: false,
}
sourcemap配置
Source map options
这样生成sourcemap:
var result = UglifyJS.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
要注意,此时sourcemap并不会保存为一份文件,它只会返回在result.map
中。sourceMap.url
传入的值只用来在result.code
中设置//# sourceMappingURL=out.js.map
,filename
的值只用来在sourcemap文件中设置 file
属性(详情看 [规范][sm-spec])。
你可以把sourceMap.url
设为true
,这样sourcemap会加在代码末尾。
你也可以指定sourcemap中的源文件根目录(sourceRoot)属性:
var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, {
sourceMap: {
root: "http://example.com/src",
url: "out.js.map"
}
});
如果你要压缩从其他文件编译得来的带一份sourcemap的JS文件,你可以用sourceMap.content
参数:
var result = UglifyJS.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
。
解析配置
Parse options
bare_returns
(defaultfalse
) — 支持在顶级作用域中return
声明。html5_comments
(defaulttrue
)shebang
(defaulttrue
) — 支持在第一行用#!command
压缩配置
Compress options
sequences
(default: true) — 连续声明变量,用逗号隔开来。可以设置为正整数来指定连续声明的最大长度。如果设为true
表示默认200
个,设为false
或0
则禁用。sequences
至少要是2
,1
的话等同于true
(即200
)。默认的sequences设置有极小几率会导致压缩很慢,所以推荐设置成20
或以下。properties
— 用.
来重写属性引用,例如foo["bar"] → foo.bar
dead_code
— 移除没被引用的代码drop_debugger
— 移除debugger;
unsafe
(default: false) — 使用 “unsafe”转换 (下面详述)unsafe_comps
(default: false) — 保留<
和<=
不被换成>
和>=
。假如某些运算对象是用get
或valueOf
object得出的时候,转换可能会不安全,可能会引起运算对象的改变。此选项只有当comparisons
和unsafe_comps
都设为true时才会启用。unsafe_Func
(default: false) — 当Function(args, code)
的args
和code
都是字符串时,压缩并混淆。unsafe_math
(default: false) — 优化数字表达式,例如2 * x * 3
变成6 * x
, 可能会导致不精确的浮点数结果。unsafe_proto
(default: false) — 把Array.prototype.slice.call(a)
优化成[].slice.call(a)
unsafe_regexp
(default: false) — 如果RegExp
的值是常量,替换成变量。conditionals
— 优化if
等判断以及条件选择comparisons
— 把结果必然的运算优化成二元运算,例如!(a <= b) → a > b
(只有设置了unsafe_comps
时才生效);尽量转成否运算。例如a = !b && !c && !d && !e → a=!(b||c||d||e)
evaluate
— 尝试计算常量表达式booleans
— 优化布尔运算,例如!!a? b : c → a ? b : c
typeofs
— 默认true
. 转换typeof foo == "undefined"
成foo === void 0
. 注意:如果要适配IE10或以下,由于已知的问题,推荐设成false
。loops
— 当do
、while
、for
循环的判断条件可以确定是,对其进行优化。unused
— 干掉没有被引用的函数和变量。(除非设置"keep_assign"
,否则变量的简单直接赋值也不算被引用。)toplevel
— 干掉顶层作用域中没有被引用的函数 ("funcs"
)和/或变量("vars"
) (默认是false
,true
的话即函数变量都干掉)top_retain
— 当设了unused
时,保留顶层作用域中的某些函数变量。(可以写成数组,用逗号隔开,也可以用正则或函数. 参考toplevel
)hoist_funs
— 提升函数声明hoist_vars
(default: false) — 提升var
声明 (默认是false
,因为那会加大文件的size)if_return
— 优化 if/return 和 if/continueinline
— 包裹简单函数。join_vars
— 合并连续var
声明cascade
— 弱弱地优化一下连续声明, 将x, x
转成x
,x = something(), x
转成x = something()
collapse_vars
— 当var
和const
单独使用时尽量合并reduce_vars
— 优化某些变量实际上是按常量值来赋值、使用的情况。warnings
— 当删除没有用处的代码时,显示警告negate_iife
— 当立即执行函数(IIFE)的返回值没用时,取消之。避免代码生成器会插入括号。pure_getters
— 默认是false
. 如果你传入true
,UglifyJS会假设对象属性的引用(例如foo.bar
或foo["bar"]
)没有函数副作用。pure_funcs
— 默认null
. 你可以传入一个名字的数组,UglifyJS会假设这些函数没有函数副作用。警告:假如名字在作用域中重新定义,不会再次检测。例如var q = Math.floor(a/b)
,假如变量q
没有被引用,UglifyJS会干掉它,但Math.floor(a/b)
会被保留,没有人知道它是干嘛的。你可以设置pure_funcs: [ 'Math.floor' ]
,这样该函数会被认为没有函数副作用,这样整个声明会被废弃。在目前的执行情况下,会增加开销(压缩会变慢)。drop_console
— 默认false
. 传true
的话会干掉console.*
函数。如果你要干掉特定的函数比如console.info
,又想删掉后保留其参数中的副作用,那用pure_funcs
来处理吧。expression
— 默认false
。传true
来保留终端语句中没有”return”的完成值。例如在bookmarklets。keep_fargs
— 默认true
。阻止压缩器干掉那些没有用到的函数参数。你需要它来保护某些依赖Function.length
的函数。keep_fnames
— 默认false
。传true
来防止压缩器干掉函数名。对那些依赖Function.prototype.name
的函数很有用。延展阅读:keep_fnames
混淆选项.passes
— 默认1
。运行压缩的次数。在某些情况下,用一个大于1的数字参数可以进一步压缩代码大小。注意:数字越大压缩耗时越长。keep_infinity
— 默认false
。传true
以防止压缩时把1/0
转成Infinity
,那可能会在chrome上有性能问题。side_effects
— 默认true
. 传false
禁用丢弃纯函数。如果一个函数被调用前有一段/*@__PURE__*/
or/*#__PURE__*/
注释,该函数会被标注为纯函数。例如/*@__PURE__*/foo();
混淆配置
Mangle options
reserved
(default[]
)。 传一个不需要混淆的名字的数组。 Example:["foo", "bar"]
.toplevel
(defaultfalse
)。混淆那些定义在顶层作用域的名字(默认禁用)。ßkeep_fnames
(defaultfalse
)。传true
的话就不混淆函数名。对那些依赖Function.prototype.name
的代码有用。延展阅读:keep_fnames
压缩配置.eval
(defaultfalse
)。混淆那些在with或eval中出现的名字。
// test.js
var globalVar;
function funcName(firstLongName, anotherLongName) {
var myVariable = firstLongName + anotherLongName;
}
var code = fs.readFileSync("test.js", "utf8");
UglifyJS.minify(code).code;
// 'function funcName(a,n){}var globalVar;'
UglifyJS.minify(code, { mangle: { reserved: ['firstLongName'] } }).code;
// 'function funcName(firstLongName,a){}var globalVar;'
UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
// 'function n(n,a){}var a;'
混淆属性的配置
Mangle properties options
reserved
(default:[]
) — 不混淆在reserved
数组里的属性名.regex
(default:null
) -— 传一个正则,只混淆匹配该正则的属性名。keep_quoted
(default:false
) -— 只混淆不在括号内的属性名.debug
(default:false
) -— 用原名字来组成混淆后的名字.
传空字符串""
来启用,或者非空字符串作为debu后缀。(例如"abc"
,foo.bar
=>foo.barabc
)builtins
(default:false
) — 传true
的话,允许混淆内置的DOM属性名。不推荐使用。
输出配置
Output options
代码生成器默认会尽量输出最简短的代码。假如你要美化一下输出代码,可以传--beautify
(-b
)。你也可以传更多的参数来控制输出代码:
ascii_only
(defaultfalse
) — 忽略字符串和正则(导致非ascii字符失效)中的Unicode字符。beautify
(defaulttrue
) — 是否美化输出代码。传-b
的话就是设成true。假如你想生成最小化的代码同时又要用其他设置来美化代码,你可以设-b beautify=false
。bracketize
(defaultfalse
) — 永远在if
,for
,do
,while
,with
后面加上大括号,即使循环体只有一句。comments
(defaultfalse
) — 传true
或"all"
保留全部注释,传"some"
保留部分,传正则 (例如/^!/
) 或者函数也行。indent_level
(default 4) 缩进格数indent_start
(default 0) — 每行前面加几个空格inline_script
(defaultfalse
) — 避免字符串中出现</script
中的斜杠keep_quoted_props
(defaultfalse
) — 如果启用,会保留对象属性名的引号。max_line_len
(default 32000) — 最大行宽(压缩后的代码)space-colon
(defaulttrue
) — 在冒号后面加空格preamble
(defaultnull
) — 如果要传的话,必须是字符串。它会被加在输出文档的前面。sourcemap会随之调整。例如可以用来插入版权信息。preserve_line
(defaultfalse
) — 传true
就保留空行,但只在beautify
设为false
时有效。ßquote_keys
(defaultfalse
) — 传true
的话会在对象所有的键加上括号quote_style
(default0
) — 影响字符串的括号格式(也会影响属性名和指令)。0
— 倾向使用双引号,字符串里还有引号的话就是单引号。1
— 永远单引号2
— 永远双引号3
— 永远是本来的引号semicolons
(defaulttrue
) — 用分号分开多个声明。如果你传false
,则总会另起一行,增强输出文件的可读性。(gzip前体积更小,gzip后稍大一点点)shebang
(defaulttrue
) — 保留开头的 shebang#!
(bash 脚本)width
(default 80) — 仅在美化时生效,设定一个行宽让美化器尽量实现。这会影响行中文字的数量(不包括缩进)。当前本功能实现得不是非常好,但依然让美化后的代码可读性大大增强。wrap_iife
(defaultfalse
) —传true
的话,把立即执行函数括起来。 更多详情看这里
#640