Babel sourceType (Script vs Module)

1. 面试题

Q: Babel 配置中的 sourceType: 'unambiguous' 是什么意思?有什么用?

2. 核心解答

Babel 可以处理两种类型的 JS 代码:Script (脚本)Module (模块)。它通过 sourceType 选项来决定如何解析代码。

(1) 默认行为: "module"

  • Babel 假设所有输入的文件都是 ES Module ( ESM )。
  • 即使文件中没有 import/export 语句,Babel 也会认为它是模块。
  • 严格模式 (Strict Mode):默认在文件开头启用 'use strict'

(2) "script"

  • Babel 将输入视为普通的 JS 脚本 (非模块)。
  • 不启用严格模式 (除非手动添加)。
  • 不允许使用 import/export 语句。

(3) "unambiguous" (自动推断)

这是针对 CommonJS 和 ESM 混合使用的场景 最安全的配置。 Babel 会先扫描整个文件:

  • 如果发现了 importexport 语句,就当作 Module 处理。
  • 如果没发现,就当作 Script 处理。

场景: 如果不设置 unambiguous,Babel 可能会把一些本来不是 ESM 的 CommonJS 文件 (甚至是一些纯脚本) 误判为 ESM,在顶部强制加上 'use strict',导致一些使用了非严格模式语法的第三方库 (如 outdated libs) 报错。

3. 面试加分项

Q: 为什么 Webpack 默认行为是 "module"?

因为 Webpack 本身就是个 Module Bundler,它默认所有被 import 进来的文件都应该是模块。如果某个文件不想被当做模块处理,应该在 module.rules 里显式排除 (Exclude)。

4. 总结

  • Module: Treat as ESM (Strict Mode).
  • Script: Treat as script (No import/export).
  • Unambiguous: Auto-detect based on content.