Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Стилизованное изображение эволюции JavaScript-компилятора Babel 8

Релиз Babel 8: полный переход на ESM, отказ от ES5 по умолчанию и тонкие настройки компиляции

Состоялся первый за 8 лет крупный релиз компилятора Babel 8. Данное обновление направлено на глубокую модернизацию кодовой базы: проект полностью перешел на формат ESM, требует Node.js 22+, прекратил компиляцию в ES5 по умолчанию и заменил устаревшие опции loose и spec на точечные assumptions.

Релиз Babel 8: полный переход на ESM, отказ от ES5 по умолчанию и тонкие настройки компиляции

Компилятор Babel долгое время оставался фундаментом современной экосистемы JavaScript. Он позволял разработчикам писать код с использованием самых свежих стандартов ECMAScript, автоматически превращая его в обратно-совместимый синтаксис для старых браузеров. 16 июня 2026 года команда разработки Babel представила Babel 8.0.0 — первый крупный мажорный релиз компилятора за последние 8 лет, прошедших с момента выхода Babel 7 в 2018 году. За это время еженедельное количество скачиваний пакетов Babel выросло с 1.7 миллиона до внушительных 651 миллиона в неделю, практически удвоившись за последний год перед релизом. Столь колоссальная база пользователей требовала от авторов предельной осторожности при внесении ломающих изменений. В отличие от предыдущих версий, Babel 8 не ставит целью презентацию революционных функций. Весь фокус релиза сосредоточен на кардинальной модернизации кодовой базы компилятора, оптимизации производительности сборки и окончательном отказе от устаревших стандартов среды выполнения.

Модернизация вместо новых фич: зачем нужен Babel 8

В современную эпоху быстрых компиляторов на базе компилируемых языков (таких как SWC на Rust или Oxc) классический Babel на JavaScript часто подвергался критике за низкую скорость работы. Тем не менее, он остается незаменимым инструментом благодаря своей гибкой экосистеме плагинов и точному следованию спецификациям ECMAScript. Babel 8 призван сделать компилятор легче и производительнее.

Главное отличие релиза — полная очистка от легаси-кода. Разработчики удалили поддержку старых версий Node.js, перешли на современный формат поставки модулей и пересмотрели конфигурации компиляции, которые годами тащили за собой обратную совместимость с браузерами двадцатилетней давности. Для разработчиков инструментов (tooling разработчиков) и авторов плагинов кодовая база Babel теперь полностью снабжена официальными типами TypeScript, что исключает необходимость поддержки внешних пакетов определений @types/babel__*.

Переход на ESM и новые требования к Node.js

Самым значимым ломающим изменением (breaking change) для разработчиков плагинов и интеграций стал перевод всех пакетов Babel исключительно на формат ESM (ECMAScript Modules). Babel 8 больше не поставляет сборки в формате CommonJS (CJS).

  • Требования к окружению: Для установки и запуска Babel 8 теперь требуется Node.js версии 22, 24, 26 или новее. Решение ограничить минимальную версию Node.js LTS-релизами вызвано тем, что в них появилась стабильная нативная поддержка механизма require(esm).
  • Влияние на проекты: Для конечных разработчиков приложений, использующих Babel через готовые CLI-инструменты, этот переход пройдет практически незаметно. Однако авторам плагинов и инструментов сборки, которые программно импортировали Babel через require('@babel/core'), придется обновить свои скрипты или полностью перейти на асинхронные импорты import().

Изменение таргетов по умолчанию: прощай, ES5

С самого начала пакет @babel/preset-env позиционировался как инструмент автоматической настройки компиляции на основе списка целевых браузеров (Browserslist). Однако при отсутствии явных указаний Babel 7 компилировал весь код в строгий стандарт ES5 (уровень Internet Explorer 11). В 2026 году это приводило к генерации огромного количества лишних полифиллов и транспиляции классов/промисов даже в тех проектах, которые нацелены исключительно на современные устройства.

В Babel 8 это поведение изменено:

  • Базовой целью компиляции по умолчанию (когда секция targets не задана) теперь является значение defaults из конфигурации Browserslist. На момент релиза этот таргет соответствует примерно стандарту ES2023. Это означает, что современный синтаксис (классы, стрелочные функции, деструктуризация, async/await) больше не компилируется в старый ES5-код по умолчанию, что резко уменьшает размер итоговых JS-файлов и ускоряет парсинг скриптов в современных браузерах.
  • Выходной формат модулей по умолчанию также изменен с CommonJS на ESM.
  • Если вашему проекту все еще требуется поддержка старых браузеров (включая ES5), вам придется явно прописать эти требования в файле .browserslistrc или в параметрах конфигурации @babel/preset-env.

