Babel 配置 sourceType

https://babeljs.io/docs/options#sourcetype (opens in a new tab)

背景:Babel 编译后 'exports is not defined'

原因是第三方库输出的代码居然还包含了 es6 的语法,显然只是通过打包将 esm 模块打到了 commonjs,并没有完全将 es6 语法转译到 es5 语法

sourceType 选项

  • Value Type: "script" | "module" | "unambiguous"
  • Default: "module"

Babel 会默认认为处理的所有文件的模块类型都是 ESM(module),不同的 type 会告诉 Babel 如何解析:

  • script:会按照 ECMAScript Script 语法来解析。没有 import/export 声明语句,也不是 strict mode
  • module:会按照 ECMAScript Module 语法来解析。有 import/export 声明语句,自动会加上 strict mode
  • unambiguous:如果文件有import/export 就认为是 ESM,否则就按照 script 来解析

unambiguous 在对处理未知类型的模块,可能是 CommonJS 输出的模块来说,会十分有用,但会有匹配失败的可能,因为他对没有 import/export 的文件会无脑认为是 script 类型匹配。

**这个选项不仅对于 input 的文件解析起作用,还对转化过程有用。**比如一些 @babel/plugin-transform-runtime 或者 @babel/preset-env 都会根据文件类型来决定是插入 import 还是 require,所以需要设置正确的类型,避免让本是 CommonJS 的文件误插入了 ESM 的 import。

注意:sourceType 属性对于 .mjs 的文件,是不起作用的,因为他 hard code 了 "module"(直接从文件名告诉编译器是 esm 类型)。