Команда JavaScript for Devs подготовила перевод статьи о том, как инструменты JavaScript переживают сдвиг в сторону системных языков. Rust, Go и Zig уже не эксперимент, а основа нового поколения бандлеров, линтеров и компиляторов. Выясняем, почему экосистема сознательно уходит от JavaScript в собственных инструментах, какие выгоды это даёт и какие компромиссы приносит.


За последние пару лет мы стали свидетелями заметных изменений в экосистеме JavaScript: многие популярные инструменты для разработчиков были переписаны на системных языках программирования — таких как Rust, Go и Zig.

Этот переход принес впечатляющий прирост производительности и другие инновации, которые меняют сам подход к созданию приложений на базе JavaScript.

В этой статье мы рассмотрим движущие силы этой революции, её последствия для всей экосистемы, а также самые значимые проекты, которые находятся в авангарде изменений.

Почему происходит этот сдвиг в инструментах JavaScript?

Переход к созданию инструментов JavaScript на системных языках — это ответ на реальное и нарастающее давление внутри экосистемы. Хотя движки JavaScript за последние годы стали поразительно быстрыми, сам язык изначально не предназначался для задач с высокой нагрузкой на CPU.

Современные JavaScript-приложения — это уже не несколько скриптов, а разросшиеся кодовые базы с тысячами зависимостей, сложными графами модулей и обширными пайплайнами сборки.

Инструменты, написанные на JavaScript, которые раньше были «достаточно хороши», теперь с трудом справляются с нагрузкой. В результате — медленные сборки, тормозящие редакторы и мучительно долгие циклы обратной связи.

Именно здесь на сцену выходят такие языки, как Rust и Go. Они обеспечивают нативную производительность, более эффективное управление памятью и развитую поддержку конкурентности — всё это позволяет создавать инструменты, которые не просто быстрее, но и надёжнее, и лучше масштабируются.

Особенно выделяется Rust — с его почти культовой аудиторией он стал языком выбора для значительной части этой новой волны. Рост его популярности вдохновил новое поколение разработчиков, для которых критически важны корректность, скорость и пользовательский опыт. Это запустило позитивный цикл: появляется всё больше инструментов, а инновации происходят всё быстрее.

Всё это указывает на более широкое осознание внутри мира JavaScript: если мы хотим, чтобы инструменты масштабировались вместе с требованиями современной разработки, нам придётся смотреть за пределы самого JavaScript.

Изучаем новое поколение инструментов JavaScript

Рассмотрим некоторые из самых влиятельных и перспективных инструментов, которые переосмысливают опыт разработки на JavaScript: SWC, ESBuild, BiomeJS, Oxc, FNM/Volta и TypeScript на Go.

1. SWC

SWC стал одним из первых крупных инструментов для JavaScript, написанных не на самом JavaScript, а на другом языке — Rust, тем самым задав шаблон, которому позже последовали многие.

По своей сути это высокопроизводительная платформа для транспиляции, бандлинга, минификации и трансформации JavaScript/TypeScript с использованием WebAssembly.

Он во многом успешно выполнил задачу стать полной заменой Babel «из коробки», обеспечивая скорость транспиляции до 20 раз выше при сохранении широкой совместимости с большинством конфигураций Babel.

2. ESBuild

В то время, когда большинство инструментов для разработчиков всё ещё писались на JavaScript, идея использовать системные языки вроде Go или Rust воспринималась скорее как эксперимент, чем как устоявшийся подход.

Но ESBuild всё изменил. Во многом именно он запустил более широкую волну интереса к созданию быстрых, низкоуровневых инструментов, способных радикально улучшить опыт разработчиков.

Созданный Эваном Уоллесом (бывшим CTO Figma), ESBuild изначально проектировался как замена устаревшим бандлерам вроде Webpack и Rollup — более быстрая и простая альтернатива. Благодаря архитектуре на Go он обеспечивает прирост производительности в 10–100 раз в задачах бандлинга, минификации и транспиляции.

Его скорость, минимальная настройка и современная архитектура повлияли на целое поколение инструментов и изменили ожидания от того, каким должен быть JavaScript-инструментарий. Именно поэтому на сегодняшний день ESBuild остаётся самым распространённым инструментом не на JavaScript — с более чем 50 миллионами загрузок в неделю на NPM.

3. BiomeJS

BiomeJS — амбициозный проект на Rust, объединяющий форматирование кода и линтинг в единую высокопроизводительную цепочку инструментов для JavaScript.

Изначально это был форк ныне закрытого проекта Rome, однако BiomeJS обеспечивает существенный прирост производительности по сравнению с устоявшимися решениями:

  • форматтер примерно в 25 раз быстрее Prettier;

  • линтер более чем в 15 раз быстрее ESLint;

  • благодаря многопоточной архитектуре Rust достигается впечатляющий прирост скорости (до ~100 раз в зависимости от железа).

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

Хотя по поддержке языков и расширяемости он пока догоняет более зрелые аналоги, для тех, кто ищет лучшую производительность и более простой инструментарий, BiomeJS становится всё более привлекательным выбором.

4. Oxc

Oxc — более новый игрок на рынке, представляющий собой набор инструментов для JavaScript на Rust с фокусом на линтинг, форматирование и трансформацию JavaScript/TypeScript-кода.

Он является частью проекта VoidZero, основанного Эваном Ю (создателем Vue.js и Vite), и задуман как фундамент для следующего поколения инструментов JavaScript.

