乐闻世界logo
搜索文章和话题

How does Babel integrate with build tools like Webpack Vite and Rollup

3月7日 19:42

Babel Integration with Mainstream Build Tools

1. Webpack + Babel

Install Dependencies

bash
npm 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

bash
npm 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

bash
npm 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

FeatureWebpackViteRollupParcel
Default Transpilerbabel-loaderesbuild@rollup/plugin-babelBuilt-in Babel
Config ComplexityHighLowMediumVery Low
Dev SpeedMediumVery FastFastFast
Production OptimizationStrongStrongStrongMedium
Use CaseLarge AppsModern AppsLibrary DevQuick 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'] })
标签:Babel