Babel 配置 #
配置文件类型 #
Babel 支持多种配置文件格式,每种都有其适用场景:
text
项目根目录/
├── babel.config.js # 项目级配置(推荐)
├── babel.config.json # JSON 格式配置
├── babel.config.cjs # CommonJS 格式
├── babel.config.mjs # ES 模块格式
├── .babelrc.json # 相对路径配置
├── .babelrc # 旧格式(仍支持)
└── package.json # 内嵌配置
babel.config.js(推荐) #
javascript
// babel.config.js
module.exports = function(api) {
api.cache(true);
return {
presets: ['@babel/preset-env'],
plugins: []
};
};
babel.config.json #
json
{
"presets": ["@babel/preset-env"],
"plugins": []
}
babel.config.mjs #
javascript
// babel.config.mjs
export default {
presets: ['@babel/preset-env'],
plugins: []
};
.babelrc.json #
json
{
"presets": ["@babel/preset-env"],
"plugins": []
}
package.json 内嵌 #
json
{
"name": "my-project",
"babel": {
"presets": ["@babel/preset-env"],
"plugins": []
}
}
配置文件选择 #
项目级配置 vs 相对路径配置 #
text
┌─────────────────────────────────────────────────────────────┐
│ 配置文件作用范围 │
├─────────────────────────────────────────────────────────────┤
│ │
│ babel.config.js(项目级) │
│ ├── 作用于整个项目 │
│ ├── 适合 monorepo │
│ └── 推荐用于大多数项目 │
│ │
│ .babelrc.json(相对路径) │
│ ├── 只作用于当前目录及子目录 │
│ ├── 适合特定目录的配置 │
│ └── 可以被 babel.config.js 覆盖 │
│ │
└─────────────────────────────────────────────────────────────┘
配置文件查找顺序 #
text
1. 查找 babel.config.js
2. 查找 babel.config.json
3. 查找 babel.config.cjs
4. 查找 babel.config.mjs
5. 查找 .babelrc.json / .babelrc
6. 查找 package.json 中的 babel 字段
配置选项详解 #
presets #
javascript
module.exports = {
presets: [
// 字符串形式
'@babel/preset-env',
// 数组形式(带选项)
['@babel/preset-env', {
targets: '> 0.25%, not dead',
modules: false
}],
// 带条件的预设
process.env.NODE_ENV === 'test' && '@babel/preset-env'
].filter(Boolean)
};
plugins #
javascript
module.exports = {
plugins: [
// 字符串形式
'@babel/plugin-transform-runtime',
// 数组形式(带选项)
['@babel/plugin-proposal-decorators', { legacy: true }],
// 内联插件
function customPlugin() {
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'
},
// ES 模块支持
targets: {
esmodules: true
}
}]
]
};
modules #
javascript
module.exports = {
presets: [
['@babel/preset-env', {
modules: false, // 保留 ES 模块
modules: 'cjs', // CommonJS
modules: 'amd', // AMD
modules: 'umd', // UMD
modules: 'systemjs', // SystemJS
modules: 'auto' // 自动检测
}]
]
};
useBuiltIns 和 corejs #
javascript
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: {
version: 3,
proposals: true
}
}]
]
};
sourceMaps #
javascript
module.exports = {
sourceMaps: true, // 生成外部 .map 文件
sourceMaps: 'inline', // 内联 source map
sourceMaps: 'both', // 两种都生成
sourceMaps: false // 不生成
};
sourceType #
javascript
module.exports = {
sourceType: 'module', // ES 模块
sourceType: 'script', // 脚本
sourceType: 'unambiguous' // 自动检测
};
assumptions #
javascript
module.exports = {
assumptions: {
arrayLikeIsIterable: true,
constantReexports: true,
enumerableModuleMeta: true,
iterableIsArray: true,
mutableTemplateObject: true,
noClassCalls: true,
noDocumentAll: true,
noIncompleteNsImportDetection: true,
noNewArrows: true,
objectRestNoSymbols: true,
privateFieldsAsProperties: true,
pureGetters: true,
setComputedProperties: true,
setPublicClassFields: true,
setSpreadProperties: true,
skipForOfIteratorClosing: true,
superIsCallableConstructor: true
}
};
环境配置 #
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' } }]
]
}
}
};
使用函数配置 #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
const isProduction = env === 'production';
const isDevelopment = env === 'development';
const isTest = env === 'test';
return {
presets: [
['@babel/preset-env', {
targets: isTest ? { node: 'current' } : '> 0.25%, not dead',
modules: isTest ? 'commonjs' : false
}]
],
plugins: [
'@babel/plugin-transform-runtime',
isDevelopment && '@babel/plugin-transform-react-jsx-source',
isProduction && 'babel-plugin-transform-remove-console'
].filter(Boolean),
sourceMaps: isDevelopment ? 'inline' : true
};
};
环境变量设置 #
bash
# 设置 BABEL_ENV
BABEL_ENV=production babel src -d dist
# 设置 NODE_ENV
NODE_ENV=production babel src -d dist
# package.json scripts
{
"scripts": {
"build": "BABEL_ENV=production babel src -d dist",
"dev": "BABEL_ENV=development babel src -d dist -w",
"test": "BABEL_ENV=test jest"
}
}
overrides 配置 #
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']
},
{
test: '**/*.tsx',
presets: [
'@babel/preset-typescript',
'@babel/preset-react'
]
}
]
};
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']
}
]
};
缓存配置 #
API 缓存 #
javascript
// babel.config.js
module.exports = function(api) {
// 始终缓存
api.cache(true);
// 永不缓存
api.cache(false);
// 根据环境变量缓存
api.cache.using(() => process.env.NODE_ENV);
// 根据多个条件缓存
api.cache.using(() => {
return process.env.NODE_ENV + process.env.BABEL_ENV;
});
// 根据文件变化缓存
api.cache.invalidate(() => {
return api.caller(caller => caller && caller.name);
});
return {
presets: ['@babel/preset-env']
};
};
缓存目录 #
bash
# 默认缓存目录
node_modules/.cache/babel-loader/
# 自定义缓存目录
BABEL_CACHE_PATH=/tmp/babel-cache babel src -d dist
ignore 和 only #
ignore 配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
ignore: [
'./node_modules',
'./dist',
'**/*.test.js',
'**/__tests__/**',
'**/__mocks__/**'
]
};
only 配置 #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
only: [
'./src',
'./lib',
'**/*.js'
]
};
函数形式 #
javascript
module.exports = {
ignore: [
function(filepath) {
return filepath.includes('node_modules');
}
]
};
extends 配置 #
继承其他配置文件:
javascript
// babel.config.js
module.exports = {
extends: './babel.base.config.js',
presets: [
// 追加配置
],
plugins: [
// 追加配置
]
};
共享配置 #
javascript
// @scope/babel-preset-shared/index.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: 3
}]
],
plugins: [
'@babel/plugin-transform-runtime'
]
};
// 项目中使用
// babel.config.js
module.exports = {
extends: '@scope/babel-preset-shared',
plugins: [
// 项目特定插件
]
};
caller 配置 #
caller 用于传递调用者信息:
javascript
// 调用 Babel 时传递 caller
babel.transformSync(code, {
presets: ['@babel/preset-env'],
caller: {
name: 'my-tool',
supportsStaticESM: true,
supportsDynamicImport: true,
supportsTopLevelAwait: true
}
});
// babel.config.js 中使用
module.exports = function(api) {
const supportsESM = api.caller(caller => caller?.supportsStaticESM);
return {
presets: [
['@babel/preset-env', {
modules: supportsESM ? false : 'auto'
}]
]
};
};
测试配置 #
Jest 配置 #
javascript
// babel.config.js
module.exports = function(api) {
const isTest = api.env('test');
return {
presets: [
['@babel/preset-env', {
targets: isTest ? { node: 'current' } : '> 0.25%, not dead',
modules: isTest ? 'commonjs' : false
}]
]
};
};
// jest.config.js
module.exports = {
transform: {
'^.+\\.(js|jsx|ts|tsx)$': 'babel-jest'
}
};
完整配置示例 #
Web 应用 #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
const isProduction = env === 'production';
const isDevelopment = env === 'development';
const isTest = env === 'test';
return {
presets: [
['@babel/preset-env', {
targets: isTest ? { node: 'current' } : '> 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', {
corejs: false,
helpers: true,
regenerator: true
}],
isDevelopment && '@babel/plugin-transform-react-jsx-source',
isProduction && 'babel-plugin-transform-remove-console'
].filter(Boolean),
sourceMaps: isDevelopment ? 'inline' : true,
assumptions: {
setPublicClassFields: true
}
};
};
库开发 #
javascript
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: { node: '12' },
modules: false
}]
],
plugins: [
['@babel/plugin-transform-runtime', {
useESModules: true
}]
],
assumptions: {
constantReexports: true,
enumerableModuleMeta: true
}
};
Monorepo #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
return {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
modules: false
}]
],
overrides: [
{
test: './packages/client/**',
presets: [
['@babel/preset-env', { targets: '> 0.5%, not dead' }],
['@babel/preset-react', { runtime: 'automatic' }]
]
},
{
test: './packages/server/**',
presets: [
['@babel/preset-env', { targets: { node: 'current' } }]
]
},
{
test: './packages/shared/**',
presets: ['@babel/preset-typescript']
}
]
};
};
TypeScript + React #
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-typescript',
['@babel/preset-react', { runtime: 'automatic' }]
],
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }],
'@babel/plugin-transform-runtime',
isProduction && 'babel-plugin-transform-remove-console'
].filter(Boolean)
};
};
配置调试 #
显示配置 #
bash
# 显示当前配置
npx babel --show-config
# 显示特定环境的配置
BABEL_ENV=production npx babel --show-config
# 显示特定文件的配置
npx babel --show-config src/index.js
验证配置 #
bash
# 编译测试
npx babel src --out-dir dist --verbose
# 检查配置文件
npx babel --help
常见问题 #
问题一:配置不生效 #
javascript
// 检查配置文件位置
// babel.config.js 应该在项目根目录
// 检查配置文件名称
// 确保是 babel.config.js 而不是 babel.config.js.txt
// 检查配置语法
// 使用 --show-config 验证
问题二:环境变量不生效 #
bash
# 确保环境变量已设置
echo $BABEL_ENV
# 在 package.json scripts 中设置
{
"scripts": {
"build": "BABEL_ENV=production babel src -d dist"
}
}
问题三:overrides 不生效 #
javascript
// 确保 test 路径正确
module.exports = {
overrides: [
{
// 使用正确的路径格式
test: './src/legacy/**', // 正确
// test: 'src/legacy', // 可能不正确
}
]
};
下一步 #
现在你已经掌握了 Babel 的完整配置,接下来学习 高级特性 了解更多高级用法!
最后更新:2026-03-28