Ключевые возможности Oxc включают:

  • парсер JavaScript, который в 3 раза быстрее SWC;

  • трансформер TypeScript/JSX, работающий в 20–50 раз быстрее Babel;

  • линтер, совместимый с ESLint, но значительно более быстрый (~50–100 раз).

oxlint стал для нас в Shopify огромным шагом вперёд. Наш прежний линтинг выполнялся 75 минут, поэтому мы распараллеливали его на более чем 40 воркеров в CI. Для сравнения, oxlint проверяет тот же код за примерно 10 секунд на одном воркере, а вывод стал гораздо понятнее. При миграции мы даже нашли несколько багов, которые раньше были скрыты или пропущены!

Джейсон Миллер, создатель Preact

5. FNM / Volta

Управление версия��и Node.js заметно улучшилось благодаря таким инструментам, как Fast Node Manager (fnm) и Volta — достойным альтернативам NVM. Ещё один вариант — Mise, который поддерживает Node.js наряду со многими другими инструментами разработки.

Эти инструменты на Rust обеспечивают существенно более быстрое время инициализации shell, полноценную кроссплатформенную поддержку и гораздо меньший расход памяти.

Они решают давние проблемы NVM — медленный запуск и отсутствие поддержки Windows — и при этом добавляют удобства вроде переключения версий на уровне проекта и прозрачного управления глобальными пакетами.

6. TypeScript на Go

Пожалуй, самым неожиданным событием последних месяцев стала работа Microsoft над переносом компилятора TypeScript на Go.

Хотя проект всё ещё находится в активной разработке, предварительные бенчмарки уже показывают впечатляющие результаты: ускорение сборок примерно в 10 раз (на кодовой базе VS Code), более быстрый запуск редактора и снижение потребления памяти.

Этот нативный порт решает проблемы масштабирования TypeScript в крупных кодовых базах, где раньше разработчикам приходилось выбирать между отзывчивостью редактора и богатой обратной связью от системы типов.

Некоторые восприняли выбор Go вместо Rust как упущенную возможность — учитывая доминирование Rust в современных инструментах JavaScript, — однако объяснение этого решения хорошо согласуется с практическими целями проекта:

Существующая кодовая база делает определённые предположения — в частности, она исходит из наличия автоматической сборки мусора, — и это сильно ограничило наш выбор. По сути, это сразу исключило Rust. Да, в Rust есть управление памятью, но оно не автоматическое: можно использовать подсчёт ссылок или что-то подобное, но поверх этого появляется borrow checker и довольно жёсткие ограничения на владение структурами данных. В частности, он фактически запрещает циклические структуры данных, а у нас почти все структуры данных сильно цикличны.

— Андерс Хейлсберг, создатель TypeScript

Microsoft планирует выпустить реализацию на Go в составе TypeScript 7.0 в ближайшие месяцы, однако нативные превью-версии уже доступны для экспериментов.

Последствия для будущего инструментов JavaScript

Помимо очевидного прироста производительности, рост нативных инструментов для JavaScript несёт более глубокие, системные последствия для всей экосистемы.

Поскольку многие существующие и новые инструменты теперь опираются на совершенно иные рантаймы и экосистемы, участие в их разработке становится менее доступным для большинства JavaScript-разработчиков.

Одновременно с этим сдвиг может повлиять и на то, какие навыки разработчики в принципе выбирают для развития. Хотя писать код системного уровня требуется далеко не всем, понимание того, как работают эти языки и какие возможности они открывают, будет стимулировать появление ещё более инновационных инструментов в ближайшие годы.

Неудивительно, что, несмотря на более высокий порог входа при изучении Rust или Zig, разработчики в подавляющем большинстве предпочитают более быстрые инструменты — даже если в них сложнее вносить вклад.

Ещё один менее заметный, но важный компромисс — утрата dogfooding, когда создатели инструментов перестают использовать собственный язык для разработки этих же инструментов. Исторически это помогало им лучше чувствовать опыт разработчиков, который они формируют.

Переход на другой язык реализации может ослабить этот контур обратной связи. И хотя многие проекты осознают этот риск, долгосрочные последствия отсутствия dogfooding по-прежнему остаются открытым вопросом.

Другие инструменты

Рассмотренные здесь инструменты — лишь небольшая часть растущей экосистемы высокопроизводительных инструментов для разработчиков с нативной реализацией, и импульс, стоящий за этой новой волной, невозможно не заметить.

Среди других заметных инициатив в этом пространстве — Turbopack и Turborepo (от Vercel), Dprint (альтернатива Prettier), а также полноценные рантаймы вроде Bun (написан на Zig) и Deno (Rust). Все они по-новому переосмысливают возможное, перестраивая инфраструктуру JavaScript с самого фундамента.

В совокупности эти инструменты отражают более широкий сдвиг в мире JavaScript и ясно показывают: будущее инструментов JavaScript пишется на Rust, Go, Zig и языках, которые придут следом.

Подводя итог

В этом материале мы рассмотрели несколько инструментов, которые формируют новую волну производительности и инноваций в экосистеме JavaScript.

Революция производительности в инструментах JavaScript — наглядный пример эволюции целой экосистемы.

Вместо того чтобы мириться с ограничениями самого JavaScript, сообщество прагматично приняло другие языки и тем самым раздвинуло границы возможного.

Русскоязычное JavaScript сообщество

Друзья! Эту статью перевела команда «JavaScript for Devs» — сообщества, где мы делимся практическими кейсами, инструментами для разработчиков и свежими новостями из мира Frontend. Подписывайтесь, чтобы быть в курсе и ничего не упустить!