Миграция на Babel 8.0: ESM-only, TypeScript-типы, отказ от ES5
Руководство · Июнь 2026

Миграция на Babel 8.0:
ESM-only, TypeScript-типы, отказ от ES5

Спустя 8 лет после Babel 7 вышел Babel 8 — релиз модернизации, а не новых возможностей. ESM-only пакеты, встроенные типы TypeScript и обновлённые настройки по умолчанию, отражающие современный JavaScript-ландшафт. Что изменилось и как мигрировать.

Олег Максимов 19 июня 2026 12 мин чтения

Введение

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:

1. Только ESM

Самое структурное изменение в 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-файле), у вас два варианта:

// Было (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);

Требования к версии Node.js

Babel 8 требует Node.js 22, 24, 26 или новее. Node.js 20 и 25 достигли конца жизненного цикла и не будут получать исправления безопасности. Если вы всё ещё на старой версии — сначала обновите Node.js, затем мигрируйте на Babel 8.

2. TypeScript-типы для всех пакетов

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 и все официальные плагины и пресеты.

3. Больше никакого ES5 по умолчанию

Это изменение затронет больше всего проектов. В 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"
    }]
  ]
}

4. 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"]
  ]
}

5. Инъекция полифиллов в отдельных пакетах

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"]
  ]
}

Чеклист миграции

Фаза 1: Подготовка (всё ещё на Babel 7)

  1. Обновите Node.js до v22, v24 или v26.
  2. Замените loose/spec на assumptions.
  3. Замените useBuiltIns/corejs на babel-plugin-polyfill-corejs3.
  4. Протестируйте сборку с targets: "defaults".
  5. Обновите @types/babel__* — после миграции они не понадобятся.

Фаза 2: Обновление до Babel 8

  1. Обновите все @babel/* пакеты до ^8.0.0.
  2. Переведите программный API на динамический import() или на ESM.
  3. Удалите @types/babel__* — типы теперь встроены.
  4. Удалите corejs/useBuiltIns из preset-env (если мигрировали в фазе 1).
  5. Удалите loose/spec из preset-env (если мигрировали в фазе 1).

Фаза 3: Проверка

  1. Выполните babel --version — должно быть 8.0.0.
  2. Соберите проект и проверьте на ошибки.
  3. Запустите тесты.
  4. Убедитесь, что выходной бандл работает в целевых браузерах.

Масштаб Babel: цифры и финансирование

Рост 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, но эти источники ограничены по времени.

ЧАВО

Какие самые большие изменения в Babel 8?
Три главных изменения: (1) Babel распространяется только как ESM — нужен Node.js 22+ и import вместо require(). (2) @babel/preset-env больше не компилирует в ES5 по умолчанию — использует настройки browserslist (~ES2023). (3) Опции loose/spec удалены из preset-env в пользу assumptions. Все три изменения можно выполнить итеративно, ещё находясь на Babel 7.
Можно ли по-прежнему компилировать в ES5 в Babel 8?
Да, Babel 8 полностью поддерживает ES5 — нужно лишь явно указать targets в настройках preset-env. Изменение касается только значения по умолчанию, а не удаления возможности. Если ваш проект требует поддержки IE11, просто пропишите цели явно.
Какая версия Node.js нужна для Babel 8?
Babel 8 требует Node.js 22, 24, 26 или новее. Node.js 20 и 25 достигли конца жизни и не поддерживаются. Если вы всё ещё на старой версии — сначала обновите Node.js. Об актуальных изменениях в релизном цикле Node.js читайте в моём руководстве по новому графику релизов Node.js.
Как мигрировать с loose/spec на assumptions?
В документации Babel есть таблица соответствия для каждой опции loose. Например, loose: true для классов заменяется на assumptions.setPublicClassFields = true. Это изменение можно сделать ещё на Babel 7 — assumptions поддерживаются с версии 7.13. Сначала мигрируйте на assumptions, потом обновляйтесь до Babel 8.
Что случилось с опциями useBuiltIns и corejs?
Эти опции удалены из @babel/preset-env и @babel/plugin-transform-runtime в Babel 8. Вместо них используется babel-plugin-polyfill-corejs3, который даёт больше контроля над инъекцией полифиллов. Установите его отдельно и мигрируйте до обновления на Babel 8.
Поддерживается ли ещё Babel 7?
Да, Babel 7 будет получать исправления безопасности до июня 2027 — год после релиза Babel 8. Новые функции и исправления ошибок бэкпортироваться не будут. Команда Babel рекомендует спланировать миграцию в пределах этого окна.
Есть ли в Babel 8 новые возможности?
Нет. Babel 8 не содержит новых функций по сравнению с Babel 7. Все трансформы и возможности парсера из Babel 7.23–7.29 включены, но мажорная версия — исключительно об архитектурной модернизации: ESM, TypeScript-типы и обновлённые настройки по умолчанию. Команда Babel явно заявляет, что это не релиз новых возможностей — это подготовка Babel к следующим 8 годам.

Готовы к миграции?

Babel 8 — однозначно позитивный шаг для JavaScript-экосистемы. ESM-only, встроенные TypeScript-типы и современные настройки по умолчанию — всё это движется в правильном направлении. Миграция не тривиальна — она требует обновления конфигов, возможно, изменения способа импорта Babel и проверки целевых браузеров. Но 12-месячное окно безопасности для Babel 7 даёт достаточно времени для тщательного планирования.

Если вы работаете над сложным пайплайном сборки и нуждаетесь в помощи с этой миграцией, свяжитесь со мной. я помогаю командам обновлять конфигурации сборки и могу предложить понятный план миграции под ваш стек.

Связаться

Обсудим ваш проект

Нужна помощь с миграцией пайплайна сборки на Babel 8 или модернизацией JavaScript-инструментария? я провожу бесплатные консультации.