"use strict"
在深入探讨细节之前,我们先添加一些背景信息。
- ESM(ECMAScript 模块)始终隐式处于严格模式。 链接。
这意味着,如果你使用 ESM,你不必在文件的顶部添加 "use strict"
。它默认启用。
- 严格模式不仅仅是一个子集:它有意地与普通代码有着不同的语义。
format: 'esm'
如果你所有的文件都是 ESM,你就不需要理会 "use strict"
。
如果你的文件包含 commonjs 模块,事情就会变得有点复杂。由于你想要发出 ESM 输出,你必须确保 commonjs 文件的代码在严格模式下有效。Rolldown 将在严格模式下对其进行解析,如果它无效,它将引发一个错误。
对于 format: 'esm'
,rolldown 会在严格模式下解析你的代码,并引发与严格模式相关的错误。解析后,rolldown 只会简单地删除每个模块中的 "use strict"
(如果存在)。
发出的代码将不包含 "use strict"
,因为 ESM 已经处于严格模式。
format: 'cjs'
在发出 commonjs 输出时,会有几种处理 "use strict"
的策略。
Rollup 总是会在输出文件的顶部添加 "use strict"
,因为它只接受 ESM 输入。
Esbuild 会有条件地发出 "use strict"
(链接)但不是完美地发出。
Esbuild 还解释说,几乎不可能完美地处理包含 ESM 和 CJS 模块混合的 "use strict"
,同时启用作用域提升(链接)。
Rolldown 选择在最大可能性中发出可运行的代码。
当该块中的所有模块均满足以下条件时,Rolldown 才会在每个块中添加 "use strict"
- ESM
- 在文件顶部带有
"use strict"
的 Commonjs 模块
否则,它不会在块中添加 "use strict"
。注意,这会更改原始 ESM 代码的语义,因为 "use strict"
未添加到块中。
使用 format: 'cjs'
,Rolldown 会首先在严格模式下解析你的代码,如果首次解析时抛出错误,它会再次在非严格模式下重新解析代码。
参阅此处以了解有关 "use strict"
会影响哪些内容的更多详细信息 链接。
format: 'app'
由于每个模块都包裹在一个函数内,Rolldown 可以选择根据原始模块来发出每个函数的 "use strict"
。