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 会先扫描整个文件:
- 如果发现了
import或export语句,就当作 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.

