Nesse post veremos como configurar o linter ESLint (inclusive no Atom) para ganhar alguns anos de vida a mais ao diminuir o stress no desenvolvimento JavaScript. O post segue o formato “receita-de-bolo” e é destinado ao “eu-do-futuro-que-esqueceu-isso”. Mas pode ser útil para terceiros que sabem o que é um linter :D.
Ah, o setup considera minha realidade de trabalho (ES6, JSX). Se você ainda usa ES5 … não sabe a diferença … melhorou muito :D

Há varios linters por aí, como os famosos JSlint, JSHint, JSCS, ESLint.
O mais recente desses 4 linters populares é o ESLint e o mesmo tem chamado a atenção por causa de seus recursos.
O ESLint possui features interessantes como:
- Suporta configuração
- Suporta plugins
- Melhor suporte à ES6 e JSX
- Possui rules que além de estilo ajudam a detectar bugs
Devido a essas características, optamos pelo ESLint. Ver mais aqui.
Para deixá-lo ainda mais versátil utilizamos conjutamente com:
- parser babel-eslint que permite lintar todo o código suportado pelo babel.
- plugin ESLint-plugin-React que oferece um conjunto de rules específicas para React (e inclusive corrige problemas como a rule "no-unused-vars"não detectar o uso de vars na sintaxe JSX)
Vejamos o setup do mesmo tanto no âmbito do sistema operacional (global) quanto de um determinado projeto (local):
Global
Instalação
- Instale globalmente o eslint >= 2: $ sudo npm install --global eslint
- Instale globalmente o babel-eslint p/ o eslint >=2: $ npm install --global babel-eslint@next
- Instale globalmente o eslint-plugin-react: $ sudo npm install --global eslint-plugin-react
Configuração
- Crie uma configuração inicial com: $ eslint --init(será criado no dir atual)
- Mova o arquivo criado para ~/
- Edite o arquivo em ~/de acordo com suas preferências (ver site oficial por documentação ou exemplo comentado abaixo).
Notas:
- O formato do arquivo de configuração pode ser JSON, JS, YAML (o eslint --initpermite escolher). Optei por JS por permitir comentários e etc (com o devido highlight de IDEs).
- Se houver um arquivo de configuração no dir onde é invocado eslint, esse será utilizado ao invés do arquivo em~/.
Desintalação
- Desinstale os módulos globais: $ sudo npm uninstall --global eslint babel-eslint eslint-plugin-react
- (OPCIONAL) Remova o arquivo de configuração: $ rm ~/.eslintrc*
Utilização
O linter pode ser facilmente utilizado através da invocação de linhas como:
- $ eslint file1.js file2.js
- $ eslint lib/**
Para mais info ver a documentação oficial.
Local (projeto) - recomendado
Se quisermos utilizar o eslint apenas num projeto, podemos instalar ele localmente no projeto. Entre as vantagens, está o fato de podermos usar uma determinada versão com uma certa configuração e plugins específicos e de levarmos essa configuração (no package.json) junto com o projeto (que já estará corretamente configurado para uso por terceiros).
Instalação
- Situe-se na raiz do projeto npm: $ cd ./projeto
- Instale localmente o eslint >= 2: $ npm install --save-dev eslint
- Instale localmente o babel-eslint p/ o eslint >=2: $ npm install --save-dev babel-eslint@next
- Instale localmente o eslint-plugin-react: $ npm install --save-dev eslint-plugin-react
Configuração
- Situe-se na raiz do projeto npm: $ cd ./projeto
- Crie uma configuração inicial com: $ eslint --init(será criado no dir atual)
- Edite o arquivo de acordo com suas preferências (ver site oficial por documentação ou exemplo comentado abaixo).
Notas:
- Mesmo a instalação sendo local ao projeto, caso o arquivo de configuração não seja encontrado no dir do projeto, o linter tentará utilizar o arquivo de configuração localizado nos dirs acima ou em ~/(se houver).
Desinstalação
- Desinstale os módulos do projeto: $ npm uninstall --save-dev eslint babel-eslint eslint-plugin-react
- (OPCIONAL) Remova o arquivo de configuração do projeto: $ rm ./projeto/.eslintrc*
Utilização
A única diferença para a utilização do eslint instalado globalmente é que devemos apontar para seu executável dentro de seu dir em node_modules. Exemplo: ./node_modules/eslint/bin/eslint.js index.js
Notas
- A prioridade na busca por arquivos de configuração é:- Dir local
- Dirs acima no path
- ~/
 
- É recomendado possuir um arquivo de configuração básico em ~/, com rules que sejam interessantes independente das particularidades de um determinado projeto.
- O arquivo de configuração é simples. E podemos escolher se uma rule estará desligada ("off"ou0), emitindo aviso ("warn"ou1) ou emitindo erro ("error"ou2). Exemplo:"indent": [2, 4](ou"indent": ["error", 4]) emite error quando identação for != de 4 espaços.
- Quando invocamos o eslint, as mensagens de aviso/erro contém as regras que as dispararam. Assim fica fácil localizar e modificar regras que não estejam adequadas.
 Exemplo:Na linha 7, coluna 9 do arquivo analisado foi encontrado um1 7:9 error Expected '===' and instead saw '==' eqeqeq ==quando era esperado===. A regra que emitiu esse erro foieqeqeq.
- O babel-eslint possui algumas limitações descritas em sua página que é bom considerar.
- Há um bug no momento em que escrevo que o babel-eslint mais recente (5.0.0) não funciona com o eslint mais recente (2.3.0) e exige que instalemos o eslint 2.2.0.
Arquivo de configuração sample
Arquivo de configuração funcional comentado (.eslintrc.js)
| 1 | module.exports = { | 
Com Atom
Para utilizar o ESLint em conjunto com o editor Atom, o pacote mais famoso é o linter-eslint.
Basta instalar o pacote linter-eslint desde o Atom.
O linter-eslint depende do pacote linter e irá instalar esse automaticamente caso necessário.
Caso você utilize o Nuclide sobre o Atom, o mesmo utiliza uma solução alternativa ao pacote linter, chamada nuclide-diagnostics. Qualquer pacote (incluindo o linter-eslint) que funcione com o linter funciona com o nuclide-diagnostics, de modo que apenas um dos dois deve estar habilitado. Caso os dois estejam habilitados ao mesmo tempo, veremos uma UI duplicada para exibir dados do linter durante a utilização.
O linter-eslint, por padrão, tentará utilizar uma versão do eslint local ao seu projeto (vimos como instalar localmente acima). A versão local é buscada em projeto/node_modules/eslint. Se a versão local não for encontrada, será utilizada uma que vem com o pacote. Caso desejado, podemos via configuração espeficicar para o linter-eslint utilizar um eslint instalado globalmente.
Para utilizar plugins do ESLint, basta que estes estejam instalados localmente no seu projeto conjuntamente com o ESLint (também visto acima). A outra opção é instalar tanto o ESLint quanto seus plugins globalmente (também visto acima) e habilitar nas configurações do pacote linter-eslint (via interface) a opção Use Global Eslint para utilizar o eslint instalado globalmente.
A localização do arquivo de configuração do ESLint utilizado pelo linter-eslint segue as mesmas regras utilizadas normalmente pelo eslint (ver acima).
Links
- ESlint- Documentation - ESLint - Pluggable JavaScript linter: Configuração do ESLint
- List of available rules - ESLint - Pluggable JavaScript linter: Documentação sobre rules do ESLint
 
- parser babel-eslint
- plugin ESLint-plugin-React
Obs: Versões utilizadas na confecção do post:
- eslint: 2.2.0
- babel-eslint: 5.0.0
- eslint-plugin-react: 4.2.1
- atom: 1.5.3
- linter-eslint: 7.0.0