JSHint, JSCS, JSLint, ESLint.
Установка
JetBrains.
Поддерживаются из коробки для активации нужно :
1. войти Preferences > Language & Frameworks > JavaScript > Code Quality Tools
2. Выбрать нужный статический анализатор и активировать checkbox Enable
3. нажать OK.
Atom
Поддерживаются из плагинов для установки нужно :
Войти в Preferences > Install в строке поиска ввести имя нужного статического анализатора
подтвердить установку.
Настройка
JetBrains.
JSHint
Есть два варианта настройки первый в настройках самой IDE,второй черз файл настроек .jshintrc
Для настройки JSHint в настройках IDE после включения чекбокса в Preferences > Language & Frameworks > JavaScript > Code Quality Tools > JSHint будет активировано меню настроек
Параметры с жёсткими ограничениями
Эти параметры указывают JSHint-у более строго проверять ваш код. Используйте их, если вы хотите разрешить использовать только безопасные конструкции языка. Это полезно, когда код пишется большим числом разработчиков с разным уровнем знаний.
- bitwise – этот параметр запрещает использование побитовых операторов, такие как ^(исключающее или), | (или) и другие. Могут быть две причины, по которым вы захотите включить этот параметр:
- Т.к. JavaScript не имеет целочисленных переменных (только с плавающей точкой двойной точности), побитовые операторы с ними происходят очень медленно.
- Побитовые операторы редко используются в программах на JavaScript, и зачастую, к примеру, & — это пропущенный символ в &&.
* curly – этот параметр заставляет всегда тело условий и циклов заключать в фигурные скобки. JavaScript позволяет опускать фигурные скобки, когда блок состоит только из одного оператора, к примеру:
while (day) shuffle();
Однако, в некоторых случаях такая конструкция может привести к ошике:
while (day) shuffle(); sleep();// Можно подумать, что это часть цикла, но это не так.
Вообще, если вы аккуратно пишите код, то лучше всегда требовать обрамлять блоки скобками.
* eqeqeq – этот параметр запрещает использовать == и != в пользу === и !==. Эти операторы пытаются всегда приводить операнды к одному типу, в результате чего можно получить неожиданный результат. Последние не делают приведения, следовательно являются более безопасными. Если вы хотите узнать больше о приведении типов в JavaScript, рекомендуем ознакомиться сTruth, Equality and JavaScript (Angus Crol).Примечание: даже если этот параметр выключен, JSHint все равно будет проверять небезопасное сравнение вида != null, если eqnull (см. ниже) включён!
* forin – этот параметр требует, чтобы во всех for in циклах выбирались только элементы объекта. Цикл for in перебирает все свойства объекта, в том числе и унаследованные. Это может привести к получению неожиданного свойства объекта. Обычно безопаснее фильтровать унаследованные свойства, например:
for (key in obj) {if (obj.hasOwnProperty(key)) { // Мы уверены, что obj[key] относится к текущему обхекту, а не унаследован.}}
Для лучшего понимания for in циклов в JavaScript, прочтите Exploring JavaScript for-in loops (Angus Croll).
* immed – этот параметр запрещает вызывать объявленную функцию, не обрамив ее скобками. При обрамлении скобками, становится понятно, что выражение — это результат функции, а не сама функция.
* latedef – этот параметр запрещает использование переменных до их объявления. JavaScrit позволяет объявлять переменные в любом месте, при этом, при исполнении кода, они все поднимаются в самый верх. Такое поведение может привести к непонятным ошибкам, поэтому использование этого параметра делает код более безопасным, разрешая использовать переменные только после их явного предварительного объявления.Для лучшего понимания области видимости переменных и их объявлении в JavaScrip, прочтите JavaScript Scoping and Hoisting (Angus Croll).
* newcap – этот параметр требует обязательно использовать оператор new перед функциями — конструкторами. Тк функции — конструкторы объявляются как и обычные функции, есть возможность вызвать такую функцию на исполнение, вместо того, чтобы создать объект, это, зачастую, является ошибкой, в особенности, когда в теле функции присутствует this.Отсутствие оператора new не вызовет никаких ошибок исполнения, и выявление такой ошибки будет затруднительным. А ошибка будет серьёзной, тк при вызове функции без оператора new, указатель this будет указывать не на создаваемый объект, а на глобальный.Пример:
function MyConstructor() {console.log(this);}new MyConstructor(); // -> [MyConstructor]MyConstructor(); //
-> [DOMWindow]Для лучшего понимания, как работаетthis, прочтите Understanding JavaScript Function Invocation and «this» (Yehuda Katz).
* noarg – этот параметр запрещает использование arguments.caller иarguments.callee. При их использовании, становится невозможным использовать множество оптимизаций, поэтому они объявлены устаревшими в новых версиях JavaScript. Также EcmaScript 5 запрещает использоватьargumants.callee в строгом режиме.
* noempty – этот параметр предупреждает, если в коде есть пустой блок. HSLint всегда делал такие предупреждения, мы сделали этот опциональным. В любом случае, не было случаев, чтобы пустой блок приводил к ошибке в программе.
* nonew – этот параметр запрещает вызывать конструктор, создавая объект, но нигде его не сохранив. Некоторые вызывают конструктор, не сохранив созданный объект в переменной, к примеру так:
new MyConstructor();
Такой подход не имеет смысла, поэтому вы должны избегать таких конструкций.
* plusplus – этот параметр запрещает использование унарных операторов инкремента и декремента. Некоторые считают, что использование ++ и — — это плохой стиль программирования, к примеру разработчики на Python, где такие операторы отсутствуют.
* regexp – этот параметр запрещает использовать . в регулярных выражениях, что может быть опасным.
* undef – этот параметр запрещает использовать не объявленные переменные. Этот параметр очень полезен, при поиске случаев, когда переменные создаются или используются глобально. Пример:/jshint undef:true */function test() { var myVar = ‘Hello, World’;console.log(myvar); // Здесь JSHint будет ругаться на неизвестную функцию}Если переменная (функция) объявлена где-то в другом файле, то вы должны использовать конструкцию /global … */ чтобы сообщить JSHint-у об этом. Польше информации ищите тут.
* strict – этот параметр требует, чтобы код был написан в соответствии с строгим режимом EcmaScript 5. Строгий режим запрещает использование некоторых конструкций JavaScript. При этом, строгий режим позволяет избежать появления некоторых ошибок и позволяет производить некоторые оптимизации кода.Примечание: этот параметр использует строгий режим только внутри области видимости функции, и запрещает использовать его глобально, тк это может нарушить работу прочих компонентов. Если вы хотите использовать строгий режим глобально, воспользуйтесь параметром globalstrict.
* trailing – этот параметр будет выдавать ошибку в случае, когда у вас в конце строки есть пробелы. Такие пробелы могут стать источником ошибок в многострочном тексте, к примеру:// Здесь действительно может возникнуть ошибка,// если после \ будет стоять пробелvar str = «Hello \World»;
Параметры с мягкими ограничениями
Эти параметры позволяют подавлять некоторые сообщения об ошибках. Используйте их только в том случае, когда вы полностью уверены в том, что делаете.
- asi – этот параметр подавляет сообщения об ошибке, вызванной пропущенной точкой с запятой. Довольно много людей опасаются писать код без использования точки с запятой. Распространено мнение, что использование точки с запятой является обязательным в JavaScript (но это не так). JavaScript имеет свои правила по поводу использования точки с запятой, и их придерживаются все браузеры. Так что использовать этот параметр, или нет — это ваше дело.Больше информации по использованию точки с запятой в JavaScript вы можете прочитать в An Open Letter to JavaScript Leaders Regarding Semicolons (Isaac Schlueter) и JavaScript Semicolon Insertion.
- boss – этот праметр подавляет сообщения об ошибке в случае, когда ожидается сравнение, но его не происходит. Чаще всего код вида if (a = 10) {} является опечаткой. Тем не менее, подобная конструкция может быть полехна в подобных случаях:
for (var i = 0, person; person = people[i]; i++) {}
- debug– этот параметр подавляет сообщения об ошибке, если в коде встречается ключевое слово debugger.
- eqnull – этот параметр подавляет сообщения об ошибке в случае использования сравнения вида == null. Такое сравнение может быть полезным, если вы хотите узнать, значение переменной null или undefined.
- es5 – Этот параметр сообщает JSHint-у, что ваш код использует возможности EcmaScript 5, такие как геттеры и сеттеры. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.Больше информации:
- ES5 compatibility table (Juriy Zaytcev)
- ECMAScript 5 support in Mozilla
- esnext – этот параметр сообщает JSHint-у, что ваш код использует возможности ES.next, такие как const и let. Обратите внимание, что не все браузеры ещё поддерживают этот стандарт.Больше информации:
- Draft Specification for ES.next (ECMA-262 Ed. 6)
- evil – этот параметр подавляет сообщения об ошибке при использовании eval. Использовать eval не рекомендуется, тк он делает код уязвимым для различных инъекций, так же затрудняет работу оптимизаторам.
- expr – этот параметр подавляет сообщения об ошибке в случае, где обычно ожидается присваивание или вызов функции. Обычно такое случается в следствие опечатки, однако это не запрещается спецификацией.
- funcscope – этот параметр подавляет сообщения об ошибке в случае, когда переменная была объявлена в некоторой области видимости, а после запрашивается уже вне её. Вообще, в JavaScript существует как локальная область видимости, так и глобальная, подобная запись может привести в замешательство малоопытных разработчиков, также усложняет процесс отладки. JSHint выдаёт предупреждения, если используется переменная вне предполагаемой области видимости.Пример:
function test() {if (true) {var x = 0;}x += 1; // ‘x’ используется вне предполагаемой области объявления.// предупреждение не будет выведено, если выставить funcscope:true}
- globalstrict – этот параметр подавляет сообщения об ошибке в случае использования строгого режима глобально. Глобальный строгий режим может не пропустить сторонний код, написанный в обычном режиме. Больше информации вы можете получить прочитав о параметре strict.
- iterator – этот параметр подавляет сообщения об ошибке в случае использования свойства iterator. Это свойство поддерживается не всеми браузерами, и пользоваться им нужно с осторожностью.
- lastsemic – этот параметр подавляет сообщения об ошибке при отсутствии точки с запятой в выражении, если оно записано с блоком в одну строку. Пример:
var name = (function() { return ‘Anton’ }());
Это удобно использовать в случае автоматической генерации JavaScript кода.
- laxbreak – этот параметр подавляет большинство сообщений об ошибке в коде, где есть подозрения на неправильно записанную строку. Но при этом не подавляются предупреждения при использовании first-style написании кода (см laxcomma). Пример:var foo = «blah blah»+ «blah blah»;
- laxcomma – этот параметр подавляет сообщения об ошибке при first-style написании кода. Пример:var obj = {name: ‘Anton’, handle: ‘valueof’, role: ‘SW Engineer’};
- loopfunc – этот параметр подавляет сообщения об ошибке при объявлении функций внутри циклов. Такие объявления могут приводить в подобным ошибкам:
var nums = [];for (var i = 0; i < 10; i++) {nums[i] = function (j) {return i + j;};}nums[0](2); // выводиться 12 вместо 2
Исправить ошибку можно копируя i при объявлении функции:
var nums = [];for (var i = 0; i < 10; i++) {(function (i) {nums[i] = function (j) {return i + j;}}(i));}
- multistr – этот параметр подавляет сообщения об ошибке при при использовании «многострочных» строк текста. Многострочный текст может быть опасными в случае, если после экранирующего символа в конце строки () попадёт пробел.Хотя этот параметр перестаёт выводить предупреждения при использовании многострочного текста, при возникновении ошибки (пробел после экранирующего символа, либо отсутствие его совсем), сообщение будет выведено.Пример:
/*jshint multistr:true */var text = «Hello\World»; // Все отлично.text = «HelloWorld»; // Предупреждение — нет экранирующего символа.text = «Hello\ World»; // Предупреждение — пробел после экранирующего символа
- onecase – этот параметр подавляет сообщения об ошибке при использовании единственного варианта выбора в конструкции switch. Обычно, в таких случаях можно обойтись обычным условием, однако такая ситуация часто возникает при автоматической генерации кода.
- proto – этот параметр подавляет сообщения об ошибке при использовании свойстваproto. Это свойство объявлено устаревшим и больше не поддерживается браузерами.
- regexdash – этот параметр подавляет сообщения об ошибке, если используется не экранированный — в конце регулярного выражения.
- scripturl – этот параметр подавляет сообщения об ошибке при использовании строки URL со скриптом, какой как javascript:….
- smarttabs – этот параметр подавляет сообщения об ошибке при использовании для отделения блоков кода пробелов и табуляторов вперемешку. Такая техника называется SmartTabs.<
- shadow – этот параметр подавляет сообщения об ошибке при объявлении переменной, которая уже была объявлена во внешней области видимости.
- sub – этот параметр подавляет сообщения об ошибке при использовании нотации [] при обращению к свойствам объекта, когда это свойство возможно получить с использованием точечной нотации. Те person[‘name’] или person.name.
- supernew – этот параметр подавляет сообщения об ошибке при использовании странных конструкций, типа new function () { … } и new Object;. Однако такие конструкции иногда используются при создании объектов «одиночек», к примеру:var singleton = new function() {var privateVar;this.publicMethod = function () {}this.publicMethod2 = function () {}};
- validthis – этот параметр подавляет сообщения об ошибке при возможных нарушениях строгого режима. Использование этого параметра возможно в области видимости функции, которая работает в строгом режиме.Примечание: параметр нужно использовать только внутри функции. При попытке использовать его глобально, JSHint завершится с ошибкой.
Параметры среды исполнения.
Эти параметры позволяют предварительно определить глобальные переменные используемых библиотек, браузера или node.js. По сути они являются аналогами объявлений вида /*global $:false, jQuery:false */.
- browser – этот параметр объявляет глобальные объекты современных браузеров, такие как document и navigator, а также объекты HTML5 типа FileReader и другие.Примечание: параметр не объявляет переменные типа alert или console. Для этого используется параметр devel.
- couch – этот параметр объявляет глобальные объекты CouchDB. CouchDB — это документоориентированная база данных, данные из которой могут быть запрошены с использованием MapReduce, используя JavaScript.
- devel – этот параметр объявляет глобальные объекты, которые обычно используются для отладки (console, alert). Как правило, они не должны присутствовать в готовом коде.
- dojo – этот параметр объявляет глобальные объекты для Dojo Toolkit.
- jquery – этот параметр объявляет глобальные объекты для jQuery — библиотеки JavaScript. Language & Frameworks > JavaScript > Code Quality Tools > JSHint нажать чекбокс Use config files,a затем выбрать радиобокс Custom configuration file и указать путь к файлу .jshintrc
JSLint
Настройка JSList производится только в настройках IDE Preferences > Language & Frameworks > JavaScript > Code Quality Tools > JSLint
assignment expressions – терпимо относится к операторам присвоения, true если присваивание должно быть разрешено вне позиции операторов
- bitwise operators – Игнорирование битовых операторов, true, если битовые операторы не должны проходить проверку
- a browser – Разрешить функции браузера, true, учитываются стандартные глобальные переменные браузера
- Google Closure Idioms – Разрешить Google Closure идиомы, true, если Google Closure аннотации должны быть разрешены
- continue – Разрешать continue, true, для того что бы использование countinue игнорировалось
- couchDB – Предложение CouchDB, true, если нужо что бы функции CouchDB считались глобальными
- debugger statments – Разрешать debgger, true, если оператор debug должен быть разрешен
- devel – Разрешать console, alert, true, если не установлена опция browser, и нужно что бы эти операторы были разрешены
- eqeq – Разрешить == и !=, true, если == и != операторы должны быть разрешены
- eval – Разрешить eval, true, если eval должен быть разрешен
- indent – Пробелы и отступы. Количество пробелов которые используются для отступов (по умолчанию 4)
- maxerr – Максимальное количество ошибок. Максимальное количество предупреждений для отчета проверки (по умолчанию 50)
- maxlen – Максимальная длинна строки. Максимальное количество символов в строке
- newcap – Использование прописных букв в начале слова в названии конструктора, true, если первые буквы в именах функций конструктора являются обязательными
- Node.js – Учитывать Node.js, true, если Node.js должна учитываться в глобальных переменных
- nomen – Разрешать прочерк _ в индентификаторах, true, если не нужно разрешить использование таких переменных
- passfail – Остановка на первой ошибке, true, если сканирование должно останавливаться на первой ошибке
- ++and– – Разрешить ++ и –, true, если использование ++ или — должно быть разрешено
- missing “use strict” pragma – Разрешить отсутствие “use strict” в начале функции, true, для того что бы вставка строки “use strict” была не обязательной
- TODO comments – Разрешить TODO комментарии, true, для того что бы не реагировать на TODO комментарии
- unused parameters – Разрешить неиспользуемые параметры, true, не показывать предупреждений о неиспользуемых параметрах
- many var statements – Разрешить использование множества var в функции, true, для множественного использования var в функции
- white – Разрешать грязные пробелы, true, для игнорирования грязных пробелов
JSCS
Настройка производится через файл настроек .jscsrc или .jscs.json в корневом католологе или в Preferences > Language & Frameworks > JavaScript > Code Quality Tools > JSСS указывается адрес файла настройки
Несмотря на большое количество правил, которые поддерживает JSCS, конфиг вряд ли будет большим, потому что в инструменте предусмотрены пресеты. Популярных стилей для JavaScript кода не так много, и если вы выбрали один из них, то нет нужды описывать стиль полностью.Достаточно указать, на кого вы хотели бы быть похожим:
- airbnb
- crockford
- jquery
- mdcs
- wikimedia
- yandex
Даже если у вас есть расхождения с этими стилями, всё равно удобно выбрать максимально похожий пресет, потому что в JSCS возможно переопределить правила пресета.
ESLint