Uglifier选项完全速查表:60+压缩配置参数一文看懂
【免费下载链接】uglifierRuby wrapper for UglifyJS JavaScript compressor.项目地址: https://gitcode.com/gh_mirrors/ug/uglifier
Uglifier 是一个用于 Ruby 的 JavaScript 压缩器封装 gem,底层封装了经典的 UglifyJS 引擎,一行代码即可把冗长的 JS 压缩为极小体积的生产版本。真正决定 Uglifier 压缩效果的,是它提供的一套完整选项(options)体系——涵盖输出格式、压缩策略、变量混淆、源映射等 70+ 个配置参数。本文把全部 Uglifier 压缩选项整理成一张速查表,带你一文看懂每个参数的默认值、作用与典型用法。
30秒上手:如何安装与传入 Uglifier 选项
先安装 gem:
gem install uglifier或从源码构建:
git clone https://gitcode.com/gh_mirrors/ug/uglifier压缩代码的基本姿势只有两种传参方式,后面所有选项都基于它们:
require 'uglifier' # 方式一:初始化时传选项 Uglifier.new(:mangle => false).compile(File.read("source.js")) # 方式二:静态方法直接传选项 Uglifier.compile(File.read("source.js"), :mangle => false)💡 Uglifier 只支持 ES5。如果你的代码是 ES6+,README 建议改用 ruby-terser;或在 Uglifier 中开启 harmony 实验模式(见下文顶层选项)。
60+ Uglifier 选项全貌:一张地图看懂选项分组
Uglifier 的全部选项按用途分成 8 组,默认值定义在lib/uglifier.rb的DEFAULTS常量中,文档列表见 README 的 "Available options" 一节:
| 选项分组 | 参数数量 | 管什么 | 对应小节 |
|---|---|---|---|
output | 17 | 压缩后代码的"长相":引号、换行、注释、美化 | output |
compress | 33 | 压缩器核心变换:删死代码、内联变量、优化循环 | compress |
mangle | 6 | 变量/函数名混淆(改名缩短) | mangle |
mangle_properties | 3 | 对象属性名混淆 | mangle_properties |
parse | 5 | 如何解析输入源码 | parse |
source_map | 7 | 生成源码映射,方便线上排错 | source_map |
| 顶层选项 | 5+ | define、enclose、harmony等全局开关 | 顶层 |
关键规则:任何分组选项都可以整体设为false完全禁用(如compress: false跳过全部压缩变换),设为true或传子哈希则与默认值合并。
output 选项速查:控制压缩文件的 17 个输出参数
output组不改变逻辑,只改变压缩产物的"外观"。
| 选项 | 默认值 | 作用 |
|---|---|---|
ascii_only | true | 非 ASCII 字符转义为 \x 序列 |
comments | :copyright | 注释保留策略::all、:jsdoc、:copyright、:none或正则 |
inline_script | false | 转义字符串中的</script,防止内联脚本提前闭合 |
quote_keys | false | 给对象字面量的键加引号 |
max_line_len | 32768 | 压缩代码的最大行宽 |
bracketize | false | 给 if/for 等单语句块强制加花括号 |
semicolons | true | 用分号分隔语句(更省字节) |
preserve_line | false | 保留输出行数与原文件一致 |
beautify | false | 美化输出(用于调试阅读) |
indent_level | 4 | beautify 时缩进空格数 |
indent_start | 0 | beautify 起始缩进级别 |
width | 80 | beautify 时的换行宽度 |
preamble | nil | 在产物开头插入自定义代码或注释(如 banner) |
wrap_iife | false | 用括号包裹 IIFE;注意会关闭negate_iife |
shebang | true | 保留 shell 脚本首行的#! |
quote_style | 0 | 引号风格:0自动 /:single/:double/:original |
keep_quoted_props | false | 保留属性名原有的引号 |
保留版权注释的两种常用写法:默认:copyright已会保留含Copyright或!开头的注释;想用自定义正则时,注意注释首尾符号(/*、*/、//)会被剥离、无法参与匹配,例如保留/*! ... */应写Uglifier.new(output: {comments: /^!/})。
compress 选项速查:决定压缩强度的 33 个核心参数
compress是 Uglifier 选项中最重的一组,控制 UglifyJS 对代码做哪些变换。整体设为false可只做混淆不做压缩。
代码清理类
| 选项 | 默认值 | 作用 |
|---|---|---|
dead_code | true | 删除不可达的死代码 |
drop_debugger | true | 删除debugger;语句 |
drop_console | false | 删除console.*调用(生产环境强烈建议开启) |
unused | true | 丢弃未引用的函数和变量 |
side_effects | true | 允许移除带@preserve纯函数注释标记的调用 |
keep_infinity | false | 防止把Infinity压缩成1/0 |
switches | true | 去重并移除不可达的 switch 分支 |
表达式优化类
| 选项 | 默认值 | 作用 |
|---|---|---|
sequences | true | 用逗号运算符合并多条语句 |
properties | true | 把obj["a"]改写为更短的obj.a |
conditionals | true | 优化 if 与三元表达式 |
comparisons | true | 对比较运算做二值优化 |
evaluate | true | 尝试折叠常量表达式 |
booleans | true | 布尔上下文各种简化 |
loops | true | 条件可静态判断时优化 while/do |
if_return | true | 优化 if/return、if/continue 结构 |
unsafe_comps | false | 翻转<、<=为>、>=以利压缩(有对象操作数时不安全) |
变量与函数变换类
| 选项 | 默认值 | 作用 |
|---|---|---|
join_vars | true | 合并连续的var声明 |
hoist_funs | true | 提升函数声明 |
hoist_vars | false | 提升var声明 |
collapse_vars | false | 合并单次使用的 var/const 定义 |
reduce_vars | false | 把"只赋值一次且按常量使用"的变量折叠掉 |
reduce_funcs | false | 内联单次使用的函数(依赖 reduce_vars) |
negate_iife | true | 取反 IIFE 条件以省去多余括号 |
toplevel | false | 连同顶层作用域一起丢弃未引用代码 |
top_retain | [] | 顶层白名单,阻止unused删除指定函数/变量 |
passes | 1 | 压缩遍历轮数,调大更省体积但更耗时 |
keep_fargs | false | 保留未使用的函数参数 |
keep_fnames | false | 不丢弃函数定义中的名字 |
"unsafe" 系列与纯函数假设
| 选项 | 默认值 | 作用 |
|---|---|---|
unsafe | false | 开启各类"不安全"变换的总开关 |
unsafe_math | false | 把2 * x * 3优化为6 * x(浮点精度可能受影响) |
unsafe_proto | false | 把Array.prototype.slice.call(a)优化为[].slice.call(a) |
pure_getters | false | 假定属性访问无副作用(开启后才能删"纯"属性读取) |
pure_funcs | nil | 列出无副作用函数,结果未使用时可安全删掉调用 |
mangle 与 mangle_properties:变量混淆怎么配
mangle负责把变量、函数名替换成 a、b、c 这类短名,是缩小体积的大头。
| 选项 | 默认值 | 作用 |
|---|---|---|
mangle | true(哈希) | 设为false可整体跳过混淆 |
eval | false | 作用域内出现 eval 时是否仍混淆 |
reserved | ["$super"] | 不参与混淆的参数名白名单 |
sort | false | 按使用频率分配短名(gzip 后体积可能反而变大) |
toplevel | false | 是否混淆顶层作用域的名字 |
properties | false | 开启属性名混淆(实际由 mangle_properties 细调) |
keep_fnames | false | 不修改函数名(依赖Function.prototype.name时开启) |
mangle_properties属性混淆默认关闭,单独细调时支持:
| 选项 | 默认值 | 作用 |
|---|---|---|
regex | nil | 正则过滤"哪些属性名参与混淆" |
ignore_quoted | false | 只混淆不带引号的属性名 |
debug | false | 混淆后保留原名前后缀,便于调试 |
parse 选项:告诉 Uglifier 如何解析输入源码
| 选项 | 默认值 | 作用 |
|---|---|---|
bare_returns | false | 允许顶层return语句 |
expression | false | 把输入当单个表达式解析(如解析 JSON) |
html5_comments | true | 忽略 HTML5 风格注释 |
shebang | true | 支持首行#!command |
strict | false | 严格模式解析 |
source_map 选项:7 个参数搞定源码映射
线上压缩代码报错行号对不上?开启源映射即可。Uglifier.new.compile_with_map(source)会返回压缩代码与 map;若source_map选项传true,产物末尾会自动追加 base64 内联的sourceMappingURL。
| 选项 | 默认值 | 作用 |
|---|---|---|
map_url | false | 追加到产物末尾的 source map 文件地址 |
url | false | 追加的原始源码地址(sourceURL) |
sources_content | false | 把原始源码内容内嵌进 map 文件 |
filename | nil | 输入文件名 |
root | nil | 输入文件所在目录的 URL |
output_filename | nil | 压缩产物的文件名/URL |
input_source_map | nil | 输入文件自身的 source map 内容 |
顶层选项:harmony、define、enclose 等全局开关
| 选项 | 默认值 | 作用 |
|---|---|---|
harmony | false | 启用 ES6/Harmony 实验模式(内部切换lib/uglify-harmony.js);官方建议配合关闭 mangle 与 compress |
define | {} | 定义符号替换值,如把DEBUG替换为false以触发死代码消除 |
enclose | false | 用函数包裹输出,并以键值对注入外部变量 |
keep_fnames | false | 一键同时开启 compress 与 mangle 的keep_fnames |
error_context_lines | 8 | 报错信息中上下文行数(环境变量ERROR_CONTEXT_LINES可覆盖) |
💡 Rails 用户重点看这里:config/environments/production.rb中若需压缩 ES6,应把config.assets.js_compressor = :uglifier替换为:
config.assets.js_compressor = Uglifier.new(harmony: true)3 个高频 Uglifier 配置组合(可直接抄作业)
生产环境极限压缩配置
Uglifier.new( compress: { drop_console: true, # 删掉所有 console.log toplevel: true, # 顶层未引用代码也删 passes: 2 # 多跑一轮压缩,体积更小 }, mangle: { toplevel: true }, output: { comments: :none } ).compile(source)保留版权 + 自定义注释的正则写法
# 保留 /*! 开头的 banner 注释 Uglifier.new(output: { comments: /^!/ }).compile(source)调试期"只压缩不混淆"配置
Uglifier.new(mangle: false, output: { beautify: true, indent_level: 2 }).compile(source)Uglifier 选项常见误区与避坑指南
⚠️误区 1:ES6 代码报 "Unexpected token"—— Uglifier 核心只支持 ES5,错误信息会提示你开启 harmony:Uglifier.new(:harmony => true),或改用 terser 系工具。
⚠️误区 2:wrap_iife: true后 IIFE 括号行为变了—— 开启wrap_iife会自动禁用negate_iife压缩选项,两者互斥,属预期行为。
⚠️误区 3:reduce_vars为什么默认不开?—— 历史上它曾导致 JS 运行错误(见 CHANGELOG 3.1.1 条),Uglifier 默认保守关闭,确认业务无依赖后再手动开启。
⚠️误区 4:mangle: false和compress: false的粒度—— 它们是整个分组开关;只想关闭其中某项变换时,传子哈希覆盖单个键即可(如mangle: { properties: false })。
⚠️误区 5:注释正则匹配不上/* */—— 传给comments的正则不会看到注释首尾符号,匹配/*!应写/^!/而非/^\/\*!/。
总结:Uglifier 压缩配置速查要点
- 选项分 8 组:
output(17) /compress(33) /mangle(6) /mangle_properties(3) /parse(5) /source_map(7) / 顶层(5+),全部默认值以lib/uglifier.rb的DEFAULTS为准 - 想缩小体积:优先动
compress(drop_console、toplevel、passes)和mangle(toplevel: true) - 想安全上线:
output: { comments: :copyright }保留版权、开启source_map生成映射 - 遇到 ES6:
harmony: true(实验性)或换用 terser - 传错选项名会直接抛
ArgumentError: Invalid option,配置时以本表为纲快速排查
把这张速查表收藏起来,下次调 Uglifier 压缩配置时,按分组对号入座即可。
【免费下载链接】uglifierRuby wrapper for UglifyJS JavaScript compressor.项目地址: https://gitcode.com/gh_mirrors/ug/uglifier
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考