Configuration Solutions
1. Install Required Dependencies
# Core dependencies
npm install --save-dev @babel/core @babel/cli @babel/preset-env
# TypeScript support
npm install --save-dev @babel/preset-typescript
# React support
npm install --save-dev @babel/preset-react
# Runtime support (optional but recommended)
npm install --save @babel/runtime
npm install --save-dev @babel/plugin-transform-runtime
2. Basic Configuration (babel.config.js)
module.exports = {
presets: [
// Automatically select transformations based on target environment
['@babel/preset-env', {
targets: {
browsers: ['> 1%', 'last 2 versions', 'not ie <= 8']
},
useBuiltIns: 'usage',
corejs: 3
}],
// TypeScript support
'@babel/preset-typescript',
// React support (includes JSX transformation)
['@babel/preset-react', {
runtime: 'automatic', // React 17+ new JSX transform
development: process.env.NODE_ENV === 'development'
}]
],
plugins: [
// Runtime optimization
['@babel/plugin-transform-runtime', {
corejs: 3,
helpers: true,
regenerator: true
}]
]
};
3. Usage with Webpack
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
'@babel/preset-typescript',
'@babel/preset-react'
]
}
}
}
]
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx']
}
};
4. TypeScript Configuration (tsconfig.json)
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"jsx": "preserve", // Preserve JSX, let Babel handle it
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true, // Required by Babel
"noEmit": true // Babel handles compilation, TS only type checking
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
Advanced Configuration
1. Environment-Specific Configuration
// babel.config.js
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-typescript', '@babel/preset-react'],
env: {
development: {
plugins: [
'react-refresh/babel' // React Fast Refresh
]
},
production: {
plugins: [
'transform-remove-console' // Remove console
]
},
test: {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }]
]
}
}
};
2. Decorator Support
npm install --save-dev @babel/plugin-proposal-decorators
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-typescript', '@babel/preset-react'],
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
'@babel/plugin-proposal-class-properties'
]
};
3. Path Alias Configuration
// babel.config.js
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-typescript', '@babel/preset-react'],
plugins: [
['module-resolver', {
root: ['./src'],
alias: {
'@': './src',
'@components': './src/components',
'@utils': './src/utils'
}
}]
]
};
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@components/*": ["src/components/*"],
"@utils/*": ["src/utils/*"]
}
}
}
Common Issues
1. Separate Type Checking and Compilation
// package.json
{
"scripts": {
"type-check": "tsc --noEmit",
"build": "npm run type-check && babel src --out-dir dist --extensions '.ts,.tsx'"
}
}
2. Handle CSS/SCSS Imports
// Declare module in TypeScript
declare module '*.scss' {
const content: { [className: string]: string };
export default content;
}
3. Hot Reload Configuration
// webpack.config.js
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
module: {
rules: [{
test: /\.(ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
plugins: [
process.env.NODE_ENV === 'development' && 'react-refresh/babel'
].filter(Boolean)
}
}
}]
},
plugins: [
process.env.NODE_ENV === 'development' && new ReactRefreshWebpackPlugin()
].filter(Boolean)
};