Babel для JavaScript (Node.js): полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Babel и зачем он нужен?

Babel — это мощный транспайлер (компилятор) для JavaScript, который позволяет разработчикам писать код на самых современных версиях ECMAScript (ES6, ES7, ES8, ES9, ES10, ES11, ES12 и выше) и преобразовывать его в обратно совместимый JavaScript, который может выполняться в старых браузерах и средах выполнения (например, Node.js версий ниже 12).

Основная проблема, которую решает Babel, — это разрыв между новыми возможностями языка (стрелочные функции, async/await, деструктуризация, классы, модули, опциональная цепочка и т.д.) и поддержкой этих возможностей в реальных средах выполнения. Babel выступает в роли моста, позволяя разработчикам использовать все преимущества современного JavaScript без необходимости ждать, пока все браузеры обновятся.

Babel состоит из трех основных компонентов:

  • Ядро (@babel/core) — основной движок, который парсит код, преобразует его и генерирует новый код.
  • Плагины — отдельные модули, каждый из которых отвечает за преобразование одной конкретной синтаксической конструкции (например, плагин для стрелочных функций, для async/await).
  • Пресеты — предварительно настроенные наборы плагинов (например, @babel/preset-env, @babel/preset-react).

Babel также используется для транспиляции TypeScript, JSX (React), Flow и других расширений JavaScript.

Установка Babel

Babel устанавливается через npm (Node Package Manager). Для начала работы вам потребуется Node.js версии 12 или выше.

Создайте новый проект и инициализируйте его:

mkdir my-babel-project
cd my-babel-project
npm init -y

Установите основные пакеты Babel:

npm install --save-dev @babel/core @babel/cli @babel/preset-env

Разберем, что мы установили:

  • @babel/core — ядро Babel. Без него ничего работать не будет.
  • @babel/cli — интерфейс командной строки, позволяющий запускать Babel из терминала.
  • @babel/preset-env — самый важный пресет, который автоматически определяет, какие плагины нужны на основе целевых сред выполнения (браузеров или версий Node.js).

Для работы с React дополнительно установите:

npm install --save-dev @babel/preset-react

Для TypeScript:

npm install --save-dev @babel/preset-typescript

Быстрый старт с примером кода

Создайте файл конфигурации Babel (babel.config.json или .babelrc) в корне проекта:

{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}

Создайте файл src/index.js с современным кодом:

// src/index.js
const greet = (name) => {
  return `Hello, ${name}!`;
};

const users = ['Alice', 'Bob', 'Charlie'];
const greetings = users.map(user => greet(user));

console.log(greetings);

// Используем async/await
const fetchData = async () => {
  const data = await Promise.resolve({ message: 'Success' });
  console.log(data.message);
};

fetchData();

Теперь скомпилируйте код с помощью Babel:

npx babel src --out-dir dist

После выполнения команды в папке dist появится файл index.js с преобразованным кодом:

// dist/index.js
"use strict";

var greet = function greet(name) {
  return "Hello, ".concat(name, "!");
};

var users = ['Alice', 'Bob', 'Charlie'];
var greetings = users.map(function (user) {
  return greet(user);
});

console.log(greetings);

var fetchData = async function fetchData() {
  var data = await Promise.resolve({ message: 'Success' });
  console.log(data.message);
};

fetchData();

Обратите внимание: стрелочные функции преобразованы в обычные функции, шаблонные строки — в конкатенацию, а const/let — в var (в зависимости от настроек). Async/await остались без изменений, так как Node.js текущей версии их поддерживает.

Основные методы и функции Babel

Babel предоставляет как API для программного использования, так и CLI для работы из командной строки. Рассмотрим 10 ключевых методов и возможностей.

1. babel.transformSync(code, options)

Что делает: Синхронно преобразует строку кода JavaScript. Возвращает объект с полями code (преобразованный код), map (source map) и ast (абстрактное синтаксическое дерево).

Параметры:

  • code (string) — исходный код JavaScript.
  • options (object) — объект конфигурации Babel (presets, plugins, filename и т.д.).

Пример:

const babel = require('@babel/core');

const code = 'const x = (a, b) => a + b;';
const result = babel.transformSync(code, {
  presets: ['@babel/preset-env'],
  filename: 'example.js'
});

console.log(result.code);
// "use strict";
// var x = function x(a, b) {
//   return a + b;
// };

2. babel.transformAsync(code, options)

