難読化したファイル間での識別子の衝突を避ける
複数の VM 難読化ファイルが同じバンドルに含まれると、同じトップレベル識別子を宣言してしまい、パース時にページがクラッシュすることがあります。ここでは、なぜそれが起こるのか、そしてどう解決するのかを説明します。
症状
ビルドは問題なく通るのに、アプリが起動する前のパース時にブラウザが例外を投げます:
バンドル全体をざっと確認すると、同じ識別子が複数のチャンクで宣言されていることがわかります:
なぜこれが起こるのか
デフォルトでは、VM 難読化は mangled-shuffled 識別子名ジェネレータを使用します。これは小さなアルファベットを
決定論的にシャッフルした順序でたどり、ランタイムが導入するグローバルには vm プレフィックスを追加します。両方のファイルが
同じシャッフルされたシーケンスから識別子を発行するため、各ファイルの最初のグローバルは同じ名前を共有し、2 番目も別の名前を共有し、という具合になります。
各ファイルは独立して難読化され、ジェネレータはファイルごとにシーケンスの先頭から再開します。2 つのファイルが
同じバンドルに含まれると、名前が衝突します。2 つのトップレベルの const vmd = … 宣言が同じスコープに入り、
パーサーは 2 番目を拒否します。
解決方法
以下のいずれかを選んでください。最初の選択肢が推奨される解決策です:
randomIdentifiersPrefixを有効にする(推奨)各難読化の実行ごとに、生成されるすべての識別子に固有のランダムなプレフィックスが付与されます。異なるファイルの名前が 名前空間を共有しなくなるため、手作業でプレフィックスを調整しなくても衝突がなくなります。
ファイルごとに固有の
identifiersPrefixを設定する各ファイルを難読化する際に、手動で異なるプレフィックスを渡します(例: 一方に
identifiersPrefix: 'auth_'、 もう一方にcheckout_)。効果的ですが、ファイルが多いとミスが起こりやすいため、上記のランダムオプションを推奨します。identifierNamesGeneratorをhexadecimalに切り替える16 進数の名前ははるかに大きな鍵空間を使うため、2 つのファイルが同じ識別子を生成する可能性は ごくわずかになります。トレードオフ: 識別子が
mangled-shuffledの出力よりも長くなるため、バンドルがわずかに 大きくなります。バンドラプラグインまたは複数ファイルの一括 UI を使う
ほとんどの公式バンドラプラグイン(webpack、Rollup、Vite)は、ビルド内のファイル間でプレフィックスの一意性を 自動的に処理します。obfuscator.io の UI も、複数ファイルの一括難読化を使う場合はこれを処理します。npm API を使って 難読化を手動で組んでいる場合は、自分でランダムプレフィックスを有効にする必要があります。
関連オプション
randomIdentifiersPrefix— ビルドごとのランダムプレフィックス(推奨)identifiersPrefix— 明示的なプレフィックス文字列identifierNamesGenerator— 名前の形式(mangled、hexadecimal、…)
