JavaScript Transpiler Configuration
💡 Quick Start: For a concise guide to migrating from Babel to SWC, see Common Upgrades Guide - Babel to SWC.
Default Transpilers​
Shakapacker v9 transpiler defaults depend on the bundler and installation:
- New installations (v9+):
swc- Installation template explicitly sets SWC (20x faster than Babel) - Webpack runtime default:
babel- Used when no explicit config is provided (maintains backward compatibility) - Rspack runtime default:
swc- Rspack defaults to SWC as it's a newer bundler with modern defaults
Key distinction: The installation template (lib/install/config/shakapacker.yml) explicitly sets javascript_transpiler: "swc" for new projects, but if you're upgrading or have no explicit config, webpack falls back to Babel for backward compatibility.
Available Transpilers​
babel- Traditional JavaScript transpiler with wide ecosystem supportswc- Rust-based transpiler, 20-70x faster than Babelesbuild- Go-based transpiler, extremely fastnone- No transpilation (use native JavaScript)
Configuration​
Set the transpiler in your config/shakapacker.yml:
default: &default
# SWC is the default (recommended - 20x faster than Babel)
javascript_transpiler: swc
# To use Babel for backward compatibility
javascript_transpiler: babel
# For rspack users (defaults to swc if not specified)
assets_bundler: rspack
# javascript_transpiler can be set, but rspack defaults to swc
Migration Guide​
Migrating from Babel to SWC​
SWC offers significant performance improvements while maintaining high compatibility with Babel.
1. Install SWC dependencies​
yarn add --dev @swc/core swc-loader
2. Update your configuration​
# config/shakapacker.yml
default: &default
javascript_transpiler: swc
3. Create SWC configuration (optional)​
If you need custom transpilation settings, create config/swc.config.js:
// config/swc.config.js
// This file is merged with Shakapacker's default SWC configuration
// See: https://swc.rs/docs/configuration/compilation
module.exports = {
jsc: {
transform: {
react: {
runtime: "automatic"
}
}
}
}
Important: Use config/swc.config.js instead of .swcrc. The .swcrc file completely overrides Shakapacker's default SWC settings and can cause build failures. config/swc.config.js properly merges with Shakapacker's defaults.
4. Update React configuration (if using React)​
For React projects, ensure you have the correct refresh plugin:
# For webpack
yarn add --dev @pmmmwh/react-refresh-webpack-plugin
# For rspack
yarn add --dev @rspack/plugin-react-refresh
Performance Comparison​
Typical build time improvements when migrating from Babel to SWC:
| Project Size | Babel | SWC | Improvement |
|---|---|---|---|
| Small (<100 files) | 5s | 1s | 5x faster |
| Medium (100-500 files) | 20s | 3s | 6.7x faster |
| Large (500+ files) | 60s | 8s | 7.5x faster |
Compatibility Notes​
Babel Features Not Yet in SWC​
- Some experimental/stage-0 proposals
- Custom Babel plugins (need SWC equivalents)
- Babel macros
Migration Checklist​
- Back up your current configuration
- Install SWC dependencies
- Update
shakapacker.yml - If using Stimulus, ensure
keepClassNames: trueis set inconfig/swc.config.js(automatically included in v9.1.0+) - Test your build locally
- Run your test suite
- Check browser compatibility
- Deploy to staging environment
- Monitor for any runtime issues
Stimulus Compatibility​
If you're using Stimulus, you must configure SWC to preserve class names. See the Using SWC with Stimulus section for detailed instructions.
Quick summary: Add keepClassNames: true to your config/swc.config.js:
module.exports = {
options: {
jsc: {
keepClassNames: true // Required for Stimulus
}
}
}
Starting with Shakapacker v9.1.0, running rake shakapacker:migrate_to_swc automatically creates a configuration with this setting.
Rollback Plan​
If you encounter issues, rolling back is simple:
# config/shakapacker.yml
default: &default
javascript_transpiler: babel # Revert to babel
Then rebuild your application:
bin/shakapacker clobber
bin/shakapacker compile
Environment Variables​
You can also control the transpiler via environment variables:
# Override config file setting
SHAKAPACKER_JAVASCRIPT_TRANSPILER=swc bin/shakapacker compile
# For debugging
SHAKAPACKER_DEBUG_CACHE=true bin/shakapacker compile
Troubleshooting​
Issue: Build fails after switching to SWC​
Solution: Ensure all SWC dependencies are installed:
yarn add --dev @swc/core swc-loader
Issue: React Fast Refresh not working​
Solution: Install the correct refresh plugin for your bundler:
# Webpack
yarn add --dev @pmmmwh/react-refresh-webpack-plugin
# Rspack
yarn add --dev @rspack/plugin-react-refresh
Issue: Decorators not working​
Solution: Enable decorator support in config/swc.config.js:
// config/swc.config.js
module.exports = {
jsc: {
parser: {
decorators: true,
decoratorsBeforeExport: true
}
}
}