javascript42
Главная
Все учебники
Блог
Учебник ESLint
Введение в ESLint
Что такое статический анализ кода
Место ESLint в экосистеме JavaScript
История и эволюция инструмента
Сравнение с TSLint, JSHint и другими линтерами
Философия и принципы работы ESLint
Установка и первичная настройка
Требования к окружению
Установка через npm и yarn
Глобальная и локальная установка: различия и рекомендации
Инициализация проекта: команда --init
Структура файла конфигурации
Форматы конфигурации: .eslintrc.js, .eslintrc.json, .eslintrc.yml
Конфигурация через package.json
Flat config: новый формат eslint.config.js
Запуск ESLint из командной строки
Архитектура и принцип работы
Этапы обработки файла
Парсинг кода и построение AST
Структура абстрактного синтаксического дерева
Как правила обходят AST
Система сообщений и уровней ошибок
Механизм кеширования
Алгоритм поиска и слияния конфигураций
Конфигурация ESLint
Поля конфигурационного файла
Свойство root и иерархия конфигураций
Настройка окружений: env
Настройка глобальных переменных: globals
Параметры парсера: parserOptions
Свойство settings
Секция rules: синтаксис и уровни
Секция overrides: гибкое переопределение правил
Наследование конфигураций: extends
Порядок применения и приоритеты
Отключение правил через комментарии
Игнорирование файлов и директорий: .eslintignore
Паттерны glob в конфигурации
Встроенные правила
Категории встроенных правил
Правила для работы с лучшими практиками
Правила для строгого режима
Правила для переменных
Правила стиля кода
Правила для ES6 и современного синтаксиса
Правила для модульной системы
Устаревшие и удалённые правила
Как читать документацию по правилу
Fixable-правила и их особенности
Расширения и шеринг конфигураций
Принцип Shareable Config
Установка и подключение готовых конфигураций
eslint:recommended и eslint:all
Конфигурация Airbnb
Конфигурация Google
Конфигурация Standard
Конфигурация XO
Сравнение популярных стилей
Создание собственного shareable config
Публикация конфигурации в npm
Расширение чужой конфигурации
Плагины
Что такое плагин и зачем он нужен
Установка и подключение плагина
Пространство имён правил плагина
Плагин eslint-plugin-import
Плагин eslint-plugin-node
Плагин eslint-plugin-promise
Плагин eslint-plugin-unicorn
Плагин eslint-plugin-sonarjs
Плагин eslint-plugin-security
Плагин eslint-plugin-jsdoc
Плагин eslint-plugin-regexp
Плагин eslint-plugin-n
Обзор других полезных плагинов
ESLint и TypeScript
Зачем нужен отдельный парсер
Установка и настройка @typescript-eslint/parser
Плагин @typescript-eslint/eslint-plugin
Правила, специфичные для TypeScript
Правила, заменяющие встроенные
Конфигурации recommended и strict
Использование информации о типах в правилах
Настройка parserOptions.project
Производительность при type-aware правилах
Типичные конфигурации для TypeScript-проекта
ESLint и фреймворки
ESLint в проектах на React
Плагин eslint-plugin-react
Плагин eslint-plugin-react-hooks
Плагин eslint-plugin-jsx-a11y
ESLint в проектах на Vue
Плагин eslint-plugin-vue
Парсер vue-eslint-parser
ESLint в проектах на Angular
Плагин @angular-eslint
ESLint в проектах на Svelte
ESLint для Node.js-проектов
Парсеры
Встроенный парсер Espree
Подключение альтернативного парсера
Парсер Babel: @babel/eslint-parser
Парсер для TypeScript
Парсер для Vue
Написание собственного парсера
Совместимость парсеров и плагинов
Форматтеры
Назначение форматтеров
Встроенные форматтеры
Форматтер stylish
Форматтер compact
Форматтер json и json-with-metadata
Форматтер checkstyle и junit
Форматтер html
Сторонние форматтеры
Создание собственного форматтера
Вывод результатов в файл
Автоматическое исправление
Флаг --fix и его поведение
Какие правила поддерживают --fix
Флаг --fix-dry-run
Ограничения автофикса
Конфликты при массовом фиксе
Безопасные и небезопасные фиксы
Fixers в собственных правилах
Написание собственных правил
Структура правила
Объект context
Метод context.report
Посетители узлов AST
Работа с токенами
Работа с комментариями
Использование scope-анализа
Написание fixera
Написание suggest-фиксов
Схема опций правила
Документирование правила
Метаданные правила
Правило с состоянием
Тестирование правил с RuleTester
Публикация правила как часть плагина
Написание собственных плагинов
Структура плагина
Регистрация правил
Экспорт конфигураций из плагина
Экспорт процессоров из плагина
Тестирование плагина
Версионирование и совместимость
Процессоры
Назначение процессоров
Встроенная поддержка блоков кода
Написание собственного процессора
Процессор для Markdown
Процессор для HTML
Применение процессора к типам файлов
Интеграция с инструментами сборки
ESLint и Webpack через eslint-webpack-plugin
ESLint и Vite через vite-plugin-eslint
ESLint и Rollup
ESLint и esbuild
Разница между lint во время сборки и отдельным запуском
Влияние линтинга на скорость сборки
Интеграция с редакторами кода
Плагин ESLint для VS Code
Настройка автофикса при сохранении
Настройка flat config в редакторе
Плагин для WebStorm и IntelliJ
Плагин для Vim и Neovim
Плагин для Emacs
Отображение ошибок и предупреждений
Решение типичных проблем с редактором
ESLint и Prettier
Конфликт зон ответственности
eslint-config-prettier: отключение конфликтующих правил
eslint-plugin-prettier: запуск Prettier как правила
Рекомендованный подход к совместному использованию
Альтернатива: разделённый запуск
Интеграция с Git и CI
Запуск ESLint в pre-commit хуке
Настройка через Husky
lint-staged: проверка только изменённых файлов
ESLint в GitHub Actions
ESLint в GitLab CI
ESLint в Jenkins
Управление ошибками и предупреждениями в CI
Флаг --max-warnings
Разница между exit code 1 и 2
Производительность
Влияние количества правил на скорость
Кеширование: флаг --cache
Опции --cache-location и --cache-strategy
Параллельный запуск: eslint-parallel
Профилирование медленных правил
Ограничение области проверки через --ext и паттерны
Влияние type-aware правил на производительность
Оптимизация конфигурации для монорепозиториев
Управление конфигурацией в командах
Создание общей конфигурации для команды
Версионирование и обновление конфигурации
Постепенное внедрение ESLint в существующий проект
Флаг --report-unused-disable-directives
Стратегии работы с большим числом предупреждений
Использование комментариев eslint-disable: правила и ограничения
Контроль использования отключающих комментариев
Flat Config
Причины появления новой системы конфигурации
Структура файла eslint.config.js
Объекты конфигурации и их поля
Функция defineConfig
Адаптеры для старых конфигураций
Совместимость с существующими плагинами
Именованные конфигурации
Глобальные переменные в flat config
Игнорирование файлов в flat config
Миграция с legacy config на flat config
Программный API
Класс ESLint
Метод lintFiles и lintText
Опции конструктора
Получение и обработка результатов
Класс Linter
Использование API в скриптах и инструментах
Встраивание ESLint в собственные приложения
Загрузка конфигурации программно
Обновление и миграция
Стратегия версионирования ESLint
Миграция с ESLint 7 на 8
Миграция с ESLint 8 на 9
Изменения в flat config при обновлении
Утилита @eslint/migrate-config
Обновление плагинов и конфигураций вместе с ESLint
Обработка breaking changes
Диагностика и отладка
Переменная окружения DEBUG
Флаг --print-config
Флаг --inspect-config
Типичные ошибки конфигурации и их причины
Конфликты между правилами
Проблемы совместимости парсера и плагинов
Ошибка "Parsing error" и способы её устранения