Babel 最佳实践 #
配置最佳实践 #
1. 使用 babel.config.js #
javascript
// 推荐:使用 babel.config.js
// babel.config.js
module.exports = function(api) {
api.cache(true);
return {
presets: ['@babel/preset-env']
};
};
// 不推荐:使用 .babelrc
// .babelrc
{
"presets": ["@babel/preset-env"]
}
2. 合理设置 targets #
javascript
// 推荐:设置合理的 targets
module.exports = {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: 3
}]
]
};
// 不推荐:不设置 targets
module.exports = {
presets: ['@babel/preset-env']
};
3. 使用 browserslist 配置 #
json
// package.json
{
"browserslist": {
"production": [
"> 1%",
"last 2 versions",
"not dead"
],
"development": [
"last 1 chrome version",
"last 1 firefox version"
]
}
}
4. 使用函数式配置 #
javascript
// 推荐:使用函数式配置
module.exports = function(api) {
const env = api.env();
return {
presets: [
['@babel/preset-env', {
targets: env === 'test' ? { node: 'current' } : '> 0.25%'
}]
]
};
};
// 不推荐:硬编码配置
module.exports = {
presets: ['@babel/preset-env']
};
Polyfill 最佳实践 #
1. 使用 useBuiltIns: ‘usage’ #
javascript
// 推荐:按需引入
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
// 不推荐:手动引入所有 polyfill
import 'core-js/stable';
2. 避免重复引入 #
javascript
// 问题:多个入口重复引入
// 解决:使用 useBuiltIns: 'usage'
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
3. 库开发使用 runtime #
javascript
// 库开发配置
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
['@babel/plugin-transform-runtime', {
corejs: 3,
helpers: true
}]
]
};
性能优化 #
1. 启用缓存 #
javascript
// babel.config.js
module.exports = function(api) {
api.cache(true);
return {
presets: ['@babel/preset-env']
};
};
javascript
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true
}
}
}
]
}
};
2. 减少编译范围 #
javascript
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
}
};
3. 使用 preset-env 智能转换 #
javascript
// 推荐:让 preset-env 智能选择插件
module.exports = {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead'
}]
]
};
// 不推荐:手动配置大量插件
module.exports = {
plugins: [
'@babel/plugin-transform-arrow-functions',
'@babel/plugin-transform-classes',
'@babel/plugin-transform-template-literals',
// ...更多插件
]
};
4. 并行编译 #
javascript
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
parallelism: true
}
}
}
]
}
};
代码质量 #
1. 配合 ESLint #
javascript
// .eslintrc.js
module.exports = {
parser: '@babel/eslint-parser',
parserOptions: {
requireConfigFile: false,
babelOptions: {
presets: ['@babel/preset-env']
}
},
extends: ['eslint:recommended']
};
2. 使用 TypeScript 检查 #
json
// tsconfig.json
{
"compilerOptions": {
"target": "ESNext",
"noEmit": true,
"strict": true
}
}
javascript
// babel.config.js
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-typescript'
]
};
3. 配置 Source Map #
javascript
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
sourceMaps: true
};
项目结构 #
1. 推荐目录结构 #
text
project/
├── src/
│ ├── index.js
│ └── ...
├── dist/
├── babel.config.js
├── .browserslistrc
├── package.json
└── tsconfig.json (如果使用 TypeScript)
2. 配置文件分离 #
javascript
// babel.config.js
module.exports = {
extends: './babel.base.config.js',
plugins: [
// 项目特定插件
]
};
// babel.base.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead'
}]
]
};
环境配置 #
1. 多环境配置 #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
const config = {
presets: ['@babel/preset-env']
};
switch (env) {
case 'development':
config.sourceMaps = 'inline';
break;
case 'production':
config.plugins = ['babel-plugin-transform-remove-console'];
break;
case 'test':
config.presets = [
['@babel/preset-env', { targets: { node: 'current' } }]
];
break;
}
return config;
};
2. package.json scripts #
json
{
"scripts": {
"build": "BABEL_ENV=production babel src -d dist",
"dev": "BABEL_ENV=development babel src -d dist -w",
"test": "BABEL_ENV=test jest"
}
}
常见问题解决 #
问题一:编译后代码体积过大 #
javascript
// 解决方案:
// 1. 使用 useBuiltIns: 'usage'
// 2. 设置合理的 targets
// 3. 使用 modules: false(配合打包工具)
module.exports = {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: 3,
modules: false
}]
]
};
问题二:装饰器不支持 #
javascript
// 解决方案:安装并配置装饰器插件
module.exports = {
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }]
]
};
问题三:类属性不支持 #
javascript
// 解决方案:安装并配置类属性插件
module.exports = {
plugins: [
['@babel/plugin-proposal-class-properties', { loose: true }]
]
};
问题四:动态导入不支持 #
javascript
// 解决方案:使用 @babel/plugin-syntax-dynamic-import
module.exports = {
plugins: ['@babel/plugin-syntax-dynamic-import']
};
// 或使用 preset-env
module.exports = {
presets: ['@babel/preset-env']
};
问题五:regeneratorRuntime 未定义 #
javascript
// 解决方案:安装 regenerator-runtime
npm install regenerator-runtime
// 配置
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
迁移指南 #
从 Babel 6 迁移到 Babel 7 #
bash
# 1. 卸载旧包
npm uninstall babel-cli babel-core babel-preset-env
# 2. 安装新包
npm install --save-dev @babel/core @babel/cli @babel/preset-env
# 3. 更新配置文件
# .babelrc -> babel.config.js
javascript
// Babel 6 配置
{
"presets": ["env"]
}
// Babel 7 配置
module.exports = {
presets: ['@babel/preset-env']
};
从 @babel/polyfill 迁移 #
bash
# 1. 卸载 @babel/polyfill
npm uninstall @babel/polyfill
# 2. 安装 core-js
npm install core-js
javascript
// 旧配置
import '@babel/polyfill';
// 新配置
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: 3
}]
]
};
从 Stage 预设迁移 #
javascript
// 旧配置
{
"presets": ["@babel/preset-env", "@babel/preset-stage-2"]
}
// 新配置
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-decorators'
]
};
安全最佳实践 #
1. 不要在生产环境使用 @babel/register #
javascript
// 开发环境
if (process.env.NODE_ENV !== 'production') {
require('@babel/register');
}
// 生产环境:预编译
// package.json
{
"scripts": {
"build": "babel src -d dist",
"start": "node dist/index.js"
}
}
2. 限制插件来源 #
javascript
// 只使用官方或可信的插件
module.exports = {
presets: [
'@babel/preset-env',
'@babel/preset-react'
],
plugins: [
'@babel/plugin-transform-runtime'
]
};
3. 定期更新依赖 #
bash
# 检查过时的依赖
npm outdated
# 更新依赖
npm update @babel/core @babel/preset-env
调试技巧 #
1. 显示配置 #
bash
npx babel --show-config
2. 调试编译结果 #
bash
# 输出到控制台
npx babel src/index.js
# 详细输出
npx babel src -d dist --verbose
3. 使用 AST Explorer #
访问 AST Explorer 可视化查看 AST 结构。
4. 插件调试 #
javascript
module.exports = function(babel) {
return {
visitor: {
Identifier(path) {
console.log('Identifier:', path.node.name);
console.log('Parent:', path.parent.type);
}
}
};
};
完整配置模板 #
Web 应用 #
javascript
// babel.config.js
module.exports = function(api) {
const env = api.env();
return {
presets: [
['@babel/preset-env', {
targets: '> 0.25%, not dead',
useBuiltIns: 'usage',
corejs: { version: 3, proposals: true },
modules: false
}],
['@babel/preset-react', { runtime: 'automatic' }]
],
plugins: [
['@babel/plugin-transform-runtime', {
corejs: false,
helpers: true
}],
env === 'production' && 'babel-plugin-transform-remove-console'
].filter(Boolean),
sourceMaps: env !== 'production',
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
}
};
Node.js 项目 #
javascript
// babel.config.js
module.exports = {
presets: [
['@babel/preset-env', {
targets: { node: 'current' }
}]
]
};
总结 #
核心原则 #
- 按需配置:只配置项目需要的插件和预设
- 合理设置目标:使用 targets 减少不必要的转换
- 启用缓存:提升编译性能
- 保持更新:及时更新依赖版本
- 配合其他工具:与 ESLint、TypeScript 等配合使用
检查清单 #
- [ ] 使用 babel.config.js 配置文件
- [ ] 设置合理的 targets
- [ ] 使用 useBuiltIns: ‘usage’
- [ ] 启用缓存
- [ ] 配置 Source Map
- [ ] 配合 ESLint 检查
- [ ] 定期更新依赖
恭喜你完成了 Babel 文档的学习!现在你已经掌握了从入门到专家的完整知识体系。
最后更新:2026-03-28