"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Configurando linters e IDEs para Angular 18

Configurando linters e IDEs para Angular 18

Publicado em 2024-11-09
Navegar:882

Adicione eslint, mais bonito, env ao aplicativo.

É uma pena que o Angular, por padrão, não gere tudo isso sozinho. Alterar esquemas pode melhorar a qualidade de vários milhares de projetos Angular.

Configurando o eslint 9

Conectar eslint:

yarn ng add @angular-eslint/schematics

Três pacotes foram adicionados ao package.json:

{
  "devDependencies": {
       …,      
       "angular-eslint": "18.0.1",
       "eslint": "^9.3.0",
       "typescript-eslint": "8.0.0-alpha.20" 
   }
}

E no alvo em angular.json:

{
  "projects": {
    "buy-and-fly": {
      "architect": {
        …,
        "lint": {
          "builder": "@angular-eslint/builder:lint",
          "options": {
            "lintFilePatterns": [
              "src/**/*.ts",
              "src/**/*.html"
            ]
          }
        }
      }
    }
  },
  "cli": {
    "schematicCollections": [
      "@angular-eslint/schematics"
    ]
  }
}

O arquivo eslint.config.js também foi criado:

// @ts-check
const eslint = require("@eslint/js");
const tseslint = require("typescript-eslint");
const angular = require("angular-eslint");

module.exports = tseslint.config(
  {
    files: ["**/*.ts"],
    extends: [
      eslint.configs.recommended,
      ...tseslint.configs.recommended,
      ...tseslint.configs.stylistic,
      ...angular.configs.tsRecommended,
    ],
    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",
        },
      ],
    },
  },
  {
    files: ["**/*.html"],
    extends: [
      ...angular.configs.templateRecommended,
      ...angular.configs.templateAccessibility,
    ],
    rules: {},
  }
);

Linters básicos são bons, mas você pode torná-los melhores!

Adicionar um plug-in:

yarn add -D eslint-plugin-simple-import-sort

Vamos incluir várias regras:

// @ts-check
const eslint = require('@eslint/js');
const tseslint = require('typescript-eslint');
const angular = require('angular-eslint');
const simpleImportSort = require('eslint-plugin-simple-import-sort');

