」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為 Angular 18 設定 linter 和 IDE

為 Angular 18 設定 linter 和 IDE

發佈於2024-11-09
瀏覽:469

將 eslint、prettier、env 加入應用程式。

遺憾的是,Angular 預設不會自行產生這一切。更改原理圖可以提高數千個 Angular 專案的品質。

設定 eslint 9

連結 eslint:

yarn ng add @angular-eslint/schematics

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

基本的 linter 很好,但你可以讓它們變得更好!

新增插件:

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: {},
  },
)
'], ['^\\.']], }, ], '簡單導入排序/導出':'錯誤', }, }, ], 處理器: angular.processInlineTemplates, 規則:{ '@angular-eslint/指令選擇器': [ '錯誤', { 類型:'屬性', 字首:'baf', 樣式: '駝峰式', }, ], '@angular-eslint/組件選擇器': [ '錯誤', { 類型:'元素', 字首:'baf', 風格: 'kebab-case', }, ], '@typescript-eslint/命名約定': [ '錯誤', { 選擇器:'預設', 格式:['駝峰命名法'], 前導下劃線: '允許', 尾隨底線:'允許', 篩選: { 正規表示式: '^(ts-jest|\\^.*)$', 匹配:假, }, }, { 選擇器:'預設', 格式:['駝峰命名法'], 前導下劃線: '允許', 尾隨底線:'允許', }, { 選擇器:'變數', 格式:['駝峰式', 'UPPER_CASE'], 前導下劃線: '允許', 尾隨底線:'允許', }, { 選擇器:'typeLike', 格式:['帕斯卡命名法'], }, { 選擇器:'enumMember', 格式:['帕斯卡命名法'], }, { 選擇器:'屬性', 格式:空, 篩選: { 正規表示式:'^(主機)$', 匹配:假, }, }, ], 複雜性:'錯誤', '最大長度': [ '錯誤', { 代碼:140, }, ], '無新包裝':'錯誤', '無拋出文字':'錯誤', '@typescript-eslint/一致型別定義': '錯誤', '無陰影':'關閉', '@typescript-eslint/no-shadow': '錯誤', 'no-invalid-this': '關閉', '@typescript-eslint/no-invalid-this': ['警告'], '@angular-eslint/no-host-metadata-property': '關閉', }, }, { 文件:['**/*.html'], 擴充:[... angular.configs.templateRecommended,... angular.configs.templateAccessibility], 規則:{}, }, )

將 angular.json 中的應用程式前綴從 app 更改為 baf。

請注意,eslint 9 不支援 eslint-plugin-import 插件。

github上有熱烈討論 - github.com/import-js/eslint-plugin-import/issues/2948

更漂亮的環境


加上更漂亮的:

yarn add -D prettier
紗線添加-D更漂亮


讓我們在.prettierrc.json中定義規則:

yarn add -D prettier
{ “bracketSpacing”:true, “列印寬度”:140, 「半」:真實, 「單引號」:正確, “標籤寬度”:2, “useTabs”:假 }


排除 .prettierignore 中不應格式化的所有內容:

yarn add -D prettier
# 在此處新增檔案以忽略較漂亮的格式 / 距離 /覆蓋範圍 /tmp /節點模組 /nginx /.vscode /。主意 包鎖.json 包.json 紗線鎖 .角度 /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]刪除
最新教學 更多>
  • 如何處理 Selenium 中的「過時元素引用」異常?
    如何處理 Selenium 中的「過時元素引用」異常?
    陳舊元素引用:揭示原因並尋找解決方案在Selenium 中,遇到“陳舊元素引用”異常可能會令人沮喪,因為它表明被引用的元素不再附加到頁面文件。當 DOM 發生重大變更(例如動態載入或頁面導覽)時,通常會發生此錯誤。 要解決此問題,確定觸發異常的確切程式碼行至關重要。在提供的程式碼中,導致錯誤的行似乎...
    程式設計 發佈於2024-11-09
  • 如何有效率地在嵌套的 JavaScript 物件中尋找特定物件?
    如何有效率地在嵌套的 JavaScript 物件中尋找特定物件?
    迭代嵌套的JavaScript 物件迭代嵌套的JavaScript 物件可能具有挑戰性,特別是當您需要基於屬性檢索特定對象時價值。讓我們考慮以下範例:var cars = { label: 'Autos', subs: [ { label: 'SUVs', s...
    程式設計 發佈於2024-11-09
  • 最簡單的狀態教程
    最簡單的狀態教程
    Zustand 是一個小型、快速且可擴展的 React 狀態管理庫,可作為 Redux 等更複雜解決方案的替代方案。 Zustand 獲得如此大關注的主要原因是與 Redux 相比,它的體積小且語法簡單。 了解 Zustand 設置 首先,如果您還沒有安裝 Zustand 和 Ty...
    程式設計 發佈於2024-11-09
  • MongoDB 伺服器:概述
    MongoDB 伺服器:概述
    MongoDB 是一种流行的 NoSQL 数据库,提供高性能、可扩展且灵活的数据存储解决方案。与使用表和行的传统关系数据库不同,MongoDB 使用灵活的、类似 JSON 的结构(称为 BSON(二进制 JSON))将数据存储在文档中。这使得 MongoDB 能够轻松处理复杂的数据类型和层次关系。...
    程式設計 發佈於2024-11-09
  • 如何在 MySQL DELETE 語句中使用 LIMIT 刪除一定範圍的行?
    如何在 MySQL DELETE 語句中使用 LIMIT 刪除一定範圍的行?
    更正帶有LIMIT 的MySQL DELETE 語句的語法嘗試使用帶有LIMIT 的DELETE 語句從MySQL時LIMIT 子句,如果語法不正確,您可能會遇到錯誤。此錯誤通常表示用於指定限制的語法有問題。 所提供的查詢中的問題是您無法在 DELETE 語句的 LIMIT 子句中指定偏移量。在 D...
    程式設計 發佈於2024-11-09
  • 如何使用 os.walk() 在 Python 中建立帶有深度指示器的結構化目錄清單?
    如何使用 os.walk() 在 Python 中建立帶有深度指示器的結構化目錄清單?
    在Python 中使用os.walk() 遞歸地導航目錄為了創建更結構化的目錄列表,開發人員嘗試修改他們的程式碼將目錄顯示為大寫標題,並用虛線指示深度和目錄下的檔案。然而,他們最初的方法產生了不完整的結果。 為了解決這個挑戰,我們可以利用 Python 的 os.sep 屬性來正確描述路徑元件。這是...
    程式設計 發佈於2024-11-09
  • Java 中的設計模式及其範例
    Java 中的設計模式及其範例
    Java 中的設計模式是什麼? 設計模式是軟體設計中常見問題的可重複使用解決方案。它們代表了可應用於軟體開發中各種情況的最佳實踐,特別是像 Java 這樣的物件導向程式設計。 設計模式的類型 創建模式: 處理物件創建機制。 結構模式: 關注類別與物件的組成方...
    程式設計 發佈於2024-11-09
  • NestJS 與 Encore.ts:為您的 TypeScript 微服務選擇正確的框架
    NestJS 與 Encore.ts:為您的 TypeScript 微服務選擇正確的框架
    Introduction When web applications grow larger, so does the complexity in developing and maintaining the system. A common way to solve this i...
    程式設計 發佈於2024-11-09
  • 如何在 Python 中重置生成器物件?
    如何在 Python 中重置生成器物件?
    在Python 中重置生成器物件:探索替代方案產生器提供了一種迭代值序列的有效方法,而無需在記憶中。然而,一旦生成器產生了所有值,它就會耗盡並且不能直接重複使用。這就提出瞭如何在 Python 中重置生成器物件的問題。 不幸的是,生成器沒有內建的重置方法。要重複使用生成器,您有多種選擇:再次運行生成...
    程式設計 發佈於2024-11-09
  • 如何有效率地檢索MySQL中最後插入的行?
    如何有效率地檢索MySQL中最後插入的行?
    檢索 MySQL 中最後插入的行:高效方法高效檢索 MySQL 中最後插入的行是資料庫程式設計中的常見任務。以下是實現此目的的兩種有效方法:1。時間戳列:理想的解決方案是建立一個 TIMESTAMP 列,在行插入時自動捕獲當前時間戳記。這提供了一種可靠且準確的方法來確定最近的記錄。 2。 ORDER...
    程式設計 發佈於2024-11-09
  • 如何在PHP中儲存和恢復數組以實現高效的離線存取?
    如何在PHP中儲存和恢復數組以實現高效的離線存取?
    在PHP 中儲存和恢復數組以供本地訪問您已從遠端API 獲取數組並希望將其存儲在本地以供離線使用操縱。為了實現這一目標,您可以在不影響效能或檔案大小的情況下利用 JSON 序列化。 JSON 序列化:編碼和解碼PHP 為JSON 序列化提供了兩個關鍵函數:json_encode 將陣列轉換為人類可讀...
    程式設計 發佈於2024-11-09
  • 如何最小化 Go 中禁用追蹤日誌記錄語句的成本?
    如何最小化 Go 中禁用追蹤日誌記錄語句的成本?
    Go 中禁用語句的低成本追蹤日誌記錄在Go 中,追蹤日誌記錄提出了一個獨特的挑戰:最大限度地減少關鍵路徑中停用日誌語句的成本。與 C/C 不同,Go 沒有預處理器宏,因此有必要探索替代解決方案。 一種方法涉及使用 fmt.Stringer 和 fmt.GoStringer 介面。透過延遲格式化直到日...
    程式設計 發佈於2024-11-09
  • 如何在 JavaScript 中將多個數字組合併為一個?
    如何在 JavaScript 中將多個數字組合併為一個?
    將陣列項目連接成單一陣列在JavaScript 中,將多個陣列的元素組合成一個新陣列可能是一種常見的需求。實現此目的的一種方法是使用循環迭代每個來源數組並將項目推入目標數組。然而,這種方法可能乏味且效率低。 利用「concat」函數幸運的是,JavaScript 提供了一個更簡單、更優雅的解決方案:...
    程式設計 發佈於2024-11-09
  • 掌握 JavaScript 中的循環:綜合指南
    掌握 JavaScript 中的循環:綜合指南
    循环是编程的基础:使我们能够用最少的代码执行重复性任务。无论您是刚刚入门的初学者,还是希望精炼知识的经验丰富的开发人员,理解循环都将大大增强您编写高效、干净且有趣的代码的能力。 在本指南中,我们将深入探讨不同类型的循环、它们在流行编程语言中的语法,以及有关何时以及如何有效使用它们的一些提示。 什么是...
    程式設計 發佈於2024-11-09
  • 如何在不使用外部程式的情況下在 PHP 中確定超過 2GB 檔案的檔案大小?
    如何在不使用外部程式的情況下在 PHP 中確定超過 2GB 檔案的檔案大小?
    在PHP 中無需外部程式即可確定2GB 檔案的大小在PHP 中無需外部程式即可確定2GB 檔案的大小PHP 在處理超過2GB 的檔案大小方面的限制可能會令人沮喪。然而,有一些方法可以克服這個問題,而無需求助於外部程序。 一種方法是透過“大文件工具”,這是一個開源項目,可以在 PHP 中操作超過 2G...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3