Спустя 8 лет после Babel 7 вышел Babel 8 — релиз модернизации, а не новых возможностей. ESM-only пакеты, встроенные типы TypeScript и обновлённые настройки по умолчанию, отражающие современный JavaScript-ландшафт. Что изменилось и как мигрировать.
16 июня 2026 года команда Babel выпустила Babel 8.0.0 — первое мажорное обновление за 8 лет. Это не релиз новых возможностей. Babel 8 не содержит новых трансформов, новых возможностей парсера или новых предложений сверх того, что уже поддерживает Babel 7. Вместо этого это релиз модернизации, который расчищает 8 лет накопившегося технического долга и двигает JavaScript-экосистему вперёд.
Использование Babel взлетело за последние 8 лет: с 1,7 миллиона еженедельных загрузок в 2018 году до 651 миллиона в июне 2026-го. С таким масштабом приходит огромная ответственность — даже незначительные критические изменения могут заблокировать сотни тысяч разработчиков. Команда Babel подошла к релизу исключительно аккуратно: с длительным бета-периодом (первая альфа вышла в 2023 году) и многолетним циклом деприкации.
Вот что меняется в Babel 8 по сравнению с Babel 7:
@types/babel__*.@babel/preset-env использует настройки browserslist по умолчанию (~ES2023).loose и spec удалены из preset-env, помечены устаревшими в плагинах. Используйте assumptions.corejs/useBuiltIns заменены на babel-plugin-polyfill-corejs3.
Самое структурное изменение в Babel 8 — все пакеты теперь распространяются только как ES-модули.
Это касается @babel/core, @babel/preset-env, @babel/parser,
@babel/cli и всех остальных официальных пакетов.
Почему? С появлением require(esm) во всех активных LTS-версиях Node.js переход на ESM-only
— естественный шаг. Он позволяет команде Babel модернизировать собственную кодовую базу, уменьшить
размеры пакетов и упростить пайплайн сборки — не ломая проекты, которые всё ещё используют CommonJS
в прикладном коде.
Если вы используете Babel программно (например, require('@babel/core') в CommonJS-файле),
у вас два варианта:
"type": "module" в package.json
и использовать import вместо require().import() в CommonJS-файлах — const babel = await import('@babel/core').// Было (Babel 7, CJS):
const babel = require('@babel/core');
babel.transformSync(code, options);
// Стало (Babel 8, асинхронный import в CJS):
const babel = await import('@babel/core');
const result = await babel.transformAsync(code, options);
// Стало (Babel 8, ESM-проект):
import * as babel from '@babel/core';
const result = await babel.transformAsync(code, options);
Babel 8 требует Node.js 22, 24, 26 или новее. Node.js 20 и 25 достигли конца жизненного цикла и не будут получать исправления безопасности. Если вы всё ещё на старой версии — сначала обновите Node.js, затем мигрируйте на Babel 8.
Babel 8 поставляет собственные определения типов TypeScript (.d.ts файлы)
для каждого официального пакета. Это значит, что вам больше не нужно устанавливать
@types/babel__* из DefinitelyTyped — типы идут напрямую из исходников Babel
и всегда синхронизированы с кодом.
// Было — требовались отдельные типы:
npm install @babel/core @types/babel__core
// Стало — типы входят в пакет:
npm install @babel/core
// Типы встроены — используйте напрямую:
import { transformAsync, TransformOptions } from '@babel/core';
Команда Babel годами поддерживала собственные типы внутри проекта, и теперь они наконец доступны пользователям. Типы покрывают полный публичный API: core, parser, генераторы, preset-env и все официальные плагины и пресеты.
Это изменение затронет больше всего проектов. В Babel 7 @babel/preset-env
по умолчанию компилировал всё до ES5 — уровня Internet Explorer 11.
В Babel 8 preset-env использует настройки browserslist по умолчанию,
что сейчас примерно соответствует ES2023.
На практике это означает, что меньше кода транспилируется. Такие возможности как
async/await, классы, стрелочные функции, for...of и шаблонные
строки больше не компилируются по умолчанию. Ваши бандлы становятся меньше,
а сборка — быстрее.
// Babel 7 по умолчанию: компилирует всё до ES5
// Babel 8 по умолчанию: использует browserslist defaults (~2% рынка)
// Если вам всё ещё нужен ES5, укажите targets явно:
// babel.config.json
{
"presets": [
["@babel/preset-env", {
"targets": "> 0.25%, ie 11"
}]
]
}
loose и spec — используйте assumptions
Долгие годы Babel поддерживал опции loose и spec для баланса между
соответствием спецификации и размером/производительностью вывода. Проблема: часто было
непонятно, что именно эти опции делают. Разработчик, включающий loose: true
на preset-env, мог не осознавать, что это влияет на всё — от полей классов до
вычисляемых свойств и итераторов.
В Babel 8 loose и spec удалены из @babel/preset-env
и помечены устаревшими в отдельных плагинах. Замена — assumptions,
тонкая система, появившаяся в Babel 7.13, которая позволяет контролировать каждое отклонение
от спецификации по отдельности.
// Было (Babel 7):
{
"presets": [
["@babel/preset-env", { "loose": true }]
]
}
// Стало (Babel 8) — используйте assumptions:
{
"assumptions": {
"setPublicClassFields": true,
"privateFieldsAsProperties": true,
"noDocumentAll": true,
"iterableIsArray": true
},
"presets": [
["@babel/preset-env"]
]
}
Babel 8 удаляет опции corejs и useBuiltIns из
@babel/preset-env и @babel/plugin-transform-runtime.
Вместо них используется babel-plugin-polyfill-corejs3 — выделенный плагин
для инъекции полифиллов из проекта babel-polyfills.
// Было (Babel 7):
npm install core-js@3
// babel.config.json
{
"presets": [
["@babel/preset-env", {
"useBuiltIns": "usage",
"corejs": "3.38"
}]
]
}
// Стало (Babel 8):
npm install core-js@3 babel-plugin-polyfill-corejs3
// babel.config.json
{
"plugins": [
["polyfill-corejs3", {
"method": "usage-global",
"version": "3.38"
}]
],
"presets": [
["@babel/preset-env"]
]
}
loose/spec на assumptions.useBuiltIns/corejs на babel-plugin-polyfill-corejs3.targets: "defaults".@types/babel__* — после миграции они не понадобятся.@babel/* пакеты до ^8.0.0.import() или на ESM.@types/babel__* — типы теперь встроены.corejs/useBuiltIns из preset-env (если мигрировали в фазе 1).loose/spec из preset-env (если мигрировали в фазе 1).babel --version — должно быть 8.0.0.Рост Babel поражает. С 1,7 миллиона еженедельных загрузок в 2018 до 651 миллиона в июне 2026 — рост в 383 раза. Только за последний год загрузки удвоились. Это не умирающий проект; это самый популярный JavaScript-компилятор в мире с огромным отрывом.
Однако, команда Babel сталкивается с проблемой финансирования. Пожертвования через OpenCollective и GitHub Sponsors неуклонно снижаются, даже при взрывном росте использования. Основная команда Babel — Huáng Jùnliàng, liuxingbaoyu и Nicolò Ribaudo — полагается на поддержку Sovereign Tech Agency (Германия) и Igalia, но эти источники ограничены по времени.
targets в настройках preset-env. Изменение касается только значения по умолчанию, а не удаления возможности. Если ваш проект требует поддержки IE11, просто пропишите цели явно.loose: true для классов заменяется на assumptions.setPublicClassFields = true. Это изменение можно сделать ещё на Babel 7 — assumptions поддерживаются с версии 7.13. Сначала мигрируйте на assumptions, потом обновляйтесь до Babel 8.Babel 8 — однозначно позитивный шаг для JavaScript-экосистемы. ESM-only, встроенные TypeScript-типы и современные настройки по умолчанию — всё это движется в правильном направлении. Миграция не тривиальна — она требует обновления конфигов, возможно, изменения способа импорта Babel и проверки целевых браузеров. Но 12-месячное окно безопасности для Babel 7 даёт достаточно времени для тщательного планирования.
Если вы работаете над сложным пайплайном сборки и нуждаетесь в помощи с этой миграцией, свяжитесь со мной. я помогаю командам обновлять конфигурации сборки и могу предложить понятный план миграции под ваш стек.
Нужна помощь с миграцией пайплайна сборки на Babel 8 или модернизацией JavaScript-инструментария? я провожу бесплатные консультации.