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' }
    }]
  ]
};

总结 #

核心原则 #

  1. 按需配置:只配置项目需要的插件和预设
  2. 合理设置目标:使用 targets 减少不必要的转换
  3. 启用缓存:提升编译性能
  4. 保持更新:及时更新依赖版本
  5. 配合其他工具:与 ESLint、TypeScript 等配合使用

检查清单 #

  • [ ] 使用 babel.config.js 配置文件
  • [ ] 设置合理的 targets
  • [ ] 使用 useBuiltIns: ‘usage’
  • [ ] 启用缓存
  • [ ] 配置 Source Map
  • [ ] 配合 ESLint 检查
  • [ ] 定期更新依赖

恭喜你完成了 Babel 文档的学习!现在你已经掌握了从入门到专家的完整知识体系。

最后更新:2026-03-28