Форматтеры в ESLint определяют способ представления результатов анализа кода, отделяя процесс выявления проблем от их визуального или структурного отображения. Линтер формирует набор диагностических сообщений, содержащих информацию о файле, строке, колонке, уровне серьёзности и описании проблемы, а форматтер преобразует эти данные в конечный читаемый или машинно-обрабатываемый вид.
Разделение ответственности между анализом и представлением результатов позволяет использовать один и тот же набор правил в различных контекстах: локальная разработка, непрерывная интеграция, автоматизированные отчёты, интеграция с редакторами и внешними системами качества кода.
ESLint формирует единый поток результатов, где каждая ошибка или предупреждение представляется структурой, содержащей:
Форматтер получает агрегированную структуру по всем обработанным файлам. Важной особенностью является отсутствие привязки к способу вывода: форматтер не влияет на анализ, а только интерпретирует результат.
Форматтеры решают несколько прикладных задач, связанных с представлением данных анализа:
1. Человеко-ориентированный вывод Создание читаемого отчёта для терминала, где важно быстро оценить состояние кодовой базы.
2. Машиночитаемый вывод Генерация структурированных форматов (JSON, XML, Checkstyle), используемых в CI/CD системах и инструментах анализа качества.
3. Интеграция с внешними системами Подготовка отчётов для систем мониторинга, баг-трекеров и платформ статического анализа.
4. Оптимизация визуального восприятия Сокращение или группировка информации для уменьшения шума при большом количестве сообщений.
ESLint поставляется с набором стандартных форматтеров, ориентированных на разные сценарии использования.
stylish Формат по умолчанию, ориентированный на разработку. Группирует ошибки по файлам, использует цветовое выделение и компактную структуру.
compact Минималистичный формат, где каждая проблема выводится в одной строке. Удобен для логов.
json Полный экспорт структуры результатов анализа. Используется для интеграций и последующей обработки.
checkstyle XML-подобный формат, применяемый в Java-экосистеме и CI-системах.
junit Формат отчёта, совместимый с тестовыми фреймворками, где линтинг интерпретируется как набор тест-кейсов.
tap Вывод в формате Test Anything Protocol, позволяющий интеграцию с тестовыми раннерами.
В командной строке ESLint выбор форматтера осуществляется через параметр:
eslint . -f stylish
или
eslint . --format json
При отсутствии указания используется форматтер по умолчанию, ориентированный на интерактивную работу.
Разные форматтеры по-разному интерпретируют одну и ту же информацию:
Например, форматтеры для CI обычно исключают визуальные элементы и фокусируются на структурных данных, тогда как терминальные ориентированы на удобство чтения человеком.
ESLint предоставляет программный интерфейс, позволяющий применять форматтеры без CLI:
import { ESLint } from "eslint";
const eslint = new ESLint();
const results = await eslint.lintFiles(["src/**/*.js"]);
const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);
console.log(resultText);
В этом сценарии форматтер выступает как преобразователь массива результатов в строку или иной формат вывода.
Архитектура ESLint позволяет создавать собственные форматтеры. Форматтер представляет собой функцию или модуль, принимающий массив результатов и возвращающий строку.
Базовая структура:
export default function customFormatter(results) {
let output = "";
for (const file of results) {
output += `File: ${file.filePath}\n`;
for (const message of file.messages) {
output += `${message.line}:${message.column} ${message.message} (${message.ruleId})\n`;
}
}
return output;
}
Кастомные форматтеры применяются при необходимости адаптации вывода под внутренние стандарты команды или специфические требования системы сборки.
В архитектурном смысле форматтеры выступают аналогом view-слоя:
Такое разделение позволяет расширять систему без изменения ядра анализа.
JSON-формат занимает особое положение, так как часто используется как промежуточное представление между ESLint и внешними инструментами.
Типичный сценарий:
JSON-структура включает:
В системах непрерывной интеграции форматтеры выполняют роль стандартизированного вывода, позволяя:
Чаще всего применяются форматы:
Сам процесс форматирования обычно не является узким местом, однако при больших кодовых базах важно учитывать:
Оптимизированные форматтеры избегают избыточных преобразований и минимизируют количество строковых операций.
Форматтеры влияют на восприятие качества кода не меньше, чем сами правила. Разные подходы к группировке сообщений позволяют:
Визуальная иерархия часто строится вокруг:
ESLint поддерживает подключение форматтеров как внешних пакетов. Это позволяет:
Форматтеры могут распространяться как npm-пакеты и подключаться по имени, аналогично плагинам правил.