Что делает: Асинхронная версия transformSync. Возвращает Promise, который разрешается объектом с преобразованным кодом.

Параметры: Те же, что и у transformSync.

Пример:

const babel = require('@babel/core');

async function compileCode() {
  const code = 'const greet = name => `Hello ${name}`;';
  const result = await babel.transformAsync(code, {
    presets: ['@babel/preset-env'],
    filename: 'greet.js'
  });
  console.log(result.code);
}

compileCode();

3. babel.parse(code, options)

Что делает: Парсит код JavaScript в AST (абстрактное синтаксическое дерево) без его преобразования. Полезно для анализа кода, создания линтеров или статического анализа.

Параметры:

  • code (string) — исходный код.
  • options (object) — опции парсинга (plugins, sourceType, allowImportExportEverywhere и т.д.).

Пример:

const babel = require('@babel/core');

const code = 'const x = 42;';
const ast = babel.parse(code, {
  sourceType: 'module',
  plugins: ['@babel/plugin-syntax-import-assertions']
});

console.log(ast.program.body[0].type); // VariableDeclaration
console.log(ast.program.body[0].declarations[0].id.name); // x

4. babel.transformFromAst(ast, code, options)

Что делает: Преобразует уже существующее AST (полученное, например, из babel.parse) в новый код. Позволяет выполнить несколько преобразований над одним AST без повторного парсинга.

Параметры:

  • ast (object) — AST дерево.
  • code (string) — исходный код (опционально, для генерации source maps).
  • options (object) — опции преобразования.

Пример:

const babel = require('@babel/core');

const code = 'const x = () => 42;';
const ast = babel.parse(code, { sourceType: 'module' });

const result = babel.transformFromAst(ast, code, {
  presets: ['@babel/preset-env'],
  filename: 'test.js'
});

console.log(result.code);
// "use strict";
// var x = function x() {
//   return 42;
// };

5. babel.transformFileSync(filename, options)

Что делает: Синхронно читает файл, преобразует его и возвращает результат. Удобно для обработки одного файла.

Параметры:

  • filename (string) — путь к файлу.
  • options (object) — опции преобразования.

Пример:

const babel = require('@babel/core');
const path = require('path');

const filePath = path.join(__dirname, 'src', 'app.js');
const result = babel.transformFileSync(filePath, {
  presets: ['@babel/preset-env']
});

console.log(result.code);

6. babel.transformFileAsync(filename, options)

Что делает: Асинхронная версия transformFileSync. Возвращает Promise.

Параметры: Те же, что и у transformFileSync.

Пример:

const babel = require('@babel/core');

async function compileFile() {
  const result = await babel.transformFileAsync('./src/app.js', {
    presets: ['@babel/preset-env']
  });
  console.log(result.code);
}

compileFile();

7. @babel/cli: babel src --out-dir dist

Что делает: Команда CLI для пакетной обработки файлов. Рекурсивно обрабатывает все .js файлы в папке src и сохраняет результат в папку dist.

Параметры:

  • src — исходная директория.
  • --out-dir — директория для выходных файлов.
  • --watch — режим наблюдения за изменениями.
  • --source-maps — генерация source maps.

Пример:

npx babel src --out-dir dist --source-maps --watch

8. @babel/cli: babel script.js --out-file compiled.js

Что делает: Преобразует один файл и сохраняет результат в указанный файл.

Параметры:

  • script.js — исходный файл.
  • --out-file — путь к выходному файлу.

Пример:

npx babel src/index.js --out-file dist/bundle.js

9. @babel/plugin-transform-runtime

Что делает: Плагин, который оптимизирует код, вынося вспомогательные функции (helpers) в отдельный модуль, чтобы избежать дублирования кода в каждом файле. Особенно полезен для больших проектов.

Параметры:

  • helpers (boolean) — использовать ли helpers из @babel/runtime.
  • regenerator (boolean) — использовать ли regenerator-runtime для async/await.

Пример установки и использования:

npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
// babel.config.json
{
  "presets": ["@babel/preset-env"],
  "plugins": [
    ["@babel/plugin-transform-runtime", {
      "helpers": true,
      "regenerator": true
    }]
  ]
}

10. @babel/register

Что делает: Подключает Babel к системе require Node.js, позволяя транспилировать файлы "на лету" при их импорте. Идеально подходит для разработки и тестирования, но не для продакшена.

Параметры:

Рекомендаций