news 2026/8/26 20:12:43

Uglifier选项完全速查表:60+压缩配置参数一文看懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Uglifier选项完全速查表:60+压缩配置参数一文看懂

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.rbDEFAULTS常量中,文档列表见 README 的 "Available options" 一节:

选项分组参数数量管什么对应小节
output17压缩后代码的"长相":引号、换行、注释、美化output
compress33压缩器核心变换:删死代码、内联变量、优化循环compress
mangle6变量/函数名混淆(改名缩短)mangle
mangle_properties3对象属性名混淆mangle_properties
parse5如何解析输入源码parse
source_map7生成源码映射,方便线上排错source_map
顶层选项5+defineencloseharmony等全局开关顶层

关键规则:任何分组选项都可以整体设为false完全禁用(如compress: false跳过全部压缩变换),设为true或传子哈希则与默认值合并。

output 选项速查:控制压缩文件的 17 个输出参数

output组不改变逻辑,只改变压缩产物的"外观"。

选项默认值作用
ascii_onlytrue非 ASCII 字符转义为 \x 序列
comments:copyright注释保留策略::all:jsdoc:copyright:none或正则
inline_scriptfalse转义字符串中的</script,防止内联脚本提前闭合
quote_keysfalse给对象字面量的键加引号
max_line_len32768压缩代码的最大行宽
bracketizefalse给 if/for 等单语句块强制加花括号
semicolonstrue用分号分隔语句(更省字节)
preserve_linefalse保留输出行数与原文件一致
beautifyfalse美化输出(用于调试阅读)
indent_level4beautify 时缩进空格数
indent_start0beautify 起始缩进级别
width80beautify 时的换行宽度
preamblenil在产物开头插入自定义代码或注释(如 banner)
wrap_iifefalse用括号包裹 IIFE;注意会关闭negate_iife
shebangtrue保留 shell 脚本首行的#!
quote_style0引号风格:0自动 /:single/:double/:original
keep_quoted_propsfalse保留属性名原有的引号

