JavaScript рефакторинг: балласт в проекте и как от него избавиться

JavaScript рефакторинг: избавляемся от балласта

Начав удалять ненужный код, сложно остановиться. В прошлой части были удалены неиспользуемые импорты, в этот раз я найду лишние файлы: пустые readme и дефолтные таблицы стилей. Такие файлы выглядят полезными, но это оптическая иллюзия, которая проходит, если присмотреться.

Рефакторинг подходит для больших проектов: в текущем около 300 файлов историй, и примерно столько же компонентов. PR с лишним кодом унёс с собой 1.4к строк и улучшил время сборки почти на минуту (!).
Для малых проектов лучше сберечь усилия для каких-то более существенных улучшений.

Мёртвый код: код, который не используется.

Лишний код: балласт, который не несёт логики, не улучшает производительность и DX, не улучшает читаемость и не добавляет настоящей документации.

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

В моём случае, в проекте было множество README.md файлов с одной строчкой: заглавие с названием компонента. По факту, строк две: заголовок плюс пустая линия (линтер). Эти доки бесполезны, но создают какую-то толику нагрузки при сборке и использовании StoryBook (React Cosmos, Atellier etc.): операции File I/O, парсинг и компилирование пары импортов в каждой истории (дополнительный декоратор и сам Markdown файл).

Другая мишень для рефакторинга это дефолтные файлы стилей, которые добавляются к каждому новому компоненту. В каких-то случаях, такие файлы так и остаются пустышкой с ненужными импортами (S)CSS фреймворка. Если их удалить, внешний вид компонента не изменится: а если нет разницы, то зачем плодить сущности? Проблемы здесь такие же: лишний импорт, парсинг и время на компилирование и tree-shaking при сборке проекта.

Процесс

Доки-пустышки можно найти по количеству строк в файле: их всего две. Также было полезным просмотреть файлы с тремя строчками, среди них тоже нашлись ненужные.

Стили-пустышки было просто опознать по паре обязательных импортов (настройки и утилиты SCSS-фреймворка).

Для очистки файлов я написал шелл-скрипт:

Код настолько же уродлив, насколько быстро написан, и требует доводки под каждый отдельный случай.
Кроме удаления самих файлов, также удаляются их импорты в историях и компонентах, заодно импорты функций, которые использовались для работы с ними (декоратор withReadme).

После запуска скриптов, все файлы я прогнал через eslint --fix и починил, что сломалось.
Всего удалил пустышек: под две сотни markdown-доков и около сотни таблиц стилей.


На эти две большие статьи меня вдохновила книга Фаулера про рефакторинг, которую рекомендую.