Как неиспользуемый код стухает и лежит в проекте заповедными нетронутными пластами: новый функционал обложили тестами и снапшотами и выкатили на прод. Через какое-то время, клиентский код или компонент, который пользовался этим функционалом, удалили — а общие утилиты, константы, моки и конфигурации остались по чьему-то недосмотру. Такой код больше не нужен и не используется, но невидим для линтеров и подсветки IDE: он импортируется в тестах и StoryBook (например), и выглядит полезным и вообще, при деле.
В текущем большом проекте я нашёл и удалил около 5к строк неиспользуемых функций и компонентов, а также ненужных стилей, тестов, историй StoryBook, снапшотов и одну картинку. Что интересно, снапшоты были далеко не большей частью пулл реквеста, зато нашлось множество устаревших компонентов, которые импортировались только в историях SB.
Кроме прочего, это ускорило время сборки проекта примерно на полминуты или 5%: мелочь, а приятно.
Процесс
1. Удалить все тесты и истории SB, чтобы неиспользуемые экспорты стали доступны для анализаторов.
1 2 | find app -name "*.test.*" -or -name "*.stories.*" > /tmp/files rm -f $(</tmp/files) |
Закоммитить изменения, чтобы перед глазами не мельтешили ненужные списки при просмотре диффов.
1 | git commit . -m 'Remove tests and stories' |
2. Запустить анализаторы по очереди:
npx unimported
npx findead
npx deadfile
npx trucker
С findead
я нашёл больше всего неиспользуемого кода. Думаю, это сильно зависит от проекта, и прогнать кодовую базу стоит всеми доступными средствами.
Для unimported
требуется немного конфигурации: добавить .unimportedrc.json
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "entry": ["app/{views,shared}/**/*.{js,ts,tsx}"], "extensions": [".ts", ".js", ".tsx"], "ignorePatterns": [ "**/node_modules/**", "**/*.tests.{js,jsx,ts,tsx}", "**/*.test.{js,jsx,ts,tsx}", "**/*.spec.{js,jsx,ts,tsx}", "**/tests/**", "**/__tests__/**", "**/*.d.ts", "**/.build/**" ], "ignoreUnimported": [], "ignoreUnused": [], "ignoreUnresolved": [] } |
Запуск утилиты:
1 2 | npx unimported --init npx unimported |
Остальные инструменты не принесли особой пользы (хотя у deadfile
симпатичная веб-страница с результатами).
1 2 | npx deadfile app/index.js --dir app/ npx trucker --unused app/ |
3.Пользуясь выводом анализаторов, удалить ненужный код и файлы. Сделать коммит.
4. Отменить коммит из шага 1., чтобы вернуть тесты и истории.
1 | git revert SHA |
5. Прогнать тесты и снапшоты, восстановить код, который всё-таки нужен: у меня, например, это оказались хэлперы для тестов и некоторые моки для историй.
1 2 | git checkout origin/master app/shared/utils/needed-file.ts git commit |
6. При желании, можно сделать сквош, чтобы в истории для файлов не осталось пары интригующих коммитов с их удалением и восстановлением.
Это всё, что можно сделать с кодовой базой в почти автоматическем режиме. В моём случае, между 3 и 4 шагами я вручную выполнил поиск по проекту из IDE по регуляркам, и ориентируясь на подсветку и линтер в редакторе, удалил неиспользуемые экспорты функций.
1 2 | // Регулярка для поиска экспортов стрелочных функций export const [\w\d_]+ = ([a-zA-Z]\w*|\([a-zA-Z]\w*(,\s*[a-zA-Z]\w*)*\)) => |