"use strict"
詳細に入る前に、まず少し背景を説明します。
- ESM(ECMAScriptモジュール)は常に暗黙的にstrictモードになります。 リンク。
つまり、ESMを使用している場合は、ファイルの先頭に"use strict"
を追加する必要はありません。デフォルトで有効になっています。
- strictモードは単なるサブセットではありません。意図的に通常のコードとは異なるセマンティクスを持っています。
format: 'esm'
すべてのファイルがESMである場合は、"use strict"
について気にする必要はありません。
ファイルにcommonjsモジュールが含まれている場合は、少し複雑になります。ESM出力を生成したいので、commonjsファイルのコードがstrictモードで有効であることを確認する必要があります。Rolldownはstrictモードで解析し、有効でない場合はエラーをスローします。
format: 'esm'
を使用すると、rolldownはコードをstrictモードで解析し、strictモードに関連するエラーをスローします。解析後、rolldownは、存在する場合はすべてのモジュールから"use strict"
を単純に削除します。
ESMはすでにstrictモードなので、出力コードに"use strict"
は含まれません。
format: 'cjs'
commonjs出力を生成する際に"use strict"
を処理するためのいくつかの戦略があります。
RollupはESM入力のみを受け入れるため、常に出力ファイルの先頭に"use strict"
を追加します。
Esbuildは条件付きで"use strict"
を生成しますが(リンク)、完全ではありません。
Esbuildはまた、スコープホイスティングを有効にした状態で、混合されたESMおよびCJSモジュールで"use strict"
を完全に処理することはほぼ不可能であると説明しています(リンク)。
Rolldownは、可能な限り実行可能なコードを生成することを選択しました。
Rolldownは、チャンクのすべてのモジュールが以下の条件を満たす場合にのみ、各チャンクに"use strict"
を追加します
- ESM
- ファイルの先頭に
"use strict"
を持つCommonjsモジュール
それ以外の場合は、チャンクに"use strict"
を追加しません。チャンクに"use strict"
が追加されないため、これは元のESMコードのセマンティクスを変更することに注意してください。
format: 'cjs'
を使用すると、rolldownは最初にstrictモードでコードを解析し、最初の解析でエラーが発生した場合は、非strictモードで再解析します。
"use strict"
によって何が影響を受けるかの詳細については、こちらを参照してください リンク。
format: 'app'
すべてのモジュールが関数内にラップされているため、rolldownは元のモジュールを尊重して、関数ごとに"use strict"
を生成するかどうかを選択できます。