Как я решил проблему гибкого управления порядком импортов в большом проекте
- среда, 26 февраля 2025 г. в 00:00:04
В одном из моих недавних проектов столкнулся с проблемой: в большом приложении, над которым работают десятки разработчиков, необходимо было обеспечить единообразный порядок импортов. Несмотря на то, что команда договорилась о том, в каком порядке импортировать модули, компоненты, директривы, миксины и прочее, в старом коде порядок импортов отличался, и его ручной рефакторинг оказался слишком трудоёмким и затратным по времени.
Наш проект разрастался, и с каждым днём количество импортов в файлах росло. Различные стили, нестыковки и расхождения в оформлении создавали трудности при поддержке кода. Существующие ESLint-плагина, предназначенные для сортировки импортов, не удовлетворяли нашим требованиям по гибкой настройке порядка и группировки. Мы хотели иметь возможность задать:
Отдельную сортировку для именованных импортов;
Группировку импортов по различным категориям (например, «Core Imports», «Components», «Third-Party Libraries»);
Управление количеством пустых строк между группами;
Возможность автоматически исправлять код через ESLint с помощью флага --fix
.
Я решил написать собственный ESLint-плагин, который позволял бы гибко настраивать порядок импортов и облегчать жизнь разработчикам. Первая версия плагина уже доказала свою эффективность, и мы начали активно использовать его в нескольких проектах. Однако со временем требования к функционалу выросли, и появилась необходимость расширить возможности плагина.
Во второй версии были добавлены:
Дополнительные параметры для настройки группировки импортов (например, includes
, emptyLinesBeforeGroup
и preserveNonImportCode
);
Тесты, обеспечивающие стабильность работы плагина;
Более подробная документация
Плагин получил название eslint-plugin-import-group и уже завоевал признание в нашей команде.
Плагин включает два основных правила:
named-imports
Это правило отвечает за сортировку именованных импортов. Оно позволяет:
Сортировать именованные импорты в алфавитном порядке. Параметр sort
(поддерживаются опции asc
, desc
и none
).
Форматировать импорт таким образом, чтобы каждый элемент был на новой строке. Параметр newline
.
Настраивать отступы внутри фигурных скобок. Параметр indent
.
Пример конфигурации:
{
"group-imports/named-imports": ["warn", {
"sort": "asc",
"newline": true,
"indent": 2
}]
}
group-imports
Это правило позволяет группировать импорты по категориям. Вы можете задавать собственные группы, определяя:
Название группы;
Набор шаблонов для сопоставления (с возможностью использовать exact, regex или includes);
Порядок сортировки внутри группы;
Количество пустых строк между группами с помощью emptyLinesBetweenGroups или emptyLinesBeforeGroup для отдельных групп.
Пример конфигурации:
{
"group-imports/group-imports": ["warn", {
"groups": [
{
"name": "Core Imports",
"patterns": [
{ "exact": "vue" },
{ "exact": "vue-router" },
{ "exact": "aloha-vue" }
]
},
{
"name": "Components",
"patterns": [
{ "regex": ".vue$" }
],
"sort": "asc"
},
{
"name": "Third-Party Libraries",
"patterns": [
{ "exact": "_rest_", "sort": "desc" },
{ "exact": "lodash-es" }
]
}
],
"emptyLinesBetweenGroups": 1
}]
}
Плагин eslint-plugin-import-group позволяет:
Автоматически упорядочивать импорты в соответствии с заранее оговорёнными правилами, что снижает вероятность конфликтов в коде.
Экономить время на ручной рефакторинг старого кода, благодаря поддержке автоматического исправления с помощью ESLint.
Улучшать читаемость и поддерживаемость кода в больших проектах, где работает множество разработчиков.
В планах — расширение функционала плагина за счёт добавления новых правил, позволяющих ещё более гибко управлять структурой импортов, а также улучшение конфигурационных опций для более тонкой настройки поведения.
Автор: Ilia Brykin