eslint、prettier、env をアプリケーションに追加します。
残念ながら、Angular はデフォルトでこれらすべてを自ら生成しないのです。回路図を変更すると、数千の Angular プロジェクトの品質が向上します。
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}.
すべてのソースは github のリポジトリにあります - github.com/Fafnur/buy-and-fly
デモはここでご覧いただけます - buy-and-fly.fafn.ru/
私のグループ: telegram、medium、vk、x.com、linkedin、site
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3