如何配置Terser仅混淆匹配正则的属性,保留其余变量与函数名?
问题解决思路
你的核心问题在于:Terser默认会开启局部变量/函数参数的混淆,而keep_fnames仅控制函数名的保留,不涉及变量和参数。要实现「保留所有变量/参数/函数名,仅混淆匹配/^_/的属性」,需要调整mangle的核心配置:
修正后的配置
const terserOptions = { compress: { defaults: false, }, format: { beautify: true, comments: "all", }, mangle: { enabled: false, // 关闭全局变量、参数的混淆 keep_fnames: true, // 保留函数名 properties: { enabled: true, // 单独开启属性混淆 regex: /^_/, // 仅混淆以_开头的属性 }, }, };
配置说明
mangle.enabled: false:关闭Terser默认的变量/参数混淆逻辑,这是阻止arg和keepThisVarName被重命名的关键。properties.enabled: true:单独启用对象属性的混淆功能,配合regex: /^_/,仅对以_开头的属性名进行混淆。keep_fnames: true:确保函数名myFunc不被修改。
验证结果
使用上述配置处理你的输入代码,会得到符合预期的输出:
function myFunc(arg) { const keepThisVarName = arg * 2; return { keepThisProp: keepThisVarName, p: keepThisVarName, // '_mangleThisOne' 已被混淆 } }
额外补充:如果需要混淆特定变量(而非属性)
如果你的需求是「仅混淆匹配正则的变量,保留其余所有名称」,Terser没有直接的配置项,但可以通过以下方式实现:
- 先扫描代码,收集所有匹配目标正则的变量名;
- 将所有非匹配变量名加入
mangle.reserved数组,再开启全局混淆。
不过这种方式需要额外的代码扫描逻辑,适合复杂场景。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

