DEV Community

Cover image for Configuração do Angular 21 (Vitest, ESLint, Prettier e Husky)
Gustavo Machado
Gustavo Machado

Posted on

Configuração do Angular 21 (Vitest, ESLint, Prettier e Husky)

O que são cada item e para que serve?

Confira a definição e função básica de cada item presente neste artigo, que compõe a arquitetura de um projeto Frontend.

Vitest

  • Um framework de testes unitários e de integração focado em projetos que utilizam Vite. Ele foi criado para ser rápido, simples e totalmente integrado ao ecossistema moderno de Frontend.

ESLint

  • Uma ferramenta de análise estática de código (linter) para JavaScript e TypeScript. Analisa automaticamente o código-fonte em busca de erros, padrões problemáticos e inconsistências de estilo antes mesmo da aplicação rodar.

Prettier

  • Um formatador de código automático e opinativo para diversas linguagens, como JavaScript, TypeScript, HTML, CSS, JSON, entre outras.

Husky

  • Uma ferramenta que permite configurar Git Hooks de forma simples dentro do seu projeto.

Inicializando um novo projeto Angular 21

Primeiramente vamos criar e configurar um novo projeto na versão 21 do Angular, pois antes da versão 21 do Angular, muita coisa mudou. Por exemplo:

Principais:
  • Zoneless como padrão
  • Reactividade e Signals mais maduros
  • Vitest substitui Karma/Jasmine
Outras:
  • Melhorias de performance e build
  • HttpClient incluído automaticamente
  • Suporte a AI no CLI
  • Angular Aria (preview)

1) Inicializando o projeto e escolhendo Sistema de Estilização

Vamos inicializar o projeto com o nome da sua escolha e escolher o sistema de estilização da sua preferência. Recomendo usar o Tailwind CSS.

ng new meu-projeto
Enter fullscreen mode Exit fullscreen mode

⚠️ Neste artigo escolheremos a opção: Tailwind CSS

2) Escolhendo tipos de renderização (SPA, SSR e SSG)

Agora escolheremos o tipo de renderização, você pode escolher qual for melhor para você a partir de seus objetivos. Por exemplo:

SPA

✅ Quando usar
  • Aplicações autenticadas
  • Dashboards e painéis administrativos
  • Sistemas internos (ERP, CRM)
  • Aplicações altamente interativas
  • Projetos onde SEO não é prioridade
  • Quando se deseja deploy simples e estático
❌ Quando não usar
  • Sites que dependem fortemente de SEO
  • Landing pages focadas em ranqueamento
  • E-commerces públicos
  • Projetos que exigem melhor performance no primeiro carregamento

SSR

✅ Quando usar
  • E-commerces
  • Portais de conteúdo dinâmico
  • Aplicações públicas com dados que mudam com frequência
  • Projetos que exigem SEO avançado
  • Quando é necessário conteúdo atualizado em tempo real por requisição
❌ Quando não usar
  • Sistemas internos autenticados
  • Aplicações totalmente estáticas
  • Projetos simples onde infraestrutura Node seria excesso
  • Quando se deseja hospedagem puramente estática (sem servidor)

SSG

✅ Quando usar
  • Portfólios
  • Blogs
  • Landing pages
  • Sites institucionais
  • Documentações
  • Conteúdo que muda com pouca frequência
  • Projetos que precisam de SEO e alta performance
  • Quando se deseja deploy simples via CDN
❌ Quando não usar
  • Conteúdo altamente dinâmico que muda a cada requisição
  • Sistemas com dados personalizados por usuário
  • Aplicações que dependem de atualização em tempo real
  • Projetos com grande volume de rotas dinâmicas imprevisíveis

⚠️ Neste artigo escolheremos a opção: n (SPA)

3) Escolhendo a otimização da IA

Essa etapa é só pra configurar guidelines automáticas de boas práticas do Angular dentro da ferramenta de IA que você usa no editor.

Não muda nada no funcionamento do projeto.
É só integração com assistente de código.

⚠️ Neste artigo escolheremos a opção: GitHub Copilot

Projeto criado!


Configurando Vitest

Com o projeto criado, vamos configurar o Vitest para contemplar maior desempenho em seus testes.

1) Instalar pacote de cobertura de testes

Por mais que o Vitest já vem instalado como padrão no Angular 21, ele ainda precisa de alguns ajustes para contemplar 100% da sua potencialidade.

Contudo, vamos instalar o pacote de cobertura de testes do Vitest, assim poderemos visualizar melhor nossos testes unitários.

npm install -D @vitest/coverage-v8
Enter fullscreen mode Exit fullscreen mode

2) Configurar o script de teste com cobertura no Package.json

Agora iremos apenas configurar o script para rodar o teste unitário com cobertura no nosso projeto.

"test:coverage": "ng test --coverage",
Enter fullscreen mode Exit fullscreen mode

Ficará assim:

3) Testando o sistema de testes

Para último passo, vamos testar se tudo está funcionando.

Execute o seguinte comando no CMD:

npm run test:coverage
Enter fullscreen mode Exit fullscreen mode

Resultado:

Vá até a pasta "coverage" e acesse o index.html para ver a cobertura atual:

Resultado:

Vitest pronto!


Configurando o ESLint e o Prettier

Partiremos para a configuração do Eslint e o Prettier no projeto. Esta etapa será conjunta, pois ambas as ferramentas deverão se integrar em conjunto.

1) Adicionar e Configurar o ESLint

Começamos instalando o ESLint no projeto Angular. Isso irá criar um arquivo eslint.config.js no seu diretório raiz.

ng add @angular-eslint/schematics
Enter fullscreen mode Exit fullscreen mode

2) Adicionar e configurar o Prettier

Agora, vamos instalar o Prettier junto com as recomendadas integrações com o ESLint.

Instale o prettier:

npm install --save-dev prettier
Enter fullscreen mode Exit fullscreen mode

Também instale o pretty-quick:

npm install --save-dev pretty-quick
Enter fullscreen mode Exit fullscreen mode

👉 pretty-quick é bem útil porque ele roda só nos arquivos staged, e não no projeto inteiro.

Depois instale os plugins para compatibilidade com o ESLint:

npm install --save-dev eslint-config-prettier eslint-plugin-prettier

Enter fullscreen mode Exit fullscreen mode

Crie um arquivo chamado .prettierrc no diretório raiz do seu projeto:

{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "singleQuote": true,
  "trailingComma": "all",
  "semi": true,
  "bracketSpacing": true,
  "arrowParens": "always",
  "endOfLine": "auto",
  "htmlWhitespaceSensitivity": "ignore",
  "embeddedLanguageFormatting": "auto"
}
Enter fullscreen mode Exit fullscreen mode

Crie um arquivo chamado .prettierignore para que o prettier os ignore e não os formate:

package.json
package-lock.json
dist
node_modules
Enter fullscreen mode Exit fullscreen mode

3) Configuração da integração do ESLint

Copie e cole o seguinte código no arquivo eslint.config.js.

// @ts-nocheck
const eslint = require("@eslint/js");
const tseslint = require("typescript-eslint");
const angular = require("angular-eslint");
const prettierPlugin = require("eslint-plugin-prettier");
const prettierConfig = require("eslint-config-prettier");

module.exports = tseslint.config(
  {
    files: ["**/*.ts"],
    extends: [
      eslint.configs.recommended,
      ...tseslint.configs.recommended,
      ...tseslint.configs.stylistic,
      ...angular.configs.tsRecommended,
      prettierConfig,
    ],
    plugins: {
      prettier: prettierPlugin,
    },
    processor: angular.processInlineTemplates,
    rules: {
      "@angular-eslint/directive-selector": [
        "error",
        {
          type: "attribute",
          prefix: "app",
          style: "camelCase",
        },
      ],
      "@angular-eslint/component-selector": [
        "error",
        {
          type: "element",
          prefix: "app",
          style: "kebab-case",
        },
      ],
      "prettier/prettier": [
        "error",
        {
          endOfLine: "auto",
        },
      ],
      "@typescript-eslint/no-explicit-any": "error", // Forbid usage of 'any'
    },
  },
  {
    files: ["**/*.html"],
    extends: [
      ...angular.configs.templateRecommended,
      ...angular.configs.templateAccessibility,
    ],
    rules: {},
  },
);
Enter fullscreen mode Exit fullscreen mode

4) Configuração de scripts no package.json

Nesta etapas vamos automatizar alguns comandos da aplicação para serem executadas através de scripts no package.json.

"lint": "ng lint",
"pretty-quick": "pretty-quick --staged",
"lint:fix": "ng lint --fix",
"format": "prettier --write .",
"format:staged": "pretty-quick --staged",
Enter fullscreen mode Exit fullscreen mode

Remova as configurações do Prettier no package.json, que foram previamente adicionadas pelo próprio Angular como padrão:

Agora tente rodar o comando do lint:

npm run lint
Enter fullscreen mode Exit fullscreen mode

Caso erros de formatação aparecer do Prettier, rode o comando:

npm run format
Enter fullscreen mode Exit fullscreen mode

Prettier e Eslint prontos!


Instalando e configurando o husky

No passo 5, vamos instalar e configurar o husky para podermos executar as ferramentas anteriores ao fazer commits e pushes.

npx husky-init && npm install

#ou

npx husky-init; npm install
Enter fullscreen mode Exit fullscreen mode

Isso cria um arquivo .husky e um arquivo de hook (gancho) para pre-commit.

Agora edite o arquivo de pre-commit:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run format:staged
npm run lint
Enter fullscreen mode Exit fullscreen mode

Além do pre-commit, adicionaremos também um pre-push:

npx husky add .husky/pre-push "npm run test"
Enter fullscreen mode Exit fullscreen mode

O arquivo irá ter as seguintes configurações (este arquivo executará testes unitários nos pushes do GIT):

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run test
Enter fullscreen mode Exit fullscreen mode

Husky pronto!


Desde já agradeço a todos e espero que tenham gostado!

Att.
Gustavo Machado Pontes

linktr linkedin github instagram twitter

Top comments (1)

Collapse
 
devgustavus profile image
Gustavo Machado

Caso encontrem alguma inconsistência nas informações, por favor, comentem ou me mandem mensagem!
Desde já agradeço a todos.