Отказ от loose и spec: переход на assumptions

В Babel 7 разработчики часто использовали флаги loose (компиляция в более простой, быстрый, но менее соответствующий спецификации код) и spec (максимально строгое следование спецификации в ущерб размеру и скорости) для отдельных плагинов или пресетов.

Babel 8 полностью удаляет эти флаги. Им на смену пришел механизм предположений — assumptions (впервые представленный в версии 7.13). Вместо грубого переключателя loose разработчики теперь должны явно декларировать компилятору свои предположения о коде. Например:

  • arrayLikeIsIterable: предполагается, что массивоподобные объекты можно итерировать обычным циклом;
  • iterableIsArray: предполагается, что все итерируемые объекты являются массивами;
  • setPublicClassFields: объявление публичных полей класса через обычное присваивание, а не через Object.defineProperty. Каждое предположение позволяет точечно ускорить компиляцию конкретных конструкций языка, делая поведение сборщика прозрачным.

Новая схема работы с полифиллами

Babel 8 окончательно избавляется от устаревших опций автоматического импорта полифиллов corejs и useBuiltIns из состава @babel/preset-env и плагина @babel/plugin-transform-runtime.

Эта функциональность полностью вынесена во внешний плагин babel-plugin-polyfill-corejs3, который разрабатывается в рамках независимого консорциума babel-polyfills с 2020 года. Это разделение позволило разгрузить ядро компилятора от привязки к конкретным версиям сторонних библиотек полифиллов.

Пошаговое руководство по миграции

Для обновления вашего проекта до Babel 8 выполните следующие действия:

  1. Подготовка окружения: Убедитесь, что на серверах сборки и локальных машинах разработчиков установлена Node.js версии 22 или новее. Проверьте версии в вашем CI/CD-файле (например, в экшенах GitHub Actions).
  2. Обновление до последней версии Babel 7: Перед переходом на новую мажорную версию обновите все зависимости @babel/* до последних версий ветки 7.x. Это позволит локализовать и устранить предупреждения об устаревших функциях.
  3. Миграция флагов компиляции: Найдите в ваших файлах конфигурации (.babelrc, babel.config.json или webpack.config.js) параметры loose и spec. Замените их на соответствующие декларации в секции assumptions. Например, вместо loose: true для классов добавьте предположение "setPublicClassFields": true.
  4. Миграция полифиллов: Если вы использовали автоматическую вставку полифиллов, удалите свойства corejs и useBuiltIns из настроек @babel/preset-env. Установите плагин babel-plugin-polyfill-corejs3 и подключите его в секцию плагинов конфигурации Babel.
  5. Явное указание таргетов: Если ваше приложение должно работать в старых средах, требующих ES5, явно пропишите эти браузеры в секции targets (например, targets: "ie 11" или "chrome 58").
  6. Верификация сборки:
    • Запустите сборку проекта и прогоните все автотесты под Node.js 22+.
    • Проанализируйте итоговые JS-файлы на предмет формата модулей (убедитесь, что там, где ожидался ESM или CommonJS, сгенерирован корректный синтаксис).
    • Проверьте CI-пайплайны: старые образы контейнеров с Node.js 20 или ниже упадут с синтаксической ошибкой еще на этапе установки зависимостей Babel 8.

Возможные риски при обновлении

Переход на Babel 8 несет в себе риски поломки сборки. Самый очевидный риск — падение CI/CD на старых LTS-версиях Node.js. Если ваши деплой-раннеры используют Node.js 20, установка Babel 8 завершится ошибкой.

Другой риск — непреднамеренное увеличение размера бандла или синтаксические ошибки в продакшене. Изменение таргетов по умолчанию означает, что если вы не настроили Browserslist, Babel выдаст современный синтаксис. Если ваше приложение откроют на старом телевизоре или во встроенном WebView старого Android-смартфона, приложение упадет с ошибкой парсинга JavaScript.

Также помните о финансировании: команда Babel выразила отдельную благодарность спонсорам (Germany Sovereign Tech Agency, Igalia, Tidelift, OpenCollective). Спонсорская поддержка проекта снижается на фоне роста утилизации инструмента, что накладывает ограничения на скорость выпуска будущих патчей. Это напоминание для бизнеса о важности поддержки критической Open Source инфраструктуры.