Ревьюить чужой код в нашем React-проекте было мучительно - нужно уйти со своей ветки, подождать пока всё соберётся, потом возвращаться обратно. Три изменения в стеке превратили это в комфортный процесс.
Почему ревью откладывалось
Вот как выглядел процесс до. Приходит MR. Открываешь, смотришь diff. Хочешь запустить локально - и тут начинается.
Stash своих изменений. Checkout на чужую ветку. Ждёшь, пока запустится dev server - больше минуты на нашем проекте. Смотришь код. Возвращаешься на свою ветку - и всё заново: stash pop, переключение, снова ждёшь. Если в процессе ревью нужно было срочно переключиться обратно, это отдельная боль.
Фокус разбивается. После второго такого переключения уже не хочешь смотреть следующий MR. Складываешь в закладки и обещаешь себе “посмотрю позже”. Позже превращается в никогда, MR висит несколько дней.
Мы потратили время на три изменения, которые убрали большую часть этого трения. По отдельности каждое из них небольшое улучшение. Вместе они работают иначе.
Git worktree: не уходи со своей ветки
Первое - git worktree. Встроенная команда git, которую мало кто использует.
Идея простая: вместо того чтобы переключать ветку в текущей директории, ты создаёшь отдельную рабочую директорию для другой ветки. Обе существуют одновременно. Твоя работа - там. Чужой MR - вот здесь, рядом. Переключение занимает меньше секунды, потому что git не копирует файлы - только создаёт новое рабочее дерево на основе общего .git.
git worktree add ../project-review-branch feature/some-branch
После этого заходишь в ../project-review-branch - и там чистая копия репозитория на нужной ветке. Твои изменения в основной директории не тронуты.
Есть нюансы. Node_modules нужно ставить отдельно - каждый worktree это отдельная директория. Файл .env тоже нужно скопировать. Это немного ломает магию “за секунду”, но один раз npm install - это не минута ожидания, это что-то сделать пока ставится.
Главное: твоя ветка остаётся нетронутой. Никаких stash. Никакого “где я был”.
Автокоманда в MR: убираем барьер
Worktree решает техническую проблему. Но ревьюер должен ещё помнить, как его использовать, знать имя ветки, правильно написать команду. Это трение не пропадает - оно просто становится меньше.
Мы убрали и его. В шаблон MR добавили готовую команду для ревьюера.
В GitLab шаблоны MR живут в .gitlab/merge_request_templates/. Мы добавили туда блок с командой, которую можно скопировать одним кликом:
git worktree add ../review-{{branch_name}} {{branch_name}} && \
cd ../review-{{branch_name}} && \
cp ../project/.env . && \
npm install && \
npm run dev
Ревьюер открывает MR, видит эту команду с уже подставленным именем ветки, копирует, вставляет в терминал. Через минуту - изолированная копия проекта на нужной ветке, своя работа не тронута.
Работает потому, что снижает входной барьер до нуля. Не нужно ничего помнить, не нужно придумывать имя директории, не нужно гуглить синтаксис worktree. Один клик - и всё готово. Такие вещи реально влияют на то, делаешь ли ты ревью сразу или откладываешь.
Rspack: сборка в 3 раза быстрее
Worktree и автокоманда убрали трение переключения. Но dev server всё ещё стартовал дольше, чем хотелось бы. Мы перешли на rspack.
Rspack - это Rust-бандлер с API, почти идентичным webpack. Не нужно переписывать конфиг с нуля - большая часть webpack.config.js переносится как есть, меняется только точка входа и название конфига. Мы поменяли, попробовали - и сборка ускорилась примерно в 3 раза.
По индустрии цифры похожие. Mews с проектом больше миллиона строк кода перешли с трёх минут на dev server до десяти секунд. Другие команды отмечают 70-80% ускорение - и это не рекламные обещания, а реальные результаты на живых проектах.
Единственное ограничение, на которое наткнулись: не все webpack-плагины совместимы. Специфичные плагины под нашу сборку пришлось проверять отдельно и в одном случае искать замену. Для проекта на стандартном стеке это скорее всего не проблема. Для проектов с экзотической конфигурацией стоит проверить совместимость до начала миграции.
Biome: один инструмент вместо трёх
Линтер - последнее, что тормозило процесс. Не сам процесс ревью, но опыт разработки вокруг него.
ESLint + Prettier - классическая пара, которая со временем превращается в головную боль. Конфликты между плагинами. Обновление одного плагина ломает другой. VS Code начинает мерцать - Prettier говорит одно, ESLint другое. Каскадные обновления, которые занимают день вместо получаса.
Biome заменяет всё это одним бинарником на Rust. Линт и форматирование в одном инструменте, один конфиг вместо трёх-четырёх файлов. На больших проектах линт ускоряется в 10-25 раз - Rust против Node.js это принципиальная разница на больших кодовых базах. Prisma Media перешла с десятков пакетов зависимостей на один.
Есть и ограничение. Плагинной системы уровня ESLint у biome пока нет. Если у вас специфичные корпоративные правила, реализованные как ESLint-плагины - это нужно учитывать. Сотни встроенных правил для большинства TypeScript/React-проектов покрывают всё нужное.
Обновление прямолинейное: удалить eslint, prettier и все связанные пакеты, добавить biome, создать biome.json. VS Code-расширение работает сразу. Конфликты между форматировщиком и линтером исчезают по определению.
Как это работает вместе
По отдельности каждое из трёх изменений - это улучшение. Worktree убирает боль переключения. Автокоманда в MR снижает барьер входа. Rspack сокращает время ожидания. Biome убирает трение в ежедневной разработке.
Вместе они меняют характер работы. Приходит MR - копируешь команду из описания, открывается изолированное окружение, проект стартует быстро. Пока смотришь код, твоя ветка нетронута. Посмотрел, написал комментарии, удалил worktree одной командой. Вернулся к своей работе без потери контекста.
Ревью перестало быть тем делом, которое откладываешь. Хороший признак.
Начать можно поэтапно - worktree и автокоманда в MR бесплатны и не требуют изменений в сборке. Rspack и biome потребуют миграции, но она не так сложна, как кажется: конфиги почти совместимы, большинство команд проходят это за несколько недель.
Скорость инструментов влияет на поведение. Когда что-то быстро - делаешь его чаще и охотнее. Ревью не исключение.