Почти две недели назад вышла запись в блоге по поводу Rome.
Rome представляет собой целый набор инструментов — линтер, компилятор, сборщик, тест раннер и даже больше. Нацелен он на JS, TS, HTML, JSON, Markdown, CSS. Проект пытается унифицировать набор инструментов необходимых для фронт-енд разработки.
Rome монолитный и включает все традиционные инструменты фронт-енд экосистемы. Команда разработчиков называет это toolchain. Важным моментом является, то, что это не попытка объединить существующий набор инструментов, а разработать полностью новый набор инструментов. Все это должно быть в одном пакете и единой кодовой базой.
Rome разрабатывается как замена Babel, ESLint, Webpack, Prettier, Jest и прочих.
Посмотрим к чему это приведет, если честно меня устраивает некоторая конкуренция и «не монолитный» подход в инструментах разработки. Да, для новичка вход не очевиден, слишком большое изобилие инструментов, которые в большинстве своем взаимозаменяемы. Возможно в таком нюансе, Rome немного снизит порог входа.
Текущее состояние
Rome находится в бете и уже справляется с некоторыми своими обязанностями. Например у линтера уже поддерживается 100 правил, включая те, что часто используемые при использовании Typescript и React. Полный список правил можно найти тут
Опенсорс проекта начался с начала года и у проекта уже 70 контрибьютеров и более 600 комитов. В целом проект развивается и пока каких либо затуханий не видно.
Немного истории
В 2014 году был создан 6to5 (сейчас называется Babel). Это JavaScript транспайлер который копмпилировал новый код на ES6 в ES5. В тот момент проект не ставил каких либо целей, но с ростом популярности приходилось корректировать разработку.
6to5 переименовали в Babel и новой задачей было стать общей платформой для статических трансформаций JavaScript. Это означало систему плагинов и поддержку новых фичей будущих JavaScript стандартов и даже «proposals».
Команда разработчиков думала пойти еще дальше. Babel должен быть под капотом минифайеров, линтеров, форматтеров, подсветки синтаксиса, проверщиков типов, инструментов компиляции и так далее.
В 2016 году создатель Babel покинул проект. Со временем стало понятно, что подход с предоставлением широкого API (буквально всех внутренностей) слишком трудно поддерживать. Для поддержки вышеописанного инструментария, потребовалось бы переписать буквально все. Архитектура проекта связана с решениями которые автор делал еще в 2014 году, только изучая как работают парсеры AST и компиляторы. Изменения бы затронули большую часть API без возможности обратной совместимости.
Разработчики инструментов под JavaScript, тратят огромное количество времени на обработку исходного кода. Babel, ESlint, Webpack, частично занимаются одним и тем же.
Линтеры в экосистеме JavaScript равнозначны компиляторам. Оба принимают на вход исходный код, оба его обрабатывают и на выход выдают код и ошибки (если есть). Отличается лишь полученный код. В случае с линтером, это отформатированный исходный код с с исправлениями.
Чем сильней ваша инфрастуктура компиляции, тем сильней линтер. То же самое относится и к другим инструментам, которые так или иначе обрабатывают код. Мы можем создавать более мощные инструменты, используя общую базу, которую легко адаптировать.
Rome — духовный преемник Babel. Я усвоил уроки и поставил четкие цели. Вместо того, чтобы предоставлять слишком объемный публичный API для других инструментов, мы собираем их все в одном месте. Я очень рад попробовать что-то новое, чего раньше не видел JavaScript и веб-экосистема.
— Sebastian McKenzie
Использование
Rome можно установить используя Yarn или NPM:
yarn add rome
npm install rome
Создание проекта
Для того, что бы Rome смог найти ваши файлы, ему нужна конфигурация. Для автоматического создания проекта можно использовать:
rome init
Эта команда создаст директорию .config и поместит туда rome.rjson, с конфигурацией проекта.
Если у вас есть существующий проект, то можно сразу автоматически применить форматирование и исправления:
rome init --apply
RJSON это расширение JSON, которое добавляет некоторые фичи. Например комментарии в JSONе.
Запустить линтер можно с помощью
rome check
Линтинг
Rome разрабатывается с мыслью предоставления максимального количества информации для исправления ошибок. У проекта есть своего рода кредо:
Богатый UI (результат в консоли): Хорошо отформатированная информация, подсветка синтаксиса, ссылки, списки и прочее.
Исправления: Rome может исправить большое количество ошибок (как линтер) и применить их автоматически. Если есть несколько путей решения, то инструмент предоставляет вам выбор.
Процесс ревью: CLI интерактивно богат и позволяет прямо в консоли принимать решения по исправлениям и пробегаться по всем ошибкам.
Редакторы: Rome интегрируется с редакторами, что позволяет делать форматирование на сохранения, подсветку ошибок и тд.
Сохранность: Rome кеширует оригинальные файлы перед тем как сделать изменения. Используя rome recover, можно откатить исправления.
Вместо заключения
Пока этот инструмент еще находится в активной разработке, но его уже как-то можно попробовать. Главное, что бы не получилось вот так:
Офф документация
JustDont
Главная проблема кухонных комбайнов — они, как правило, делают N из своих M функций (N < M) хорошо, а оставшиеся — не очень хорошо. И есть альтернативы лучше, но внедрить альтернативы рядом с кухонным комбайном и настроить правильно процессы — становится крайне сложно. Причем это работает даже если ты гугл и у тебя море денег (см. Angular). Что уж говорить про проект без серьезной финансовой поддержки.
Вангую, что сабж так и не станет таким же удобным в определенных аспектах, как те отдельные инструменты, которые он пытается заменить.