”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为 Angular 18 设置 linter 和 IDE

为 Angular 18 设置 linter 和 IDE

发布于2024-11-09
浏览:593

将 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]删除
最新教程 更多>
  • 状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    状态测试用例中的 ReactDOM.unstable_batchedUpdates。
    在本文中,我们将研究 ReactDOM.unstable_batchedUpdates 在测试用例中的使用,特别是在 Zustand(React 的流行状态管理库)中。我们还将分解测试并解释批量更新如何通过最小化不必要的重新渲染来增强 React 的性能。 理解测试用例 这是我们将要...
    编程 发布于2024-11-09
  • 如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    如何使用 jQuery 和 CSS 创建响应式水平页面滑动系统?
    响应式水平页面滑动问题设计响应式水平导航系统面临几个挑战:维护页面视口内的可见性防止页面之间出现间隙或重叠允许页面超出 100% 高度,并具有滚动条可见性确保与 Internet Explorer 9 或更高版本的兼容性解决方案此解决方案采用 jQuery 并包含以下主要功能:响应式大小调整: 脚本...
    编程 发布于2024-11-09
  • 为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    为什么编译器中的“static_assert”与非类型模板参数的行为不同?
    编译器中非类型模板参数的 static_assert 行为不一致在 C 中, static_assert 可用于在编译时验证条件。然而,最近的观察发现,当 static_assert 与不同编译器中的非类型模板参数结合使用时,其行为存在差异。具体来说,以下代码片段:template <int ...
    编程 发布于2024-11-09
  • 何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    何时以及如何在 JavaScript 的 parseInt() 函数中使用 Radix?
    了解 parseInt 中对基数的需求JavaScript 中的 parseInt() 函数允许您将表示数字的字符串转换为整数。但是,您可能并不总是希望将整数解析为以 10 为基数的数字。这就是基数参数发挥作用的地方。什么是基数?基数是指在数字系统中单个数字可以表示的值的数量。例如,我们常用的十进制...
    编程 发布于2024-11-09
  • 尝试重载队列构造函数
    尝试重载队列构造函数
    该项目旨在通过添加两个新的构造函数来改进 Queue 类。 第一个构造函数将从另一个现有队列创建一个新队列。 第二个构造函数将允许您创建具有初始值的队列。 这些构造函数显着提高了 Queue 类的可用性。 1 创建一个名为 QDemo2.java 的文件,并将更新后的 Queue 类从 Try T...
    编程 发布于2024-11-09
  • 实施订单处理系统:零件监控和警报
    实施订单处理系统:零件监控和警报
    1. Introduction and Goals Welcome to the fourth installment of our series on implementing a sophisticated order processing system! In our pre...
    编程 发布于2024-11-09
  • 以客户端为中心的错误处理
    以客户端为中心的错误处理
    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。 超时:请求花费太长时间才能收到响应。 DNS 错误:域名解析问题...
    编程 发布于2024-11-09
  • 如何在Python中高效计算目录大小?
    如何在Python中高效计算目录大小?
    使用 Python 进行目录大小计算为了测量目录的空间占用情况,Python 提供了几种方法。下面我们深入探讨一个高效、全面的解决方案:import os def directory_size(start_path): total_size = 0 for root, directo...
    编程 发布于2024-11-09
  • 如何修复Go模块导入过时的包版本?
    如何修复Go模块导入过时的包版本?
    Go 模块导入过时的包版本尝试使用 Go 模块将新包合并到项目中时,您可能会遇到以下问题:尽管该包被标记为“最新”,但模块系统检索该包的过时版本。这个过时的版本可能缺少代码所需的功能,从而导致编译或运行时错误。解决方案:在 go.mod 文件中指定版本Go 模块系统允许您可以指定要导入的包的确切版本...
    编程 发布于2024-11-09
  • 如何防止 Pandas 在保存 CSV 时添加索引列?
    如何防止 Pandas 在保存 CSV 时添加索引列?
    避免使用 Pandas 保存的 CSV 中的索引列使用 Pandas 进行修改后保存 csv 文件时,默认行为是包含索引列。为了避免这种情况,可以在使用 to_csv() 方法时将索引参数设置为 False。为了详细说明,请考虑以下命令序列:pd.read_csv('C:/Path/to/file....
    编程 发布于2024-11-09
  • 何时使用按值传递与按右​​值引用传递?
    何时使用按值传递与按右​​值引用传递?
    理解按值传递与按右​​值引用传递定义函数参数时,在按值传递和按右值引用传递之间进行选择可以显着影响函数的接口和效率。按值传递与按右​​值传递参考在按值传递中,会在函数内创建参数的副本。通过右值引用传递时,会创建对原始参数的引用,从而允许直接操作该参数。接口中的区别右值引用参数的使用向调用者传达以下消...
    编程 发布于2024-11-09
  • 如何使用 Joda-Time 将日期字符串转换为日期时间对象?
    如何使用 Joda-Time 将日期字符串转换为日期时间对象?
    使用 Joda 时间库将日期字符串转换为 DateTime 对象:尝试转换格式为“04/”的日期字符串时02/2011 20:27:05” 到使用 Joda-Time 库的 DateTime 对象,您可能会遇到指示格式无效的错误。出现此错误的原因是默认的 DateTime 构造函数需要标准日期格式,...
    编程 发布于2024-11-09
  • PHP 中的多重继承
    PHP 中的多重继承
    继承:继承是面向对象编程(OOP)中的一个基本概念,它允许类从其他类继承属性和行为。它是一种基于现有类创建新类、促进代码重用以及在类之间建立层次关系的机制。 继承基于“父子”或“超类-子类”关系的概念。另一个类继承自的类称为超类或基类,而从超类继承的类称为子类或派生类。子类继承其超类的所有属性(变量...
    编程 发布于2024-11-09
  • 如何在处理 UTF-8 编码的同时在 JavaScript 中解码 Base64 字符串?
    如何在处理 UTF-8 编码的同时在 JavaScript 中解码 Base64 字符串?
    使用 JavaScript atob 解码 Base64 函数:处理 UTF-8JavaScript 的 atob() 函数旨在解码 Base64 编码的字符串。用户在解码 UTF-8 编码字符串时可能会遇到问题,导致生成 ASCII 编码字符而不是正确的 UTF-8 表示形式。挑战:理解 Unic...
    编程 发布于2024-11-09
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3