Стиль кода и линтеры

качество≈ 6 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Код читают во много раз чаще, чем пишут: вы сами через месяц, коллега на ревью, стажёр через год. Разберёмся, какие соглашения об оформлении приняты в JavaScript и как переложить заботу о них на два инструмента — Prettier и ESLint.

Разделы темы:·

Интерпретатору всё равно, как выглядит ваш код: он одинаково выполнит и аккуратную программу, и кашу из символов. Но у кода есть второй получатель — человек. Программу пишут один раз, а читают десятки раз, и почти всегда читает не автор: коллега, ревьюер, вы сами полгода спустя. Стиль кода — это вежливость к читателю.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

В команде важен не столько конкретный стиль, сколько его единственность. Когда весь проект оформлен одинаково, глаз перестаёт спотыкаться о запятые и отступы — и видит сразу суть. Именно поэтому споры «два пробела или четыре» в зрелых командах давно закрыты: выбрали один вариант и забыли.

В мире JavaScript сложился набор привычек. Отступ — 2 пробела на уровень вложенности (в Python любят четыре, в JS прижились два). Вокруг операторов — пробелы: a + b, а не a+b. После запятой — тоже пробел.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Фигурные скобки ставят в «египетском» стиле: открывающая — на той же строке, что и if или for, закрывающая — на своей собственной. Имена выбирают по смыслу: переменная — существительное (userAge, а не x), функция — глагол (sendMessage, calcTotal). Если имя честно описывает содержимое, половина комментариев становится не нужна.

Отдельный грех — «магические числа»: голые 3600 или 0.2 посреди кода. Сегодня вы помните, что это, а через месяц число превращается в загадку. Лекарство простое — константа с говорящим именем.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Название шутливое: открывающая скобка в конце строки и отступ на следующей напоминают позу фигур на древнеегипетских рисунках — руки согнуты на разных уровнях. У стиля есть и серьёзное имя — K&R, по инициалам Кернигана и Ритчи, авторов классической книги о языке C, где так оформлены все примеры.

Держать все соглашения в голове не нужно — их помнит Prettier. Это программа, которая берёт ваш файл и переписывает его оформление по единым правилам: расставляет отступы и пробелы, переносит длинные строки, приводит кавычки к одному виду. Логику она не трогает вовсе.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Обычно Prettier подключают к редактору так, чтобы он срабатывал при каждом сохранении файла. Вы пишете как получится — нажали Ctrl+S, и код причёсан. Важная черта Prettier: он почти не настраивается, и это осознанное решение. Не о чем спорить — значит, споров нет.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Prettier делает код красивым, но красиво оформленная ошибка остаётся ошибкой. За смыслом следит линтер — ESLint. Он читает программу, не запуская её, и подсвечивает подозрительные места: переменная объявлена, но нигде не используется; сравнение через нестрогое ==; ветка кода, до которой невозможно дойти.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Prettier — про красоту, ESLint — про ошибки

PrettierESLint
За что отвечаетВнешний вид кодаВероятные ошибки и сомнительные места
Примеры находокОтступы, кавычки, длина строкиНеиспользуемые переменные, ==, недостижимый код
Что делает с находкойМолча переписываетПредупреждает; часть правит флагом --fix
НастройкаПочти никакой — и это плюсГибкие наборы правил под команду

Оба инструмента ставятся как зависимости для разработки: npm install --save-dev prettier eslint. Для редактора (например, VS Code) есть одноимённые расширения: Prettier форматирует при сохранении, ESLint подчёркивает проблемы прямо в коде. В командах их дополнительно запускают на CI — плохо оформленный код просто не попадает в общую ветку.

Соберём всё вместе. Вот функция, которая работает, но нарушает сразу все соглашения:

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Что здесь не так: имя f не говорит ничего, var вместо const, число 0.2 — магическое (налог? скидка? комиссия?), пробелов и отступов нет. А теперь та же логика, оформленная по правилам:

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Логика не изменилась ни на символ — изменилось только время, которое нужно читателю, чтобы её понять. В первом варианте это полминуты и три вопроса, во втором — один взгляд.

  • Код читают гораздо чаще, чем пишут, — единый стиль экономит время каждому читателю.
  • База соглашений: отступ 2 пробела, пробелы вокруг операторов, «египетские» скобки, имена по смыслу, никаких магических чисел.
  • Prettier автоматически форматирует внешний вид кода — споры об оформлении закрыты.
  • ESLint находит вероятные ошибки без запуска программы: неиспользуемые переменные, ==, недостижимый код.
  • Настройте оба инструмента на срабатывание при сохранении файла — и о стиле можно больше не думать.

1/3Что делает Prettier?

2/3Какую из этих проблем найдёт именно ESLint, а не Prettier?

3/3Чем плох код if (age > 21) с точки зрения стиля, если 21 нигде не пояснено?

Наведите порядок

Перепишите функцию по соглашениям из статьи: осмысленные имена, const вместо var, магическое число — в именованную константу, отступы и пробелы — по правилам. Результат вызова должен остаться прежним.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Например: const DAYS_IN_WEEK = 7; и function weeksToDays(weeks) { return weeks * DAYS_IN_WEEK; }. Теперь имя функции говорит, что она делает, а константа объясняет, откуда взялась семёрка — комментарии не понадобились.

Что заметит линтер

Код ниже запускается и печатает приветствие. Найдите два места, на которые пожалуется ESLint, и объясните, почему они опасны, хотя программа «работает».

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Первое — переменная temp объявлена, но не используется (правило no-unused-vars): скорее всего, это забытый мусор. Второе — нестрогое == (правило eqeqeq): здесь строка тихо превратилась в число, и однажды такое неявное приведение сработает не так, как вы ждёте.