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

Написать
Войти
Дайджесты
Иллюстрация высокоскоростного TypeScript-линтинга Oxlint

Стабильный Type-Aware линтинг в Oxlint: ускоряем проверки TypeScript в 50-100 раз

Проект Oxc вывел в стабильный статус с учетом типов (Type-Aware Linting) для линтера Oxlint на языке Rust. Движок tsgolint v7 выполняет статическую проверку типов TypeScript без запуска тяжелого процесса tsc, обеспечивая ускорение проверок в CI/CD пайплайнах крупных монорепозиториев.

Стабильный Type-Aware линтинг в Oxlint: ускоряем проверки TypeScript в 50-100 раз

В современном фронтенд-инжиниринге статическая проверка кода играет ключевую роль в предотвращении ошибок до попадания изменений в продакшен. Однако по мере роста монорепозиториев и приложений на TypeScript разработчики столкнулись с главной проблемой традиционного инструментария — низкой скоростью работы. Связка ESLint и typescript-eslint при включении правил, требующих информации о типах (Type-Aware Linting), может выполнять проверку крупных проектов долгими минутами.

Проект Oxc (JavaScript tooling built in Rust) объявил о выходе в стабильный релиз режима Type-Aware Linting для своего сверхбыстрого линтера Oxlint. Это событие знаменует важнейший этап в эволюции инфраструктуры веб-разработки: статическая проверка типов теперь выполняется нативно на Rust без необходимости запуска тяжелого процесса tsc.

Что такое Type-Aware Linting и почему он медленный в JS

Обычный линтинг работает только с синтаксическим деревом (AST) одного конкретного файла. Он может быстро проверить форматирование, неиспользуемые переменные или синтаксические ошибки. Однако многие опасные баги требуют знания графа типов всего приложения.

Примеры правил, требующих проверки типов:

  • Запрет неполных проверок в условных операторах (nullish / boolean checks);
  • Валидация безошибочности вызова асинхронных функций и обработка Promise;
  • Контроль строк с шаблонами и строгой типизации API-ответов;
  • Проверка безопасного приведения типов и отсутствия any.

В традиционном typescript-eslint для работы этих правил запускался компилятор TypeScript, который строил полный граф типов проекта в память Node.js-процесса. Это создавало огромную нагрузку на CPU и память, блокируя CI/CD пайплайны.

Архитектура Oxlint и интеграция tsgolint v7

Стабильный релиз Oxlint решает эту проблему за счет интеграции движка tsgolint v7, оптимизированного для работы с типами TypeScript v7. Нативная реализация парсера и построителя типов на Rust устраняет накладные расходы интерпретатора JavaScript.

Согласно официальному анонсу Oxc Blog, новый релиз обеспечил:

  • Поддержку 59 из 61 ключевых Type-Aware правил из набора typescript-eslint;
  • Добавление 16 новых проверок типов, прошедших тестирование в alpha-фазе;
  • Ускорение выполнения проверок в 50–100 раз по сравнению с классическим ESLint в крупных проектах;
  • Встроенные тайминги правил (Rule Timings), позволяющие точно отслеживать самые «тяжелые» проверки в проекте.

Пошаговый план безопасного внедрения и миграции

Для безопасного внедрения Oxlint с проверкой типов в существующий проект рекомендуется следующая процедура:

  1. Зафиксируйте исходное состояние. Сохраните текущую команду линтинга, версию TypeScript и список выявляемых диагностик на контрольной ветке.
  2. Установка зависимостей. Добавьте необходимые пакеты в dev-зависимости проекта через ваш пакетный менеджер: pnpm add -D oxlint oxlint-tsgolint@7
  3. Первичный запуск проверок. Выполните команду линтинга с флагом анализа типов: pnpm oxlint --type-aware
  4. Опциональная проверка диагностик компилятора. При необходимости вывода ошибок самого TypeScript добавьте флаг --type-check.
  5. Параллельное тестирование на CI. На этапе миграции запускайте Oxlint параллельно со старым tsc --noEmit и ESLint для сравнения диагностик и фиксации расхождений.

Учет проектных связей и monorepo конфигураций

При настройке проверки типов в крупных проектах с монорепозиторной структурой (Monorepo) ключевую роль играет корректная работа с ссылками на проекты (Project References в tsconfig.json). В отличие от простых линтеров, Type-Aware инструмент должен корректно отслеживать скомпилированные типы из соседних внутренних пакетов.

Движок Oxlint нативно разбирает ссылки между пакетами в монорепозитории, избавляя от необходимости выполнять предварительную сборку (pnpm build) всех внутренних библиотек перед запуском линтера на CI.

Классификация результатов параллельного запуска

При параллельном запуске старого и нового контура линтинга все расхождения следует разделить на пять категорий:

  • Подтвержденные ошибки: баги, которые находят оба линтера (базовый уровень качества);
  • Новые полезные диагностики: ошибки, найденные Oxlint за счет более строгого анализа типов;
  • Ложные срабатывания: случаи расхождения семантики правил, требующие настройки исключений;
  • Пропущенные проверки: правила, входящие в число двух пока неподдерживаемых правил;
  • Ошибки конфигурации: неверно указанные пути к tsconfig.json или файлам окружения.

Интеграция с редакторами кода и IDE

Для того чтобы разработчики получали мгновенный отклик в процессе написания кода, Oxlint предоставляет расширения для редакторов VS Code и Cursor. В отличие от тяжелых процессов Node.js, расширение на Rust потребляет считанные мегабайты памяти и не приводит к зависанию подсвечивания синтаксиса при переключении больших веток.

Воспроизводимое измерение скорости работы CI

Чтобы корректно оценить прирост производительности, измерения должны проводиться в одинаковых условиях:

  • Одинаковый коммит и изолированный CI-контейнер;
  • Сравнение холодного запуска (Cold Run) без кеша и повторного запуска (Warm Run);
  • Фиксация объема потребляемой оперативной памяти (RAM Peak);
  • Учет суммарного времени всех этапов проверки качества кода.

Инженерные выводы и ограничения

Выход стабильного Type-Aware линтинга в Oxlint позволяет существенно сократить время ожидания обратной связи при создании Pull Request. Разработчики получают мгновенный отклик на типы прямо в процессе написания кода.

Тем не менее, важным правилом безопасности остается сохранение финального вызова tsc --noEmit в качестве главного арбитра компиляции перед деплоем. Oxlint служит быстрым первичным щитом качества, экономящим часы рабочего времени всей команды.

Сравнение с экосистемой Oxc: парсер, трансформатор и линтер

Режим Type-Aware линтинга — это часть более крупной инициативы Oxc по воссозданию всего JavaScript-инструментария на языке Rust. Набор Oxc включает высокопроизводительный парсер AST (oxc_parser), сжиматель кода (minifier), трансформатор синтаксиса и непосредственно линтер oxlint.

За счет параллельной архитектуры и прямого доступа к общей памяти Rust-процесса Oxlint выполняет обход AST с минимальными накладными расходами. Включение tsgolint v7 добавляет возможность запрашивать сведения о типах из единой структуры данных без необходимости сериализации и передачи графа типов между Node.js и сторонними утилитами. Это обеспечивает плавный переход от традиционного медленного пайплайна к современному нативному стеку разработки.