「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Angular 18 用のリンターと IDE のセットアップ

Angular 18 用のリンターと IDE のセットアップ

2024 年 11 月 9 日に公開
ブラウズ:479

eslint、prettier、env をアプリケーションに追加します。

残念ながら、Angular はデフォルトでこれらすべてを自ら生成しないのです。回路図を変更すると、数千の Angular プロジェクトの品質が向上します。

eslint 9 のセットアップ

eslint を接続します:

yarn ng add @angular-eslint/schematics

3 つのパッケージが package.json に追加されました:

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

angular.json のターゲット内:

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

eslint.config.js ファイルも作成されました:

// @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: {},
  }
);

基本的なリンターは優れていますが、さらに改良することもできます。

プラグインを追加します:

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

いくつかのルールを含めてみましょう:

// @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/exports': 'エラー', }、 }、 ]、 プロセッサ: angular.processInlineTemplates、 ルール: { '@angular-eslint/ディレクティブセレクター': [ 'エラー'、 { タイプ: '属性'、 接頭辞: 'baf'、 スタイル: 'キャメルケース'、 }、 ]、 '@angular-eslint/コンポーネントセレクター': [ 'エラー'、 { タイプ: '要素'、 接頭辞: 'baf'、 スタイル: 'ケバブケース'、 }、 ]、 '@typescript-eslint/命名規則': [ 'エラー'、 { セレクター: 'デフォルト', 形式: ['キャメルケース']、 先頭のアンダースコア: '許可'、 末尾のアンダースコア: '許可'、 フィルター: { 正規表現: '^(ts-jest|\\^.*)$', 一致: 偽、 }、 }、 { セレクター: 'デフォルト', 形式: ['キャメルケース']、 先頭のアンダースコア: '許可'、 末尾のアンダースコア: '許可'、 }、 { セレクター: '変数', 形式: ['キャメルケース', 'UPPER_CASE'], 先頭のアンダースコア: '許可'、 末尾のアンダースコア: '許可'、 }、 { セレクター: 'typeLike', 形式: ['PascalCase'], }、 { セレクター: 'enumMember', 形式: ['PascalCase'], }、 { セレクター: 'プロパティ', 形式: null、 フィルター: { 正規表現: '^(ホスト)$'、 一致: 偽、 }、 }、 ]、 複雑さ: 'エラー'、 '最大長': [ 'エラー'、 { コード: 140、 }、 ]、 'no-new-wrappers': 'エラー', 'no-throw-literal': 'エラー', '@typescript-eslint/consistent-type-settings': 'エラー', '影なし': 'オフ'、 '@typescript-eslint/no-shadow': 'エラー', 'no-invalid-this': 'オフ', '@typescript-eslint/no-invalid-this': ['警告'], '@angular-eslint/no-host-metadata-property': 'off', }、 }、 { ファイル: ['**/*.html']、 extends: [...angular.configs.templateRecommended, ...angular.configs.templateAccessibility], ルール: {}、 }、 )

angular.json のアプリケーション プレフィックスを app から baf に変更します。

eslint-plugin-import プラグインは eslint 9 ではサポートされていないことに注意してください。

github で激しい議論が行われています - github.com/import-js/eslint-plugin-import/issues/2948

よりきれいな設定


さらに可愛く追加:

yarn add -D prettier
糸追加 -D よりきれいになります


.prettierrc.json でルールを定義しましょう:

yarn add -D prettier
{ "bracketSpacing": true、 "printWidth": 140、 「セミ」:本当、 "singleQuote": true、 "タブ幅": 2、 "useTabs": false }


.prettierignore でフォーマットすべきでないものをすべて除外します:

yarn add -D prettier
# ここにファイルを追加すると、よりきれいなフォーマットから無視されます /dist /カバレッジ /tmp /node_modules /nginx /.vscode /。アイデア パッケージロック.json パッケージ.json 糸ロック .angular /junit junit.xml /.nx/キャッシュ

