Felipe Cesar

    Como configurar o Prettier e ESLint em projetos React

    Continuando a série sobre testes, vamos adicionar duas ferramentas ao projeto que ajudam a melhorar a qualidade do código.

    Você pode baixar o repositório e fazer o checkout na branch exercise-05 para continuar de onde paramos.

    Prettier

    A primeira ferramenta é o Prettier, com ele não precisamos nos preocupar com indentação de código, se as aspas devem ser simples ou duplas, etc. Ele formata o código automaticamente mantendo sempre o mesmo padrão.

    Para instalar o Prettier execute o comando:

    $ npm i -D prettier

    Com o Prettier instalado, precisamos criar o arquivo .prettierrc e adicionar as opções desejadas. Você também pode usar o playground para ajudar na configuração.

    Nesse caso vou criar o arquivo .prettierrc na raiz do projeto e adicionar apenas um objeto vazio, para usar as configurações padrão:

    {}

    Adicione o script no package.json:

    "format": "prettier --write \"src/**/*.{js,jsx}\""

    Se você executar esse script o Prettier vai formatar todos os arquivos .js ou .jsx dentro de src.

    Extensão para o Visual Studio Code

    Para quem usa o Visual Studio Code, é possível instalar uma extensão que facilita ainda mais o uso do Prettier.

    Adicione as linhas seguintes no arquivo settings.json do Visual Studio Code, para que os arquivos sejam formatados sempre que forem salvos:

    {
      "editor.formatOnSave": true,
      "prettier.requireConfig": true
    }

    Com a extensão instalada, é necessário instalar o Prettier no projeto?

    Você pode instalar a extensão e não instalar no projeto, mas se você estiver trabalhando em um projeto a longo prazo que outras pessoas também vão trabalhar nele, é importante instalar o Prettier no projeto, para que todos possam se beneficiar dele, mesmo se não estiverem usando o Visual Studio Code.

    ESLint

    O ESLint é uma ferramenta incrível de análise de código que ajuda a previnir vários erros.

    Para instalar execute o seguinte comando:

    $ npm i -D eslint eslint-config-prettier

    O ESLint verifica algumas regras de formatação que o Prettier também verifica, para que não tenham conflitos, podemos desabilitar essas regras no ESLint e deixar apenas como responsabilidade do Prettier.

    Ao invés de sair desabilitando essas regras uma por uma, instalamos o eslint-config-prettier no projeto para desabilitar todas de uma vez.

    Crie o arquivo .eslintrc.json na raiz do projeto e adicione:

    {
      "extends": ["eslint:recommended", "prettier"]
    }

    Podemos adicionar várias configurações pré-definidas nesse Array. A ordem é importante porque as últimas sempre vão sobrescrever as primeiras. Nesse caso o Prettier deve ficar por ultimo porque ele não adiciona nenhuma regra, ele apenas desabilita as regras que são responsabilidade dele.

    Para usar a ECMAScript mais recente e features como módulos e JSX, precisamos adicionar mais algumas configurações:

    {
      "extends": ["eslint:recommended", "prettier"],
      "parserOptions": {
        "ecmaVersion": 2021,
        "sourceType": "module",
        "ecmaFeatures": {
          "jsx": true
        }
      },
      "env": {
        "es6": true,
        "browser": true,
        "jest": true,
        "node": true
      }
    }

    Adicione o seguinte comando no package.json:

    "lint": "eslint \"src/**/*.{js,jsx}\" --quiet"

    O --quiet faz o ESLint retornar apenas erros, caso tenha algum warning, ele será ignorado.

    Extensão para o Visual Studio Code

    O ESLint também conta com uma extensão pra o Visual Studio Code, para melhorar ainda mais a experiencia do desenvolvedor.

    Para que os problemas relatados pelo ESLint sejam corrigidos automaticamente após o arquivo ser salvo, adicione o seguinte no arquivo settings.json do Visual Studio Code:

    "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    }

    ESLint e React

    Quando adicionamos suporte ao JSX, não quer dizer que adicionamos suporte ao React, existem alguns detalhes que o React adiciona no JSX que não são reconhecidos pelo ESLint.

    Para que tudo funcione, execute o seguinte comando:

    $ npm install -D eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react  

    Após a intalação, adicione mais algumas configurações no .eslintrc.json, para que ele fique assim:

    {
      "extends": [
        "eslint:recommended",
        "plugin:import/errors",
        "plugin:react/recommended",
        "plugin:jsx-a11y/recommended",
        "prettier"
      ],
      "rules": {
        "react/prop-types": "off",
        "react/jsx-uses-react": "off",
        "react/react-in-jsx-scope": "off",
        "react/self-closing-comp": "warn"
      },
      "plugins": ["react", "import", "jsx-a11y"],
      "parserOptions": {
        "ecmaVersion": 2021,
        "sourceType": "module",
        "ecmaFeatures": {
          "jsx": true
        }
      },
      "env": {
        "es6": true,
        "browser": true,
        "jest": true,
        "node": true
      },
      "settings": {
        "react": {
          "version": "detect"
        }
      }
    }

    ESLint e Hooks

    Quando usamos Hooks devemos seguir algumas regras, podemos usar o eslint-plugin-react-hooks para nos ajudar com isso.

    Para instalar o plugin, execute:

    $ npm install -D eslint-plugin-react-hooks

    Em seguida adicione ele no .eslintrc.json:

      "plugin:jsx-a11y/recommended",
    + "plugin:react-hooks/recommended",
      "prettier"

    Conclusão

    Adicionamos duas ferramentas que ajudam a melhorar bastante a qualidade do código. O ESLint faz uma análise estática do código, ajudando a eliminar vários bugs e o Prettier garante que o código seja formatado corretamente.

    Quando comecei a usar essas duas ferramentas juntas, sempre ficava com dúvidas durante a instalação, por isso fiz questão de escrever esse artigo e tentei deixar o mais claro possível.

    Se esse conteúdo te ajudou ou se ficou alguma dúvida, deixa um comentário. E como de costume o código completo pode ser encontrado nesse repositório. Abraço!