Babel Integration with Mainstream Build Tools
1. Webpack + Babel
Install Dependencies
bashnpm install --save-dev babel-loader @babel/core @babel/preset-env
Basic Configuration
javascript// webpack.config.js module.exports = { module: { rules: [ { test: /\.(js|jsx|ts|tsx)$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { cacheDirectory: true, // Enable cache presets: [ '@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript' ] } } } ] } };
Advanced Configuration
javascript// webpack.config.js module.exports = { module: { rules: [ { test: /\.(js|ts)x?$/, include: [ path.resolve(__dirname, 'src'), // Include third-party libs that need compilation path.resolve(__dirname, 'node_modules/some-es6-lib') ], use: [ { loader: 'thread-loader', // Multi-threading options: { workers: 2 } }, { loader: 'babel-loader', options: { cacheDirectory: true, cacheCompression: false } } ] } ] } };
2. Vite + Babel
Vite uses esbuild by default, but can use Babel via plugins.
Install Dependencies
bashnpm install --save-dev vite-plugin-babel
Configuration
javascript// vite.config.js import { defineConfig } from 'vite'; import babel from 'vite-plugin-babel'; export default defineConfig({ plugins: [ babel({ babelConfig: { babelrc: false, configFile: false, presets: ['@babel/preset-env'] } }) ] });
Using @vitejs/plugin-react
javascript// vite.config.js import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [ react({ // Use Babel instead of default esbuild babel: { plugins: [ ['@babel/plugin-proposal-decorators', { legacy: true }] ] } }) ] });
3. Rollup + Babel
Install Dependencies
bashnpm install --save-dev @rollup/plugin-babel
Basic Configuration
javascript// rollup.config.js import babel from '@rollup/plugin-babel'; import resolve from '@rollup/plugin-node-resolve'; export default { input: 'src/index.js', output: { file: 'dist/bundle.js', format: 'esm' }, plugins: [ resolve(), babel({ babelHelpers: 'bundled', // or 'runtime' exclude: 'node_modules/**', presets: ['@babel/preset-env'] }) ] };
Library Development Configuration
javascript// rollup.config.js import babel from '@rollup/plugin-babel'; export default { input: 'src/index.js', output: [ { file: 'dist/index.cjs.js', format: 'cjs' }, { file: 'dist/index.esm.js', format: 'esm' } ], plugins: [ babel({ babelHelpers: 'runtime', // Recommended for library dev plugins: ['@babel/plugin-transform-runtime'] }) ], external: [/@babel\/runtime/] // Don't bundle runtime };
4. Parcel + Babel
Parcel has built-in Babel support, automatically recognizes .babelrc or babel.config.js.
javascript// babel.config.js module.exports = { presets: ['@babel/preset-env', '@babel/preset-react'] };
5. Gulp + Babel
javascript// gulpfile.js const gulp = require('gulp'); const babel = require('gulp-babel'); function transpile() { return gulp.src('src/**/*.js') .pipe(babel({ presets: ['@babel/preset-env'] })) .pipe(gulp.dest('dist')); } exports.default = transpile;
Build Tools Comparison
| Feature | Webpack | Vite | Rollup | Parcel |
|---|---|---|---|---|
| Default Transpiler | babel-loader | esbuild | @rollup/plugin-babel | Built-in Babel |
| Config Complexity | High | Low | Medium | Very Low |
| Dev Speed | Medium | Very Fast | Fast | Fast |
| Production Optimization | Strong | Strong | Strong | Medium |
| Use Case | Large Apps | Modern Apps | Library Dev | Quick Prototypes |
Best Practices
1. Share Babel Configuration
javascript// babel.config.js - Shared by all tools module.exports = { presets: ['@babel/preset-env'], env: { test: { presets: [['@babel/preset-env', { targets: { node: 'current' } }]] } } };
2. Conditional Configuration
javascript// babel.config.js module.exports = (api) => { const isWebpack = api.caller((caller) => caller?.name === 'babel-loader'); const isTest = api.env('test'); return { presets: [ ['@babel/preset-env', { modules: isWebpack ? false : 'auto', targets: isTest ? { node: 'current' } : { browsers: ['> 1%'] } }] ] }; };
3. Monorepo Configuration
javascript// babel.config.js (root) module.exports = { presets: ['@babel/preset-env'], overrides: [ { test: /packages\/app-a/, presets: ['@babel/preset-react'] }, { test: /packages\/app-b/, presets: ['@babel/preset-typescript'] } ] };
Common Issues
1. Babel Not Working in Webpack
javascript// Ensure correct resolve configuration resolve: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }
2. JSX Transformation Issues in Vite
javascript// Use @vitejs/plugin-react instead of manual config import react from '@vitejs/plugin-react'; export default { plugins: [react()] };
3. Rollup Library Development Helpers Issue
javascript// Use runtime helpers to avoid duplicate code babel({ babelHelpers: 'runtime', plugins: ['@babel/plugin-transform-runtime'] })