Babel 工具链集成 #

与 Webpack 集成 #

安装依赖 #

bash
npm install --save-dev babel-loader @babel/core @babel/preset-env

基本配置 #

javascript
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
};

使用配置文件 #

javascript
// babel.config.js
module.exports = {
  presets: ['@babel/preset-env']
};

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      }
    ]
  }
};

完整 Webpack 配置 #

javascript
// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true
          }
        }
      },
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      }
    ]
  },
  resolve: {
    extensions: ['.js', '.jsx', '.ts', '.tsx']
  }
};

React 项目配置 #

javascript
// babel.config.js
module.exports = {
  presets: [
    '@babel/preset-env',
    ['@babel/preset-react', { runtime: 'automatic' }]
  ]
};

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.[jt]sx?$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      }
    ]
  }
};

TypeScript 项目配置 #

javascript
// babel.config.js
module.exports = {
  presets: [
    '@babel/preset-env',
    '@babel/preset-typescript'
  ]
};

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: 'babel-loader'
      }
    ]
  }
};

与 Vite 集成 #

安装依赖 #

bash
npm install --save-dev @babel/core @babel/preset-env

自动集成 #

Vite 默认支持 babel.config.js

javascript
// babel.config.js
module.exports = {
  presets: ['@babel/preset-env']
};

// vite.config.js
// 无需额外配置,Vite 自动读取 babel.config.js

使用插件 #

javascript
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [
    react({
      babel: {
        presets: ['@babel/preset-env'],
        plugins: ['babel-plugin-transform-remove-console']
      }
    })
  ]
});

完整 Vite 配置 #

javascript
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [
    react({
      babel: {
        presets: [
          '@babel/preset-env',
          '@babel/preset-typescript'
        ],
        plugins: [
          '@babel/plugin-transform-runtime'
        ]
      }
    })
  ],
  build: {
    target: 'es2015'
  }
});

与 Rollup 集成 #

安装依赖 #

bash
npm install --save-dev @rollup/plugin-babel @babel/core @babel/preset-env

基本配置 #

javascript
// rollup.config.js
import { babel } from '@rollup/plugin-babel';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  },
  plugins: [
    babel({
      babelHelpers: 'bundled',
      presets: ['@babel/preset-env']
    })
  ]
};

使用配置文件 #

javascript
// babel.config.js
module.exports = {
  presets: ['@babel/preset-env']
};

// rollup.config.js
import { babel } from '@rollup/plugin-babel';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  },
  plugins: [
    babel({
      babelHelpers: 'bundled'
    })
  ]
};

完整 Rollup 配置 #

javascript
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { babel } from '@rollup/plugin-babel';
import terser from '@rollup/plugin-terser';

export default {
  input: 'src/index.js',
  output: [
    {
      file: 'dist/bundle.cjs.js',
      format: 'cjs',
      sourcemap: true
    },
    {
      file: 'dist/bundle.esm.js',
      format: 'es',
      sourcemap: true
    }
  ],
  plugins: [
    resolve(),
    commonjs(),
    babel({
      babelHelpers: 'bundled',
      exclude: 'node_modules/**'
    }),
    terser()
  ],
  external: ['lodash']
};

与 ESLint 集成 #

安装依赖 #

bash
npm install --save-dev eslint @babel/eslint-parser

配置 ESLint #

javascript
// .eslintrc.js
module.exports = {
  parser: '@babel/eslint-parser',
  parserOptions: {
    requireConfigFile: false,
    babelOptions: {
      presets: ['@babel/preset-env']
    }
  },
  extends: ['eslint:recommended'],
  rules: {
    // 自定义规则
  }
};

React 项目配置 #

javascript
// .eslintrc.js
module.exports = {
  parser: '@babel/eslint-parser',
  parserOptions: {
    requireConfigFile: false,
    babelOptions: {
      presets: [
        '@babel/preset-env',
        '@babel/preset-react'
      ]
    },
    ecmaFeatures: {
      jsx: true
    }
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended'
  ],
  plugins: ['react']
};

TypeScript 项目配置 #

javascript
// .eslintrc.js
module.exports = {
  parser: '@babel/eslint-parser',
  parserOptions: {
    requireConfigFile: false,
    babelOptions: {
      presets: [
        '@babel/preset-env',
        '@babel/preset-typescript'
      ]
    }
  },
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended'
  ],
  plugins: ['@typescript-eslint']
};

与 Jest 集成 #

安装依赖 #

bash
npm install --save-dev jest babel-jest @babel/core @babel/preset-env

基本配置 #

javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', { targets: { node: 'current' } }]
  ]
};

// jest.config.js
module.exports = {
  transform: {
    '^.+\\.js$': 'babel-jest'
  }
};

React 测试配置 #

javascript
// babel.config.js
module.exports = function(api) {
  const isTest = api.env('test');

  return {
    presets: [
      ['@babel/preset-env', { targets: isTest ? { node: 'current' } : '> 0.25%' }],
      '@babel/preset-react'
    ]
  };
};

// jest.config.js
module.exports = {
  testEnvironment: 'jsdom',
  transform: {
    '^.+\\.[jt]sx?$': 'babel-jest'
  }
};