保留版权注释的两种常用写法:默认:copyright已会保留含Copyright!开头的注释;想用自定义正则时,注意注释首尾符号(/**///)会被剥离、无法参与匹配,例如保留/*! ... */应写Uglifier.new(output: {comments: /^!/})

compress 选项速查:决定压缩强度的 33 个核心参数

compress是 Uglifier 选项中最重的一组,控制 UglifyJS 对代码做哪些变换。整体设为false可只做混淆不做压缩。

代码清理类

选项默认值作用
dead_codetrue删除不可达的死代码
drop_debuggertrue删除debugger;语句
drop_consolefalse删除console.*调用(生产环境强烈建议开启)
unusedtrue丢弃未引用的函数和变量
side_effectstrue允许移除带@preserve纯函数注释标记的调用
keep_infinityfalse防止把Infinity压缩成1/0
switchestrue去重并移除不可达的 switch 分支

表达式优化类

选项默认值作用
sequencestrue用逗号运算符合并多条语句
propertiestrueobj["a"]改写为更短的obj.a
conditionalstrue优化 if 与三元表达式
comparisonstrue对比较运算做二值优化
evaluatetrue尝试折叠常量表达式
booleanstrue布尔上下文各种简化
loopstrue条件可静态判断时优化 while/do
if_returntrue优化 if/return、if/continue 结构
unsafe_compsfalse翻转<<=>>=以利压缩(有对象操作数时不安全)

变量与函数变换类

选项默认值作用
join_varstrue合并连续的var声明
hoist_funstrue提升函数声明
hoist_varsfalse提升var声明
collapse_varsfalse合并单次使用的 var/const 定义
reduce_varsfalse把"只赋值一次且按常量使用"的变量折叠掉
reduce_funcsfalse内联单次使用的函数(依赖 reduce_vars)
negate_iifetrue取反 IIFE 条件以省去多余括号
toplevelfalse连同顶层作用域一起丢弃未引用代码
top_retain[]顶层白名单,阻止unused删除指定函数/变量
passes1压缩遍历轮数,调大更省体积但更耗时
keep_fargsfalse保留未使用的函数参数
keep_fnamesfalse不丢弃函数定义中的名字

"unsafe" 系列与纯函数假设

选项默认值作用
unsafefalse开启各类"不安全"变换的总开关
unsafe_mathfalse2 * x * 3优化为6 * x(浮点精度可能受影响)
unsafe_protofalseArray.prototype.slice.call(a)优化为[].slice.call(a)
pure_gettersfalse假定属性访问无副作用(开启后才能删"纯"属性读取)
pure_funcsnil列出无副作用函数,结果未使用时可安全删掉调用

mangle 与 mangle_properties:变量混淆怎么配

mangle负责把变量、函数名替换成 a、b、c 这类短名,是缩小体积的大头。

选项默认值作用
mangletrue(哈希)设为false可整体跳过混淆
evalfalse作用域内出现 eval 时是否仍混淆
reserved["$super"]不参与混淆的参数名白名单
sortfalse按使用频率分配短名(gzip 后体积可能反而变大)
toplevelfalse是否混淆顶层作用域的名字
propertiesfalse开启属性名混淆(实际由 mangle_properties 细调)
keep_fnamesfalse不修改函数名(依赖Function.prototype.name时开启)

mangle_properties属性混淆默认关闭,单独细调时支持:

选项默认值作用
regexnil正则过滤"哪些属性名参与混淆"
ignore_quotedfalse只混淆不带引号的属性名
debugfalse混淆后保留原名前后缀,便于调试

parse 选项:告诉 Uglifier 如何解析输入源码

选项默认值作用
bare_returnsfalse允许顶层return语句
expressionfalse把输入当单个表达式解析(如解析 JSON)
html5_commentstrue忽略 HTML5 风格注释
shebangtrue支持首行#!command
strictfalse严格模式解析

source_map 选项:7 个参数搞定源码映射

线上压缩代码报错行号对不上?开启源映射即可。Uglifier.new.compile_with_map(source)会返回压缩代码与 map;若source_map选项传true,产物末尾会自动追加 base64 内联的sourceMappingURL

选项默认值作用
map_urlfalse追加到产物末尾的 source map 文件地址
urlfalse追加的原始源码地址(sourceURL)
sources_contentfalse把原始源码内容内嵌进 map 文件
filenamenil输入文件名
rootnil输入文件所在目录的 URL
output_filenamenil压缩产物的文件名/URL
input_source_mapnil输入文件自身的 source map 内容

顶层选项:harmony、define、enclose 等全局开关

选项默认值作用
harmonyfalse启用 ES6/Harmony 实验模式(内部切换lib/uglify-harmony.js);官方建议配合关闭 mangle 与 compress
define{}定义符号替换值,如把DEBUG替换为false以触发死代码消除
enclosefalse用函数包裹输出,并以键值对注入外部变量
keep_fnamesfalse一键同时开启 compress 与 mangle 的keep_fnames
error_context_lines8报错信息中上下文行数(环境变量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: falsecompress: 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.rbDEFAULTS为准
  • 想缩小体积:优先动compressdrop_consoletoplevelpasses)和mangletoplevel: 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 20:10:03

接到第十个系统那天我崩溃了:MCP 到底解决了什么问题

AI 应用技术全景图 第7篇 / 共16篇 在这里插入图片描述 大家好,我是程序猿Joe。 上一篇讲完 Function Calling,我们那套助手已经能查订单、提工单、发通知了。当时我还挺得意,觉得这活儿干得挺漂亮。然后需求就一个接一个来了。 接 Jira,写一套 schema、一套鉴权、一套…

作者头像 李华
网站建设 2026/8/26 20:09:39

微信防撤回补丁怎么用:RevokeMsgPatcher 实操指南

微信防撤回补丁怎么用&#xff1a;RevokeMsgPatcher 实操指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/Gi…

作者头像 李华
网站建设 2026/8/26 20:09:35

【LGR-298-Div.2】洛谷 8 月月赛 III IXOI Round 2 记录

【LGR-298-Div.2】洛谷 8 月月赛 III & IXOI Round 2 A #include<iostream> #include<cstring> #include<vector> #include<cmath> #include<map> #include<algorithm> using namespace std; long long n; int main() {ios::sync_wit…

作者头像 李华
网站建设 2026/8/26 20:09:02

老款Mac升级最新macOS完整指南:用OpenCore Legacy Patcher免费搞定

老款Mac升级最新macOS完整指南&#xff1a;用OpenCore Legacy Patcher免费搞定 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher 是一…

作者头像 李华
网站建设 2026/8/26 20:07:03

FlowNib 一键分发实测:从单篇母稿到全网适配的真实效果

做社交媒体运营最让人崩溃的瞬间&#xff0c;往往不是想不出创意&#xff0c;而是同一个内容要在十个不同的后台重复粘贴、调整格式、重新上传。你刚在 LinkedIn 发完一篇深度长文&#xff0c;转头就要把同样的核心信息压缩成 Twitter 的短讯&#xff0c;再给 Instagram 配上一…

作者头像 李华