跳至内容

"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"

在 MIT 许可下发布。