TypeScript 测试配置 #

javascript
// babel.config.js
module.exports = function(api) {
  const isTest = api.env('test');

  return {
    presets: [
      ['@babel/preset-env', { targets: isTest ? { node: 'current' } : '> 0.25%' }],
      '@babel/preset-typescript'
    ]
  };
};

// jest.config.js
module.exports = {
  transform: {
    '^.+\\.tsx?$': 'babel-jest'
  }
};

与 Gulp 集成 #

安装依赖 #

bash
npm install --save-dev gulp @babel/core @babel/preset-env gulp-babel

基本配置 #

javascript
// gulpfile.js
const gulp = require('gulp');
const babel = require('gulp-babel');

gulp.task('scripts', () => {
  return gulp.src('src/**/*.js')
    .pipe(babel({
      presets: ['@babel/preset-env']
    }))
    .pipe(gulp.dest('dist'));
});

gulp.task('default', gulp.series('scripts'));

完整 Gulp 配置 #

javascript
// gulpfile.js
const gulp = require('gulp');
const babel = require('gulp-babel');
const sourcemaps = require('gulp-sourcemaps');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');

gulp.task('scripts', () => {
  return gulp.src('src/**/*.js')
    .pipe(sourcemaps.init())
    .pipe(babel({
      presets: ['@babel/preset-env']
    }))
    .pipe(gulp.dest('dist'))
    .pipe(uglify())
    .pipe(rename({ suffix: '.min' }))
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest('dist'));
});

gulp.task('watch', () => {
  gulp.watch('src/**/*.js', gulp.series('scripts'));
});

gulp.task('default', gulp.series('scripts', 'watch'));

与 Node.js 集成 #

使用 @babel/register #

bash
npm install --save-dev @babel/register @babel/core @babel/preset-env
javascript
// 入口文件 (如 require hooks)
require('@babel/register')({
  presets: ['@babel/preset-env'],
  ignore: [/node_modules/]
});

require('./app');

使用 @babel/node #

bash
npm install --save-dev @babel/node @babel/core @babel/preset-env
json
// package.json
{
  "scripts": {
    "dev": "babel-node src/index.js",
    "start": "node dist/index.js",
    "build": "babel src -d dist"
  }
}

生产环境运行 #

javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', {
      targets: { node: 'current' }
    }]
  ]
};

// package.json
{
  "scripts": {
    "build": "babel src -d dist",
    "start": "node dist/index.js"
  }
}

与 TypeScript 编译器集成 #

Babel + tsc 组合 #

json
// tsconfig.json
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "noEmit": true,
    "isolatedModules": true
  }
}
javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', { targets: { node: 'current' } }],
    '@babel/preset-typescript'
  ]
};

// package.json
{
  "scripts": {
    "typecheck": "tsc --noEmit",
    "build": "babel src -d dist --extensions .ts,.tsx",
    "test": "npm run typecheck && npm run build"
  }
}

与其他工具集成 #

与 ESLint + Prettier 集成 #

javascript
// .eslintrc.js
module.exports = {
  parser: '@babel/eslint-parser',
  parserOptions: {
    requireConfigFile: false,
    babelOptions: {
      presets: ['@babel/preset-env']
    }
  },
  extends: [
    'eslint:recommended',
    'prettier'
  ],
  plugins: ['prettier'],
  rules: {
    'prettier/prettier': 'error'
  }
};

// .prettierrc
{
  "semi": true,
  "singleQuote": true
}

与 Husky + lint-staged 集成 #

json
// package.json
{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  },
  "scripts": {
    "lint": "eslint src --fix",
    "format": "prettier --write src/**/*.{js,jsx,ts,tsx}",
    "prepare": "husky install"
  }
}

与 Docker 集成 #

dockerfile
# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

CMD ["npm", "start"]

与 CI/CD 集成 #

yaml
# .github/workflows/ci.yml
name: CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
          cache: 'npm'

      - run: npm ci
      - run: npm run lint
      - run: npm run test
      - run: npm run build

完整项目示例 #

React + Webpack 项目 #

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', { runtime: 'automatic' }]
    ],
    plugins: [
      '@babel/plugin-transform-runtime',
      isProduction && 'babel-plugin-transform-remove-console'
    ].filter(Boolean)
  };
};

// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js'
  },
  module: {
    rules: [
      {
        test: /\.[jt]sx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true
          }
        }
      }
    ]
  }
};

Node.js + TypeScript 项目 #

javascript
// babel.config.js
module.exports = {
  presets: [
    ['@babel/preset-env', { targets: { node: 'current' } }],
    '@babel/preset-typescript'
  ],
  plugins: [
    '@babel/plugin-transform-runtime'
  ]
};

// package.json
{
  "scripts": {
    "build": "babel src -d dist --extensions .ts",
    "dev": "babel-node src/index.ts --extensions .ts",
    "start": "node dist/index.js",
    "typecheck": "tsc --noEmit"
  }
}

下一步 #

现在你已经掌握了 Babel 与各种工具的集成方法,接下来学习 最佳实践 了解更多开发技巧!

最后更新:2026-03-28