IDE のより適切な設定 - **/*.{js,ts,jsx,tsx,vue,astro,scss,css,html,json}.

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

リンク

すべてのソースは github のリポジトリにあります - github.com/Fafnur/buy-and-fly

デモはここでご覧いただけます - buy-and-fly.fafn.ru/

私のグループ: telegram、medium、vk、x.com、linkedin、site

リリースステートメント この記事は次の場所に転載されています: https://dev.to/fafnur/nastroika-lintierov-i-ide-dlia-angular-18-2130?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Go における確率的早期有効期限切れ
    Go における確率的早期有効期限切れ
    キャッシュスタンピードについて あれこれキャッシュする必要がある状況に陥ることがよくあります。多くの場合、これらの値は一定期間キャッシュされます。おそらくこのパターンに精通しているでしょう。キャッシュから値を取得しようとして、成功した場合は、その値を呼び出し元に返し、それで終わりで...
    プログラミング 2024 年 11 月 9 日に公開
  • JavaScript の正規表現一致で大文字と小文字を区別しないようにするにはどうすればよいですか?
    JavaScript の正規表現一致で大文字と小文字を区別しないようにするにはどうすればよいですか?
    JavaScript での大文字と小文字を区別しない正規表現一致の実行URL を操作する場合、多くの場合、クエリ文字列からデータを抽出する必要があります。 JavaScript では、正規表現を使用してこの抽出を実行するのは簡単ですが、大文字と小文字を区別しないようにするのは困難な場合があります。こ...
    プログラミング 2024 年 11 月 9 日に公開
  • PHP でデータ URI をファイルに変換するときに破損したイメージの問題を解決するにはどうすればよいですか?
    PHP でデータ URI をファイルに変換するときに破損したイメージの問題を解決するにはどうすればよいですか?
    PHP データ URI からファイルへ: 破損した画像の問題を解決するデータ URI からファイル形式への変換中に画像データの整合性を維持する重要です。 PHP の file_put_contents 関数を使用して JavaScript Canvas.toDataURL() 呼び出しからのデータを...
    プログラミング 2024 年 11 月 9 日に公開
  • データベースの階層データ構造は隣接リストと代替のどちらが最適ですか?
    データベースの階層データ構造は隣接リストと代替のどちらが最適ですか?
    データベースの階層データ構造: 隣接リストと他のアプローチリレーショナル データベースに階層データを実装する場合、開発者は通常 2 つのアプローチを検討します。 : 隣接リストとネストされたツリー。隣接リストは単純に見えますが、多数のクエリが発生する可能性があるため、トラバーサル操作のパフォーマンス...
    プログラミング 2024 年 11 月 9 日に公開
  • Cucumber.js: 動作駆動テストの完全ガイド
    Cucumber.js: 動作駆動テストの完全ガイド
    Cucumber.js は、平易な言語で記述された自動テストを実行するための人気のあるツールであり、開発者と開発者以外が共同でテストを行うことができます。これは、関係者間の明確なコミュニケーションが鍵となる行動駆動開発 (BDD) で特に役立ちます。人間が読める言語を使用することで、Cucumbe...
    プログラミング 2024 年 11 月 9 日に公開
  • Celestial Escapade: 宇宙とコードを巡る旅
    Celestial Escapade: 宇宙とコードを巡る旅
    インスピレーション 私はいつも宇宙の広大さと神秘に魅了されてきました。惑星の複雑な動き、天体の壮大さ、これらの要素は常に私の好奇心を刺激します。この課題に出会ったとき、私は宇宙に対する情熱を創造性とテクノロジーと組み合わせる機会だと考えました。私は、宇宙の畏怖の念を捉え、どこにいても、どのデバイスを...
    プログラミング 2024 年 11 月 9 日に公開
  • 数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    数式が含まれている場合でも、Openpyxl でセルの生の値を取得する方法
    Openpyxl で実際のセル値を取得する方法openpyxl を使用して Excel のセル値にアクセスすると、表示される値と、セルに数式が含まれている場合。これは、openpyxl が通常、数式を解釈して計算結果を取得するためです。数式を含む実際のセル値を取得するには、ワークブックのロード時に ...
    プログラミング 2024 年 11 月 9 日に公開
  • React の基本的な中心概念
    React の基本的な中心概念
    急速に進化する Web 開発の世界において、React は動的でパフォーマンスの高いユーザー インターフェイスを構築するための基礎であり続けています。経験豊富な開発者であっても、初心者であっても、React の可能性を最大限に活用するには、React の中核となる概念を理解することが不可欠です。この...
    プログラミング 2024 年 11 月 9 日に公開
  • Chrome の自動入力によってフォントが変更されないようにするにはどうすればよいですか?
    Chrome の自動入力によってフォントが変更されないようにするにはどうすればよいですか?
    Chrome の自動入力フォント変更の課題を克服するWindows で Chrome の自動入力機能を使用すると、迷惑なフォント変更の問題が発生する可能性があります。保存されたユーザー名の上にマウスを移動すると、フォント サイズとスタイルが変更され、フォームの配置が乱れます。この問題を軽減するために...
    プログラミング 2024 年 11 月 9 日に公開
  • エムとレム: 違いは何ですか?
    エムとレム: 違いは何ですか?
    概要: rem と em は両方とも CSS のサイズの単位です。 Rem は、root 要素のフォント サイズです。 Em はローカル コンテキストのフォント サイズです。 em ユニットは印刷タイポグラフィの世界から借用したもので、要素のフォント サイズをコンポーネント階層内で最も近い宣言された...
    プログラミング 2024 年 11 月 9 日に公開
  • Go で WebSocket を使用してリアルタイム通信を行う
    Go で WebSocket を使用してリアルタイム通信を行う
    チャット アプリケーション、ライブ通知、共同作業ツールなど、リアルタイムの更新が必要なアプリを構築するには、従来の HTTP よりも高速でインタラクティブな通信方法が必要です。そこで WebSocket が登場します。今日は、アプリケーションにリアルタイム機能を追加できるように、Go で WebSo...
    プログラミング 2024 年 11 月 9 日に公開
  • 重複の処理を含め、Python で文字列の可能なすべての順列を生成するにはどうすればよいですか?
    重複の処理を含め、Python で文字列の可能なすべての順列を生成するにはどうすればよいですか?
    Python での文字列の並べ替え指定された文字列の考えられるすべての並べ替えを見つけるのは、困難な作業になる場合があります。ただし、Python は itertools モジュールを使用した簡単な解決策を提供します。解決策: itertools.permutations() itertools.p...
    プログラミング 2024 年 11 月 9 日に公開
  • D3.js GeoJSON 描画の問題の修正: 巻き順を修正するには?
    D3.js GeoJSON 描画の問題の修正: 巻き順を修正するには?
    D3.js が GeoJSON を間違って描画する: 巻き順の問題geoJSON データを使用してロシア地域を視覚化しようとしたときに、プログラマーが問題に遭遇しましたここで、D3.js は、目的の地図の輪郭の代わりに単一の黒い四角形を描画します。この不一致は、geoJSON ファイル内の座標の巻き...
    プログラミング 2024 年 11 月 9 日に公開
  • 多重継承の問題
    多重継承の問題
    Java はクラスの多重継承をサポートしていません。クラスは (インスタンス変数を使用して) 状態を維持できますが、インターフェイスは維持できないため、標準メソッドはこの制限を回避できません。 デフォルト メソッドは、限定された形式の動作の多重継承を提供し、クラスがデフォルト メソッドを使用して複...
    プログラミング 2024 年 11 月 9 日に公開
  • getImageData() での「キャンバスはクロスオリジン データによって汚染されています」エラーを回避するにはどうすればよいですか?
    getImageData() での「キャンバスはクロスオリジン データによって汚染されています」エラーを回避するにはどうすればよいですか?
    getImageData() の「キャンバスがクロスオリジン データによって汚染されています」エラーを回避する方法getImageData( ) メソッドを使用してキャンバスからピクセル データを取得すると、「キャンバスはクロスオリジン データによって汚染されています。」というエラーが発生する場合が...
    プログラミング 2024 年 11 月 9 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3