module.exports = tseslint.config(
  {
    files: ['**/*.ts'],
    extends: [
      eslint.configs.recommended,
      ...tseslint.configs.recommended,
      ...tseslint.configs.stylistic,
      ...angular.configs.tsRecommended,
      {
        plugins: {
          'simple-import-sort': simpleImportSort,
        },
        rules: {
          'simple-import-sort/imports': [
            'error',
            {
              groups: [['^\\u0000'], ['^@?(?!baf)\\w'], ['^@baf?\\w'], ['^\\w'], ['^[^.]'], ['^\\.']],
            },
          ],
          'simple-import-sort/exports': 'error',
        },
      },
    ],
    processor: angular.processInlineTemplates,
    rules: {
      '@angular-eslint/directive-selector': [
        'error',
        {
          type: 'attribute',
          prefix: 'baf',
          style: 'camelCase',
        },
      ],
      '@angular-eslint/component-selector': [
        'error',
        {
          type: 'element',
          prefix: 'baf',
          style: 'kebab-case',
        },
      ],
      '@typescript-eslint/naming-convention': [
        'error',
        {
          selector: 'default',
          format: ['camelCase'],
          leadingUnderscore: 'allow',
          trailingUnderscore: 'allow',
          filter: {
            regex: '^(ts-jest|\\^.*)$',
            match: false,
          },
        },
        {
          selector: 'default',
          format: ['camelCase'],
          leadingUnderscore: 'allow',
          trailingUnderscore: 'allow',
        },
        {
          selector: 'variable',
          format: ['camelCase', 'UPPER_CASE'],
          leadingUnderscore: 'allow',
          trailingUnderscore: 'allow',
        },
        {
          selector: 'typeLike',
          format: ['PascalCase'],
        },
        {
          selector: 'enumMember',
          format: ['PascalCase'],
        },
        {
          selector: 'property',
          format: null,
          filter: {
            regex: '^(host)$',
            match: false,
          },
        },
      ],
      complexity: 'error',
      'max-len': [
        'error',
        {
          code: 140,
        },
      ],
      'no-new-wrappers': 'error',
      'no-throw-literal': 'error',
      '@typescript-eslint/consistent-type-definitions': 'error',
      'no-shadow': 'off',
      '@typescript-eslint/no-shadow': 'error',
      'no-invalid-this': 'off',
      '@typescript-eslint/no-invalid-this': ['warn'],
      '@angular-eslint/no-host-metadata-property': 'off',
    },
  },
  {
    files: ['**/*.html'],
    extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility],
    rules: {},
  },
)
'], ['^\\.']], }, ], 'simple-import-sort/exportações': 'erro', }, }, ], processador: angular.processInlineTemplates, regras: { '@angular-eslint/seletor de diretiva': [ 'erro', { tipo: 'atributo', prefixo: 'baf', estilo: 'camelCase', }, ], '@angular-eslint/seletor de componente': [ 'erro', { tipo: 'elemento', prefixo: 'baf', estilo: 'caso de kebab', }, ], '@typescript-eslint/convenção de nomenclatura': [ 'erro', { seletor: 'padrão', formato: ['camelCase'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', filtro: { regex: '^(ts-jest|\\^.*)$', correspondência: falso, }, }, { seletor: 'padrão', formato: ['camelCase'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', }, { seletor: 'variável', formato: ['camelCase', 'UPPER_CASE'], sublinhado principal: 'permitir', sublinhado à direita: 'permitir', }, { seletor: 'typeLike', formato: ['PascalCase'], }, { seletor: 'enumMember', formato: ['PascalCase'], }, { seletor: 'propriedade', formato: nulo, filtro: { regex: '^(host)$', correspondência: falso, }, }, ], complexidade: 'erro', 'max-len': [ 'erro', { código: 140, }, ], 'sem novos wrappers': 'erro', 'no-throw-literal': 'erro', '@typescript-eslint/consistent-type-definitions': 'erro', 'sem sombra': 'desligado', '@typescript-eslint/no-shadow': 'erro', 'não-inválido-isso': 'desligado', '@typescript-eslint/no-invalid-this': ['avisar'], '@angular-eslint/no-host-metadata-property': 'desligado', }, }, { arquivos: ['**/*.html'], estende: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], regras: {}, }, )

Altere o prefixo do aplicativo em angular.json de app para baf.

Observe que o plug-in eslint-plugin-import não é compatível com eslint 9.

Há uma discussão acalorada no github - github.com/import-js/eslint-plugin-import/issues/2948

Ambiente mais bonito


Adicionar mais bonito:

yarn add -D prettier
fio adicionar -D mais bonito


Vamos definir as regras em .prettierrc.json:

yarn add -D prettier
{ "bracketSpacing": verdadeiro, "largura de impressão": 140, "semi": verdadeiro, "singleQuote": verdadeiro, "largura da guia": 2, "useTabs": falso }


Exclua tudo que não deve ser formatado em .prettierignore:

yarn add -D prettier
# Adicione arquivos aqui para ignorá-los e obter uma formatação mais bonita /dist /cobertura /tmp /node_modules /nginx /.vscode /.ideia pacote-lock.json pacote.json fio.lock .angular /junit junit.xml /.nx/cache

No IDE nas configurações mais bonitas - **/*.{js,ts,jsx,tsx,vue,astro,scss,css,html,json}.

Настройка линтеров и IDE для Angular 18

Ligações

Todas as fontes estão no github, no repositório - github.com/Fafnur/buy-and-fly

A demonstração pode ser vista aqui - buy-and-fly.fafn.ru/

Meus grupos: telegram, medium, vk, x.com, linkedin, site

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/fafnur/nastroika-lintierov-i-ide-dlia-angular-18-2130?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3