文档
/
实用方案
/

避免标识符冲突

避免跨混淆文件的标识符冲突

当多个 VM 混淆后的文件进入同一个 bundle 时,它们可能声明相同的顶层标识符,从而在解析阶段让页面崩溃。这里说明它为何发生以及如何修复。

症状

您的构建运行正常,但浏览器在应用启动前的解析阶段抛出错误:

browser console

Error

在 bundle 中快速检查一下,就能确认同一个标识符在不止一个 chunk 中被声明:

terminal

Shell

为何会发生

默认情况下,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 手动搭建混淆流程,就需要自行启用随机前缀。

相关选项