Babel 安装与配置 #
安装 Babel #
核心包安装 #
Babel 的核心功能由 @babel/core 提供:
bash
# 使用 npm
npm install --save-dev @babel/core
# 使用 yarn
yarn add --dev @babel/core
# 使用 pnpm
pnpm add --save-dev @babel/core
CLI 工具安装 #
命令行工具用于在终端中使用 Babel:
bash
# 安装 CLI
npm install --save-dev @babel/cli
# 安装核心和 CLI
npm install --save-dev @babel/core @babel/cli
预设安装 #
预设包含一组常用插件:
bash
# 安装 env 预设(最常用)
npm install --save-dev @babel/preset-env
# 安装 React 预设
npm install --save-dev @babel/preset-react
# 安装 TypeScript 预设
npm install --save-dev @babel/preset-typescript
完整安装示例 #
bash
# 基础项目
npm install --save-dev @babel/core @babel/cli @babel/preset-env
# React 项目
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react
# TypeScript 项目
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-typescript
# React + TypeScript 项目
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react @babel/preset-typescript
包说明 #
核心包 #
| 包名 | 说明 |
|---|---|
@babel/core |
Babel 核心编译引擎 |
@babel/cli |
命令行工具 |
@babel/parser |
JavaScript 解析器 |
@babel/traverse |
AST 遍历工具 |
@babel/generator |
代码生成器 |
@babel/types |
AST 类型工具 |
预设包 #
| 包名 | 说明 |
|---|---|
@babel/preset-env |
智能环境预设 |
@babel/preset-react |
React JSX 支持 |
@babel/preset-typescript |
TypeScript 支持 |
@babel/preset-flow |
Flow 类型支持 |
运行时包 #
| 包名 | 说明 |
|---|---|
@babel/runtime |
运行时辅助函数 |
@babel/plugin-transform-runtime |
运行时插件 |
core-js |
Polyfill 库 |
regenerator-runtime |
async/await 支持 |
配置文件 #
配置文件类型 #
Babel 支持多种配置文件格式:
text
项目根目录/
├── babel.config.js # 项目级配置(推荐)
├── babel.config.json # JSON 格式配置
├── .babelrc.json # JSON 格式配置
├── .babelrc # 旧格式(仍支持)
└── package.json # 内嵌配置
babel.config.js(推荐) #
使用 JavaScript 配置,灵活性最高:
javascript
// babel.config.js
module.exports = function(api) {
api.cache(true);
return {
presets: [
['@babel/preset-env', {
targets: {
browsers: ['> 1%', 'last 2 versions', 'not dead']
}
}]
],
plugins: []
};
};
babel.config.json #
使用 JSON 格式,适合简单配置:
json
{
"presets": [
["@babel/preset-env", {
"targets": {
"browsers": ["> 1%", "last 2 versions"]
}
}]
],
"plugins": []
}
.babelrc.json #
适用于特定目录的配置:
json
{
"presets": ["@babel/preset-env"],
"plugins": []
}
package.json 内嵌配置 #
json
{
"name": "my-project",
"version": "1.0.0",
"babel": {
"presets": ["@babel/preset-env"],
"plugins": []
}
}
基本配置示例 #
最简配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env']
};
Web 项目配置 #
javascript
// babel.config.js
module.exports = function(api) {
const isProduction = api.env('production');
return {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: 3
}],
'@babel/preset-react'
],
plugins: [
isProduction && 'babel-plugin-transform-remove-console'
].filter(Boolean)
};
};
Node.js 项目配置 #
javascript
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: {
node: 'current'
}
}]
]
};
TypeScript 项目配置 #
javascript
// babel.config.js
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-typescript'
]
};
React + TypeScript 配置 #
javascript
// babel.config.js
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-typescript',
['@babel/preset-react', { runtime: 'automatic' }]
]
};
配置选项详解 #
presets 配置 #
javascript
module.exports = {
presets: [
// 字符串形式
'@babel/preset-env',
// 数组形式(带选项)
['@babel/preset-env', {
targets: { chrome: '80' },
modules: false,
useBuiltIns: 'usage',
corejs: 3
}]
]
};
plugins 配置 #
javascript
module.exports = {
plugins: [
// 字符串形式
'@babel/plugin-transform-arrow-functions',
// 数组形式(带选项)
['@babel/plugin-proposal-decorators', { legacy: true }],
// 内联插件
function myCustomPlugin() {
return {
visitor: {}
};
}
]
};
targets 配置 #
javascript
module.exports = {
presets: [
['@babel/preset-env', {
// 字符串形式
targets: '> 0.25%, not dead',
// 对象形式
targets: {
chrome: '80',
firefox: '78',
safari: '14',
edge: '88'
},
// Node.js
targets: {
node: 'current'
},
// 组合
targets: {
browsers: ['> 1%', 'last 2 versions'],
node: '12'
}
}]
]
};
modules 配置 #
javascript
module.exports = {
presets: [
['@babel/preset-env', {
// 保留 ES 模块
modules: false,
// 转换为 CommonJS
modules: 'cjs',
// 转换为 AMD
modules: 'amd',
// 转换为 UMD
modules: 'umd',
// 转换为 SystemJS
modules: 'systemjs',
// 自动检测
modules: 'auto'
}]
]
};
环境配置 #
多环境配置 #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
const config = {
presets: ['@babel/preset-env'],
plugins: []
};
// 开发环境
if (env === 'development') {
config.sourceMaps = 'inline';
config.plugins.push('@babel/plugin-transform-react-jsx-source');
}
// 生产环境
if (env === 'production') {
config.plugins.push('babel-plugin-transform-remove-console');
}
// 测试环境
if (env === 'test') {
config.presets.push(['@babel/preset-env', { targets: { node: 'current' } }]);
}
return config;
};
使用 env 配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
env: {
development: {
sourceMaps: 'inline',
plugins: ['@babel/plugin-transform-react-jsx-source']
},
production: {
plugins: [
'babel-plugin-transform-remove-console',
'babel-plugin-transform-react-remove-prop-types'
]
},
test: {
presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
}
}
};
设置环境变量 #
bash
# 设置 BABEL_ENV
BABEL_ENV=production babel src --out-dir dist
# 设置 NODE_ENV
NODE_ENV=production babel src --out-dir dist
# package.json scripts
{
"scripts": {
"build": "BABEL_ENV=production babel src --out-dir dist",
"dev": "BABEL_ENV=development babel src --out-dir dist --watch"
}
}
Polyfill 配置 #
安装 Polyfill #
bash
# 安装 core-js
npm install core-js
# 安装 regenerator-runtime(async/await)
npm install regenerator-runtime
# 或安装完整 polyfill
npm install @babel/polyfill
useBuiltIns 配置 #
javascript
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
// 不自动引入 polyfill
useBuiltIns: false,
// 根据使用情况按需引入
useBuiltIns: 'usage',
corejs: 3,
// 根据目标环境引入
useBuiltIns: 'entry',
corejs: 3
}]
]
};
usage 模式 #
javascript
// 配置
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
// 源代码
const arr = [1, 2, 3].includes(2);
const promise = Promise.resolve();
// 编译后(自动注入需要的 polyfill)
import "core-js/modules/es.array.includes.js";
import "core-js/modules/es.promise.js";
var arr = [1, 2, 3].includes(2);
var promise = Promise.resolve();
entry 模式 #
javascript
// 配置
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'entry',
corejs: 3
}]
]
};
// 入口文件
import 'core-js/stable';
import 'regenerator-runtime/runtime';
// Babel 会根据目标环境替换为具体的 polyfill
Source Map 配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
sourceMaps: true, // 生成外部 .map 文件
sourceMaps: 'inline', // 内联 source map
sourceMaps: 'both' // 两种都生成
};
忽略文件配置 #
忽略特定文件 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
ignore: [
'./node_modules',
'./dist',
'**/*.test.js',
'**/__tests__/**'
]
};
仅编译特定文件 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
only: [
'./src',
'./lib'
]
};
extends 配置 #
继承其他配置文件:
javascript
// babel.config.js
module.exports = {
extends: './babel.base.config.js',
presets: [
// 追加或覆盖配置
]
};
overrides 配置 #
针对不同文件使用不同配置:
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
overrides: [
{
test: './src/legacy/**',
presets: [
['@babel/preset-env', { targets: { ie: '11' } }]
]
},
{
test: ['./src/modern/**', './src/new/**'],
presets: [
['@babel/preset-env', { targets: { esmodules: true } }]
]
},
{
test: '**/*.ts',
presets: ['@babel/preset-typescript']
}
]
};
缓存配置 #
javascript
// babel.config.js
module.exports = function(api) {
// 启用缓存
api.cache(true);
// 根据环境缓存
api.cache.using(() => process.env.NODE_ENV);
// 永不缓存
api.cache(false);
return {
presets: ['@babel/preset-env']
};
};
实战配置模板 #
Web 应用模板 #
javascript
// babel.config.js
module.exports = function(api) {
const isProduction = api.env('production');
const isDevelopment = api.env('development');
const isTest = api.env('test');
return {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: { version: 3, proposals: true },
modules: isTest ? 'commonjs' : false
}],
['@babel/preset-react', { runtime: 'automatic' }]
],
plugins: [
'@babel/plugin-transform-runtime',
isDevelopment && '@babel/plugin-transform-react-jsx-source',
isProduction && 'babel-plugin-transform-remove-console'
].filter(Boolean)
};
};
库开发模板 #
javascript
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: { node: '12' },
modules: false
}]
],
plugins: [
['@babel/plugin-transform-runtime', {
useESModules: true
}]
]
};
Monorepo 配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
overrides: [
{
test: './packages/react-app/**',
presets: ['@babel/preset-react']
},
{
test: './packages/node-server/**',
presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
},
{
test: './packages/shared/**',
presets: ['@babel/preset-typescript']
}
]
};
验证配置 #
检查配置 #
bash
# 显示配置
npx babel --show-config
# 显示特定环境的配置
BABEL_ENV=production npx babel --show-config
测试配置 #
bash
# 编译测试
npx babel src --out-dir dist
# 带详细输出
npx babel src --out-dir dist --verbose
常见问题 #
问题一:找不到预设 #
bash
Error: Cannot find module '@babel/preset-env'
解决方案:
bash
npm install --save-dev @babel/preset-env
问题二:配置不生效 #
bash
# 检查配置文件位置
# babel.config.js 应该在项目根目录
# 检查配置文件名称
# 确保是 babel.config.js 而不是 babel.config.js.txt
问题三:Polyfill 重复 #
javascript
// 避免在多个入口重复引入
// 使用 useBuiltIns: 'usage' 自动处理
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
下一步 #
现在你已经掌握了 Babel 的安装和配置,接下来学习 基础使用 开始实际编译代码!
最后更新:2026-03-28