Налаштування Babel для транспіляції JavaScript
Сучасний JavaScript з операторами ?. та ?? не працює в Internet Explorer 11. JSX та TypeScript теж потребують додаткової обробки. Babel вирішує ці проблеми: він перетворює сучасний код у зрозумілий старим браузерам і транспілює JSX, TypeScript, експериментальні пропозиції TC39 та декоратори. Ми налаштували Babel для десятків проєктів — від лендінгів до великих SaaS. Правильна конфігурація скорочує розмір бандла на 20% і прискорює завантаження сторінок. У цій статті розберемо конфігурацію, яка працює в продакшені.
Що потрібно знати перед налаштуванням?
Сучасна фронтенд-збірка рідко обходиться без Babel. Навіть якщо ви використовуєте SWC для швидкості, Babel залишається незамінним для складних AST-трансформацій та кастомних плагінів. Наш досвід показує: правильно налаштований Babel скорочує час дебагінгу legacy-браузерів на 30% і зменшує витрати на підтримку за рахунок точного підбору поліфилів. Важливо розуміти різницю між пресетами та плагінами — пресети це набори плагінів, а плагіни виконують конкретні трансформації AST.
Як налаштувати Babel: покроково
Встановлення та базова конфігурація
Встановіть залежності однією командою:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react @babel/preset-typescript @babel/plugin-transform-runtime @babel/runtime
Створіть babel.config.json у корені проєкту. Нижче наведений готовий конфіг для сучасного фронтенду з React та TypeScript. Зверніть увагу на секцію env: вона перевизначає налаштування для тестового середовища.
{
"presets": [
[
"@babel/preset-env",
{
"targets": "> 0.5%, last 2 versions, not dead, not ie 11",
"useBuiltIns": "usage",
"corejs": "3.38",
"modules": false
}
],
[
"@babel/preset-react",
{
"runtime": "automatic"
}
],
[
"@babel/preset-typescript",
{
"allExtensions": true,
"isTSX": true
}
]
],
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs": false,
"helpers": true,
"regenerator": true
}
]
],
"env": {
"test": {
"presets": [
["@babel/preset-env", { "targets": { "node": "current" }, "modules": "commonjs" }]
]
}
}
}
Параметр "modules": false критично важливий для збірників — він дозволяє Webpack або Rollup самостійно обробляти ECMAScript modules та виконувати tree-shaking. У тестовому середовищі (Jest) потрібен "modules": "commonjs", оскільки Node.js очікує CommonJS.
Навіщо потрібне розділення на оточення?
Секція env дозволяє перевизначати будь-які налаштування для конкретного оточення. Наприклад, у development можна вимкнути мініфікацію, а в production додати плагіни видалення console.log.Вибір пресетів: таблиця
| Пресет | Призначення | Коли підключати |
|---|---|---|
| @babel/preset-env | Транспіляція сучасного JS під цільові браузери | Завжди (обов'язковий) |
| @babel/preset-react | Трансформація JSX та React-синтаксису | React-проєкти |
| @babel/preset-typescript | Підтримка TypeScript (без перевірки типів) | TypeScript-проєкти |
Targets та browserslist
Замість хардкоду цілей у конфігу Babel краще використовувати .browserslistrc або секцію browserslist у package.json — цей файл автоматично читається Babel, Autoprefixer та іншими інструментами. Приклад для production:
# .browserslistrc
[production]
> 0.5%
last 2 versions
not dead
not ie 11
[development]
last 1 chrome version
last 1 firefox version
last 1 safari version
Browserslist охоплює ~95% активних браузерів. Якщо потрібно підтримати IE 11, додайте "ie 11", але врахуйте — це збільшить обсяг поліфилів на 15–20%.
Декоратори TypeScript
Декоратори (метадані, Angular, MobX, TypeORM) потребують спеціального плагіна:
npm install --save-dev @babel/plugin-proposal-decorators
{
"plugins": [
["@babel/plugin-proposal-decorators", { "version": "2023-11" }]
]
}
Версія "2023-11" — фіналізований стандарт TC39 Stage 3. Для застарілих TypeScript-декораторів (experimentalDecorators: true) використовуйте "legacy".
Написання кастомного плагіна
Babel-плагіни — це функції, що працюють з AST. Приклад: замінюємо всі console.log() на noop у production:
// babel-plugin-remove-console.js
module.exports = function ({ types: t }) {
return {
visitor: {
CallExpression(path) {
const callee = path.get('callee');
if (
callee.isMemberExpression() &&
callee.get('object').isIdentifier({ name: 'console' }) &&
callee.get('property').isIdentifier({ name: 'log' })
) {
path.remove();
}
},
},
};
};
Підключіть плагін через секцію env у babel.config.json. Кастомний плагін може робити що завгодно — від заміни викликів API до інлайн-ресурсів. Це дає гнучкість, недоступну в SWC.
Інтеграція з інструментами збірки
Webpack
Встановіть babel-loader та додайте правило в webpack.config.js. Увімкніть кешування для прискорення повторних збірок.
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
cacheDirectory: true,
cacheCompression: false,
},
},
},
],
},
};
Jest
Jest автоматично підхоплює babel-конфіг, якщо є babel.config.json. Для окремого конфігу вкажіть шлях у jest.config.js.
// jest.config.js
module.exports = {
transform: {
'^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { configFile: './babel.config.test.json' }],
},
};
Процес налаштування та строки
Налаштування Babel під ключ включає:
- Конфігурацію
babel.config.jsonз оптимізованими пресетами під ваші цілі. - Інтеграцію з Webpack, Vite або іншим збірником.
- Налаштування поліфилів через core-js (використання
useBuiltIns: 'usage'скорочує розмір бандла на 20–30% порівняно з'entry'). - Документацію щодо browserslist та оточень.
- Підтримку кастомних плагінів при необхідності.
- Тестування збірки на всіх цільових браузерах.
| Тип налаштування | Час |
|---|---|
| Базова (React/TypeScript) | 1–2 години |
| З декораторами та поліфилами | 4–8 годин |
Вартість розраховується індивідуально — залежить від складності проєкту та кількості оточень. Зв'яжіться з нами для безкоштовного аудиту поточної збірки, і ми підберемо оптимальну конфігурацію.
Прискорення збірки та аналіз
Babel може бути вузьким місцем. Використовуйте кешування (cacheDirectory: true), а для production-збірки розгляньте заміну на SWC. Але якщо потрібні нестандартні трансформації — Babel поза конкуренцією.
Проаналізуйте, що саме транспілюється, за допомогою CLI: npx babel src/index.ts --out-file /dev/stdout --presets @babel/preset-typescript,@babel/preset-env.
Чому варто довірити налаштування професіоналам?
Неправильна конфігурація Babel призводить до дублювання поліфилів, збільшення бандла та падіння швидкості завантаження. Ми за час роботи налаштували Babel для 50+ проєктів і гарантуємо коректну роботу у всіх цільових браузерах. Замовте налаштування Babel під ваш проєкт — і ми підберемо оптимальну конфігурацію.







