Введение, сравнение популярных конфигураций и ресурсы

Что такое ЛИНТЕР?

Линтеры имеют долгую историю разработки программного обеспечения. Stephen C. Johnson (письма) разработал Lint во время отладки Yacc (еще один компилятор-компилятор), который был написан на языке программирования C в Bell Labs в 1978 году.

Подобно тому, как валик для ворса будет проходить по вашей одежде, удаляя нежелательную пыль, волосы и другие нежелательные предметы (например, лего), программный линтер просматривает ваш исходный код и анализирует его на предмет возможных ошибок, передовых методов и стилистических проблем. . Параметры конфигурации позволяют вам выбирать, какие ошибки выявлять, отмечать и, при желании, действовать. Линтер может автоматически исправить код, пометить проблемный код для проверки или ничего не делать.

Я буду использовать линтер ESLint, который представляет собой инструмент линтинга Javascript с открытым исходным кодом. Его используют длинный список компаний и организаций. Вы можете узнать больше о ESLint и их философии на их домашней странице.

Какие есть примеры правил?

Пример правила Возможная ошибка - no-debugger. Он обрабатывает ситуации, когда программист, отягощенный крайними сроками, мог забыть debugger оператор где-то в коде, который будет запущен в производство. Хотя код с оператором debugger откроется и может работать, это не оптимально. Если пользователь откроет в браузере консоль инструментов разработчика, они попадут в отладчик. Выбрав параметр error для этого правила, ESLint пометит блок кода с оператором debugger как ошибку:

// this code block will cause an error
function getUserName(user) {
    debugger;
    return user.name;
}

ESLint вернет список (пример: пример стильного вывода), содержащий список ошибок. У каждого будет номер строки, номер столбца, уровень severity (например, ошибка, предупреждение) и правило, которое было нарушено.

Примером передового опыта является no-fallthrough, запрещающее case операторы, которые неправильно используют break для предотвращения перехода от одного case оператора к другому.

// this code block will cause an error
switch (bird) {
    case 'robin':
        playRobinSong();
    case 'bluejay':
        playBluejaySong();
}

Интересным аспектом этого правила является разрешенный им необязательный аргумент с именем commentPattern. С помощью этой опции мы можем установить комментарий, который говорит ESLint игнорировать конкретный оператор switch.

Если мы используем commentPattern «разрешить провал» (разрешены регулярные выражения) в объекте параметра, то комментарий со значением «разрешить провал» будет разрешен для нарушения правила:

// optional setting for no-fallthrough rule
{ "commentPattern": "allow fallthrough" ]
// this code block will not show an error for case 1
switch(someVariable) {
    case 1:
        someFunction();
        // allow fallthrough

    case 2:
        anotherFunction();
}

Затем у нас есть правила для переменных, которые связаны с объявлением переменных. Не все эти правила используются всеми компаниями и организациями. Например, Airbnb, Google и Standard JS имеют разные конфигурации и включают одни правила, а другие оставляют выключенными. Одно правило переменной, которое используют все три организации, а также собственная «рекомендуемая» базовая конфигурация ESLint - no-unused-vars.

Это правило сводит к минимуму оставление переменных, функций и параметров функций, которые фактически не используются в коде. Допустим, у нас есть переменная, объявленная как jpSaxe. . Есть четыре способа, которыми переменная может считаться «использованной».

  1. Когда вызывается как функция или создается:
// function called
jpSaxe()
// construct a new object
new jpSaxe()

2. При чтении или сохранении в виде значения:

let ifTheWorld = jpSaxe;

3. При использовании в качестве параметра при вызове функции:

comeOverRight(jpSaxe);

4. При использовании внутри другой функции:

comeOverRight(()=> {
    jpSaxe();
});

Обратите внимание, что для этого правила доступны параметры. В конфигурации Airbnb по умолчанию есть необязательный параметр args after-used, в то время как остальные 3 используют none. Это позволяет вам детализировать и действительно указать поведение, которое вы хотите от ESLint.

Перейдем к стилистическим правилам, которые решают более эстетические вопросы. Здесь вы можете увидеть различные варианты выбора, которые сделают разные организации. Airbnb, безусловно, выбрал большинство правил из 4 самых популярных готовых конфигураций. За ним следует Standard JS, затем Google и, наконец, наименее упрямая, рекомендованная реализация ESLint. Фактически, в рекомендуемой конфигурации ESLint включено только одно стилистическое правило. Это также единственное правило, с которым согласны все четверо, no-mixed-spaces-and-tabs. Название говорит само за себя.

И, наконец, есть правила ESLint для ECMAScript 6. Эти правила могут быть такими же синтаксически незначительными, как arrow-spacing, который проверяет, есть ли правильный интервал вокруг стрелочной части стрелочной функции.

// default configuration (options) object
{ "before": true, "after": true }

// sample code
() => {};   // OK
()=> {};    // not OK

// alternative configuration
{ "before": false, "after": true }

// sample code
() => {};   // not OK
()=> {};    // OK

Эти правила также могут иметь более функциональное назначение, например, улучшение читаемости или ремонтопригодности кода. Одним из примеров является prefer-const, который проверяет, переназначена (изменена) ли переменная, объявленная с ключевым словом let, где-то в коде. Если нет, он сообщит вам об этом с помощью warning или error в зависимости от того, как вы настраиваете правило (0: выключено, 1: предупреждать, 2: ошибка).

Должен ли я использовать готовую конфигурацию или использовать свою?

Для начала я определенно рекомендую использовать готовую конфигурацию. Из того, что я читал, конфигурация Airbnb (npm) является самой популярной. Я не собираюсь изобретать велосипед здесь и рассказывать, как настроить ESLint, потому что есть несколько отличных руководств.

Полный список интеграций доступен на домашней странице ESLint, а затем есть эти сообщения в блоге с множеством полезной информации:

Для VS Code:





Для Atom:



Для Sublime:



Для Vim:



Для скобок:



Другие готовые конфигурации

После того, как вы познакомитесь с тем, как настроить свой ESLint для приема готовых конфигураций, вы, возможно, захотите изучить другие, менее популярные, чем Airbnb, такие как Google (npm) или Standard JS (веб-сайт). Также есть конфигурации от таких компаний, как Spotify (github), Netflix (github), Palantir (github), Naver (github), Walmart (github), а также некоторых людей, таких как Вес Бос ( Github) и Kent C Dodds (github).

Чем отличаются 4 самые популярные конфигурации?

В моем собственном поиске стиля, который мне кажется подходящим, я искал повсюду, чтобы сравнить правила ESLint, которые каждая конфигурация включала и выключала. Но я не мог найти ни одного. 😐 Сравнения, которые я нашел, в основном ограничивались тем, насколько популярна была конфигурация, как часто она обновлялась, и обобщениями об их различиях.

Чтобы исправить эту ситуацию, я потратил некоторое время на изучение различий и каталогизацию их в файле Markdown. Они доступны на гитхабе и в виде. Я надеюсь, что кто-то сочтет это полезным, так же, как я счел полезным покопаться в правилах ESLint, а также в общих передовых методах и стилях для написания кода Javascript. У меня также была возможность глубже изучить конкретные варианты, которые выбрали разные компании и организации, и лучше понять, почему этот выбор имеет или не имеет значения.