strict モードの互換性
VM 難読化では、コードが strict モードで実行されるかどうかをコンパイル時に把握する必要があります。コードが strict モードの挙動に依存している場合は、明示的に宣言しなければなりません。
なぜ必要なのか? VM は実行前にコードをバイトコードにコンパイルします。strict モード特有の挙動(例:this の束縛、重複したパラメーター、arguments オブジェクトの挙動)に対して正しいバイトコードを生成するには、コンパイル時に strict モードのコンテキストを把握している必要があります。
strictMode オプションは、難読化ツールがどのように判断するかを制御します。strictMode: null(デフォルト)と strictMode: false では、コードが strict として扱われるのは、明示的な 'use strict'; ディレクティブ、ES モジュール構文、クラスメソッドなど、strict を宣言している箇所だけです。それ以外はすべて sloppy モードとしてコンパイルされます。strictMode: true はすべての入力を strict として扱います。最終的なバンドルが実際に実行されるコンテキストに合わせてください。
ファイル単位の strict モード
ファイルの先頭に 'use strict'; を追加すると、すべてのコードで strict モードが有効になります。
関数単位の strict モード
特定の関数だけが strict モードを必要とする場合は、その関数の内部に 'use strict'; を追加します。
よくある問題:バンドラーやビルドツールが 'use strict'; を自動的に追加する場合(たとえば、CommonJS やプレーンなスクリプトのソースを strict モードの出力でラップするバンドラーなど)に、バンドル前のソースを難読化すると、VM は strict モードを認識できません。ソースファイルにディレクティブを追加するか、strictMode: true を設定するか、バンドル後に難読化してください。
