避免跨混淆文件的标识符冲突
当多个 VM 混淆后的文件进入同一个 bundle 时,它们可能声明相同的顶层标识符,从而在解析阶段让页面崩溃。这里说明它为何发生以及如何修复。
症状
您的构建运行正常,但浏览器在应用启动前的解析阶段抛出错误:
在 bundle 中快速检查一下,就能确认同一个标识符在不止一个 chunk 中被声明:
为何会发生
默认情况下,VM 混淆使用 mangled-shuffled 标识符名称生成器。它以
确定性的乱序遍历一个小字母表,并为运行时引入的全局变量添加 vm 前缀。两个文件都从
同一个乱序序列中产生标识符 —— 于是每个文件的第一个全局变量共用一个名称,第二个又共用另一个,以此类推。
每个文件都是独立混淆的,生成器会为每个文件从其序列的开头重新开始。当
两个文件进入同一个 bundle 时,名称就会冲突。两个顶层 const vmd = … 声明落入同一个
作用域,解析器便会拒绝第二个。
修复方法
请从以下方法中选择其一 —— 第一项是推荐的修复:
启用
randomIdentifiersPrefix(推荐)每次混淆运行都会获得一个唯一的随机前缀,加在每个生成的标识符之前。来自不同文件的名称 不再共享一个命名空间,因此冲突消失,而您无需手动协调各个前缀。
为每个文件设置唯一的
identifiersPrefix在混淆每个文件时手动传入不同的前缀(例如一个用
identifiersPrefix: 'auth_',另一个用checkout_)。有效,但当文件很多时容易出错 —— 请优先使用上面的随机选项。将
identifierNamesGenerator切换为hexadecimal十六进制名称使用大得多的键空间,因此两个文件产生相同标识符的概率 微乎其微。代价:标识符比
mangled-shuffled的输出更长,因此 bundle 会略微 变大。使用打包工具插件或多文件批量 UI
大多数官方打包工具插件(webpack、Rollup、Vite)会在一次构建中自动处理跨文件的前缀 唯一性。当您使用多文件批量混淆时,obfuscator.io UI 同样会处理它。如果您用 npm API 手动搭建混淆流程,就需要自行启用随机前缀。
相关选项
randomIdentifiersPrefix—— 每次构建的随机前缀(推荐)identifiersPrefix—— 显式的前缀字符串identifierNamesGenerator—— 名称形态(mangled、hexadecimal等)
