为何UglifyJS不混淆指定属性?即使显式要求仍无效果
为什么UglifyJS即使显式要求,也不混淆test、action、type这些属性?
这事儿我之前也碰到过,其实是UglifyJS的默认行为在搞鬼——它内置了一份属性保留黑名单,专门保护那些常见的、容易和DOM/JavaScript原生API冲突的属性名,你提到的test、action、type、text这些全在这份名单里!
从你的测试结果就能看出明显规律:
- 单数形式的
test、action、type、text完全没被混淆,原样保留 - 它们的复数形式
tests、actions、texts则被正常混淆(比如tests变成s,texts变成i),说明复数不在默认黑名单里
为什么要默认保留这些属性?
UglifyJS这么做是为了避免误破坏代码——比如test是正则表达式的核心方法,type是表单元素、事件对象的常用属性,action是表单的提交地址属性,text常用来操作元素文本内容。如果随便混淆这些属性,很可能导致代码调用原生API时出错。
如何强制混淆这些属性?
如果你确定自己代码里的这些属性完全是自定义的,不会和原生API冲突,可以通过清空默认保留列表来让你的混淆规则生效。比如用--mangle-props reserved=[]参数覆盖默认黑名单:
uglifyjs tmp.js -m --mangle-props regex="/^(test|action|type|text)$/" --mangle-props reserved=[]
这样指定的属性就会被正常混淆了。
再看你的测试细节
你尝试过用regex包含这些属性,但依然没生效,就是因为默认保留列表的优先级更高——UglifyJS会先检查属性是否在默认保留名单里,再看你的正则规则。只有清空默认保留列表,你的自定义规则才能覆盖它。
内容的提问来源于stack exchange,提问作者mhchem
相关产品推荐
相关产品推荐

