Циклические зависимости
ID: cycles | Степень критичности: Критическая (по умолчанию)
Циклические зависимости возникают, когда два или более модулей зависят друг от друга напрямую или косвенно.
Почему это «запах»
- Сильная связанность: Модули становятся неразделимыми, что затрудняет их повторное использование по отдельности.
- Проблемы инициализации: Могут привести к импортам со значением
undefinedво время выполнения, если сборщик не обработает их должным образом. - Сложность тестирования: Трудно мокать или изолировать один модуль, не подтягивая весь цикл зависимостей.
- Когнитивная нагрузка: Разработчикам сложнее понять потоки данных и управления.
Примеры
Плохо
typescript
// orders.ts
import { processPayment } from './payments';
export const createOrder = () => {
/* ... */
};
// payments.ts
import { createOrder } from './orders';
export const processPayment = () => {
/* ... */
};Хорошо
Вынесите общую логику в третий модуль.
typescript
// types.ts
export interface Order {
/* ... */
}
// orders.ts
import { Order } from './types';
export const createOrder = () => {
/* ... */
};
// payments.ts
import { Order } from './types';
export const processPayment = (order: Order) => {
/* ... */
};Конфигурация
yaml
rules:
cycles:
severity: critical
exclude: ['**/*.entity.ts']Параметры по умолчанию
exclude:['**/*.entity.ts']- паттерны файлов, которые исключаются из проверки на циклы
Как исправить
- Вынесите общую логику: Перенесите общие части в новый модуль, от которого будут зависеть оба исходных модуля.
- Внедрение зависимостей: Передавайте зависимости в качестве аргументов вместо их импорта.
- Используйте события: Используйте шину событий или обратные вызовы для развязки модулей.
ESLint правило
Этот детектор доступен как правило ESLint для получения обратной связи в реальном времени.
javascript
// eslint.config.js
export default [
{
rules: {
'@archlinter/no-cycles': 'error',
},
},
];Смотрите Интеграция с ESLint для инструкций по настройке.