Babel 是一个基于 AST 的 JavaScript 编译器,将 ES2015+、JSX 等新语法转换为向后兼容的 ES5 代码;其工作流程为解析→转换→生成,需配合 @babel/preset-env 和 core-js 实现语法转换与 polyfill 注入。
Babel 是一个 JavaScript 编译器,主要作用是把用新标准写的代码(比如 ES2015+、JSX、TypeScript)转换成能在旧版浏览器或环境中运行的向后兼容的 JavaScript 代码(通常是 ES5)。
浏览器对新语法的支持有延迟,比如可选链 ?.、空值合并 ??、顶层 await、装饰器等,在老版本 Chrome 或 IE 中直接运行会报错。Babel 在构建阶段提前做转换,让开发者能放心用新特性,又不牺牲兼容性。
Babel 不是简单地“字符串替换”,而是基于 AST(抽象语法树)工作的:
最常用方式是配合构建工具(如 Webpack、Vite、Rollup),也可以命令行单独使用:
npm install --save-dev @babel/core @babel/cli @babel/preset-env
babel.config.json:
{
"presets": ["@babel/preset-env"]
}npx babel src/index.js --out-file dist/index.js
注意:@babel/preset-env 默认只转语法(syntax),不补 API(如 Promise、Array.from)。需搭配 core-js 和 useBuiltIns: 'usage' 才能自动注入缺失的 polyfill。
输入(ES2025):
const arr = [1, 2, 3]; const first = arr.at(-1); const value = obj?.user?.name ?? 'Anonymous';
经 Babel + preset-env 处理后可能变成(ES5 风格):
var arr = [1, 2, 3]; var first = arr[arr.length - 1]; var value = obj === null || obj === void 0 ? void 0 : (obj.user === null || obj.user === void 0 ? void 0 : obj.user.name) !== null && obj.user.name !== void 0 ? obj.user.name : 'Anonymous';
实际输出取决于你的 targets 配置(如 {"chrome": "58"}),Babel 会按需精简转换内容,避免冗余。