Wir portieren das Angular-Projekt auf ESLint mit Prettier, Husky und Lint-Inszenierung

Hallo Habr! Mein Name ist Bogdan, ich arbeite im PIC Digital Front-End Teamleiter. Wir entwickeln die meisten Projekte auf Angular. Vor kurzem habe ich beschlossen, unsere Styleguides zu überprüfen und neue Tools für eine bequemere Arbeit hinzuzufügen.

Als Linter habe ich mich für ESLint entschieden, da Angular bald darauf übertragen werden soll. In diesem Artikel möchte ich Anweisungen zum Wechsel von TSLint zu ESLint weitergeben und gleichzeitig erläutern, wie Prettier von ESLint ausgeführt wird, wie AirBnB-Styleguide-Regeln hinzugefügt werden und wie das Flusen durch Festlegen von VS-Code- und Git-Hooks bequem und unsichtbar gemacht wird.

Schöner & ESLint


ESLint ist ein Tool zur statischen Code-Analyse. Die Regeln sind in zwei Gruppen unterteilt:

  • Formatierung - um den Code in eine Ansicht zu bringen: Zeilenlängen, Kommas, Semikolons usw.
  • Codequalität - Suche nach problematischen Codevorlagen: unnötiger Code, Fehler.

Prettier ist ein automatisches Code-Formatierungswerkzeug.

Die Frage, die mich interessierte, war: Warum Prettier verwenden, wenn ESLint auch Code formatieren kann?

Die Antwort ist einfach: Hübscher formatiert den Code viel besser: Entfernt alle Formatierungen und schreibt den Code vollständig in einem einzigen Stil neu. Auf diese Weise können Entwickler die Codeformatierung vergessen und keine Zeit damit verschwenden, den Codestil zur Überprüfung zu diskutieren. Zum Beispiel haben wir eine lange Codezeile:

Bild

Wenn wir versuchen, die Formatierung über ESLint zu ändern, wird uns einfach ein Fehler angezeigt:

eslint example.ts --fix

output:
error    This line has a length of 97. Maximum allowed is 80

Ein solches Beispiel zeigt, dass Linter nicht immer bei der Code-Formatierung helfen kann und Entwickler diesen Code je nach ihren persönlichen Überlegungen auf unterschiedliche Weise formatieren können.

Wenn wir die Datei mit Prettier speichern oder formatieren, hat die Zeile die Form:

Bild

Prettier bietet einen einheitlichen Stil in der gesamten Codebasis. Daher kann und sollte es zusammen mit ESLint verwendet werden, aber Sie müssen sie so konfigurieren, dass sie sich nicht gegenseitig stören.

ESLint-Setup


Das Wesentliche beim Flusen mit ESLint sind Parser, die den Code zur weiteren Softwareverarbeitung in AST (Abstract Syntax Tree) umwandeln , und Plugins, die Regeln enthalten, z. B. empfohlene Regeln für TypeScript-Flusen oder AirBnB-Code-Leitfadenregeln.

Installation


Um eine Angular-Anwendung nach ESLint zu migrieren, benötigen wir die folgenden Abhängigkeiten:


Um sie zu installieren, führen Sie einfach den folgenden Befehl aus:

ng add @angular-eslint/schematics

Zum Zeitpunkt des Schreibens verfügen Typoskript-Eslint und Winkel-Eslint nicht über alle Entsprechungen für die Regeln in der Standard- Codelyzer- Konfiguration für TSLint, die meisten sind jedoch bereits vorhanden. Sie können den aktuellen Status der Übertragung von Regeln von TSLint nach ESLint in den Mono-Repositorys Angular ESLint und TypeScript ESLint überwachen .

Konfigurationskonfiguration


Alles, was wir brauchen, um Angular-Anwendungen zu fusseln, haben wir installiert. Fahren wir nun mit der Konfiguration von ESLint fort. Erstellen wir eine .eslintrc.js-Datei und fügen die empfohlenen Einstellungen für Angular ESLint hinzu:

module.exports = {
  extends: ['plugin:@angular-eslint/recommended'],
  rules: {
    '@angular-eslint/directive-selector': [
      'error',
      { type: 'attribute', prefix: 'app', style: 'camelCase' },
    ],
    '@angular-eslint/component-selector': [
      'error',
      { type: 'element', prefix: 'app', style: 'kebab-case' },
    ],
  },
  overrides: [
    //   ,       *.component.ts
    {
      files: ['*.component.ts'],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      plugins: ['@angular-eslint/template'],
      processor: '@angular-eslint/template/extract-inline-html',
    },
  ],
};

Konfigurationen können in verschiedenen Formaten beschrieben werden: JavaScript-, JSON- oder YAML-Datei. Sie können Kommentare in JavaScript hinterlassen.

"Plugin: @ angle-eslint / empfohlen" enthält Einstellungen für 3 Plugins gleichzeitig: "@ typescript-eslint / eslint-plugin", "@ angle-eslint / eslint-plugin" und "@ angle-eslint / eslint-plugin-template" "" Sie können lesen , welche Regeln er setzt hier .

Ng Flusenbefehl Update


Auch in der Konfiguration von angle.json müssen Sie den Befehl ng lint aktualisieren , um @ angle-eslint / builder auszuführen :

"lint": {
  "builder": "@angular-eslint/builder:lint",
  "options": {
    "eslintConfig": ".eslintrc.js",
    "tsConfig": [
      "tsconfig.app.json",
      "tsconfig.spec.json",
      "e2e/tsconfig.json"
    ],
    "exclude": [
      "**/node_modules/**"
    ]
  }
},

Das grundlegende ESLint-Setup ist fertig. Jetzt können Sie ESLint mit dem Standardbefehl ng lint starten .

Installieren Sie zusätzliche Plugins


Um das Plugin für ESLint zu installieren, z. B. für Flusen-Unit-Tests in Angular, müssen Sie das Jasmine-Plugin herunterladen und den Einstellungen hinzufügen :

npm install eslint-plugin-jasmine --save-dev

Fügen Sie der Eigenschaft "overrides" einen neuen Einstellungsblock für Dateien mit der Erweiterung * .spec.ts hinzu:

overrides: [
  ...,
  {
    files: ['src/**/*.spec.ts', 'src/**/*.d.ts'],
    parserOptions: {
      project: './src/tsconfig.spec.json',
    },
    //   
    extends: ['plugin:jasmine/recommended'],
    //    
    plugins: ['jasmine'],
    env: { jasmine: true },
    //   'no-unused-vars'
    rules: {
      '@typescript-eslint/no-unused-vars': 'off',
    },
  }
],

Analog können Sie andere Plugins für verschiedene Dateierweiterungen hinzufügen.

Hinzufügen von Style Guide-Handbüchern


Um eine größere Konsistenz der Codebasis zu erreichen, können Sie die Regeln eines der gängigen Styleguides auswählen und zur ESLint-Konfiguration hinzufügen:

  • AirBnB : Das beliebteste und strengste der drei obligatorischen Nachkommas und Semikolons.
  • Google : Ähnlich wie AirBnB in Bezug auf die Formatierung, jedoch weniger strenge, obligatorische JSDoc-Kommentare.
  • StandartJS : Verbietet die Verwendung von Kommas und Semikolons.

Wählen Sie einen Styleguide, der besser zu Ihrem Team passt. Sie können abwechselnd alle Styleguides eines großen Projekts ausprobieren, sehen, welche Fehler der Linter erzeugt, und auf dieser Grundlage eine Auswahl treffen.

Wählen Sie eine Implementierung des TypeScript-Styleguides aus, da JavaScript-Regeln unter TypeScript möglicherweise nicht ordnungsgemäß funktionieren.

Fügen wir als Beispiel den AirBnB-Styleguide zu unserer ESLint-Konfiguration hinzu. Installieren Sie dazu die Konfiguration mit AirBnB-Regeln für TypeScript und das Plugin mit Regeln für die Arbeit mit der Import / Export-Syntax:

npm install eslint-plugin-import eslint-config-airbnb-typescript --save-dev

Um die Einstellungen der obersten Ebene nicht zu ändern, erstellen wir in der Eigenschaft "overrides" einen neuen Regelblock mit den AirBnB-Styleguide-Regeln und dem für ihre Arbeit erforderlichen TypeScript-Parser:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
    },
  ]
}

Um einen weiteren Styleguide hinzuzufügen, müssen Sie eine Reihe von Regeln für TypeScript installieren, einen neuen Regelblock in "Überschreibungen" mit den Regeln des Styleguides erstellen und den für ihre Arbeit erforderlichen Parser angeben.

Anpassungsregeln


Wenn Sie einige Regeln im Stil des Handbuchs deaktivieren oder neu definieren möchten, können Sie dies in der Eigenschaft "rules" tun:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        'airbnb-typescript/base',
      ],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 2020,
        sourceType: 'module',
      },
      //  
      rules: {
        'import/no-unresolved': 'off',
        'import/prefer-default-export': 'off',
        'class-methods-use-this': 'off',
        'lines-between-class-members': 'off',
        '@typescript-eslint/unbound-method': [
          'error',
          {
            ignoreStatic: true,
          },
        ],
      },
    },
  ]
}


Schöner konfigurieren


Um Prettier zu unserer Konfiguration hinzuzufügen, müssen wir Prettier selbst installieren, ein Plugin mit Prettier-Regeln sowie eine Konfiguration, die alle Regeln deaktiviert, die möglicherweise mit Prettier in Konflikt stehen:

npm i prettier eslint-config-prettier eslint-plugin-prettier --save-dev

Fügen Sie in den "Überschreibungen" im Block mit den Regeln von Dateien mit der Erweiterung * .ts in der Eigenschaft "Erweitert" ganz unten die Regeln und hübscheren Einstellungen hinzu:

module.exports = {
  ...,
  overrides: [
    ...,
    {
      files: ['*.ts'],
      extends: [
        //   AirBnB
	'airbnb-typescript/base',
	//   Prettier
	'prettier/@typescript-eslint',
	'plugin:prettier/recommended',
      ],
      ...,
    },
  ]
}

Die Konfiguration für Prettier muss immer ganz unten in der Liste stehen, um alle Regeln zu überschreiben, die möglicherweise mit Prettier in Konflikt stehen.

`prettier / @ typescript-eslint` deaktiviert die` @ typescript-eslint` -Regeln, die mit Prettier in Konflikt stehen können, und` plugin: prettier / empfohlene` macht drei Dinge:

  • beinhaltet eslint-plugin-prettier,
  • druckt schönere / schönere Regelfehler als "Fehler" an die Konsole,
  • Fügt hübschere eslint-config-hübschere Formatierungsregeln hinzu.

Konfiguration für hübscher:


Prettier kann Code ohne Einstellungen formatieren. Um jedoch mit dem AirBnB-Styleguide übereinzustimmen, müssen Sie einige Einstellungen hinzufügen. Erstellen Sie die Datei .prettierrc.js im Stammverzeichnis der Anwendung:

module.exports = {
  trailingComma: "all",
  tabWidth: 2,
  semi: true,
  singleQuote: true,
  bracketSpacing: true,
  printWidth: 100
};

Diese Einstellungen werden sowohl von ESLint als auch von Prettier verwendet, wenn Sie damit Dateien in VS Code oder mit dem folgenden Befehl formatieren:

prettier "--write ."

VS-Code konfigurieren


VS Code kann gefundene ESLint-Fehler beim Speichern von Fehlern hervorheben und korrigieren. Laden Sie dazu das ESLint-Plugin für VS-Code herunter und erstellen Sie im Projekt eine Datei mit den Einstellungen für den Arbeitsbereich .vscode / settings.json:

  "eslint.validate": [ "javascript", "typescript", "html"],

  "eslint.options": {
    "extensions": [".js", ".ts", "html"]
  },

  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
  },

Hier konfigurieren wir ESLint, um Fehler beim Speichern von Dateien mit den Erweiterungen .js, .ts und .html hervorzuheben und zu korrigieren.

Um ein Dokument mit den Tastenkombinationen „Umschalt + Option + F“ oder „Umschalt + Alt + F“ zu formatieren , laden Sie das Prettier-Plugin für VS-Code herunter und legen Sie es als Standardformatierer fest.

Git-Hooks einrichten


Git-Hooks sind Skripte, die Git bei bestimmten Ereignissen aufruft: Festschreiben, Push, Empfangen.

Mit ihrer Hilfe können wir beim Erstellen eines Commits mit dem Flusen des Codes beginnen, damit weniger Fehler in den Anforderungspool gelangen. Für bequemere Arbeit mit Git Haken, installieren Husky , und nur den Code zu überprüfen , die zu den Commit hinzugefügt wird (dies ist nützlich bei großen Projekten , bei denen Fusseln viel Zeit in Anspruch nimmt) Fussel-staged :

npm i husky lint-staged --save-dev

Fügen Sie die Einstellungen für diese Plugins zu package.json hinzu:

"scripts": {
  ...
},
"husky": {
  "hooks": {
    "pre-commit": "lint-staged --relative"
  }
},
"lint-staged": {
  "*.{js,ts}": [
     "eslint --fix"
  ]
},

lint-staged übergibt ein Array geänderter Dateien an den aufgerufenen Befehl. Der Befehl ng lint weiß nicht, wie ein Array von Dateien akzeptiert werden soll. Um ihn zu verwenden, müssen Sie einen zusätzlichen Skriptprozessor schreiben. Oder Sie können einfach ESLint aufrufen, wie in diesem Beispiel. Eine solche Lösung kann für Precommits verwendet werden, und Sie können ng lint ausführen, um das gesamte Projekt zu fusseln , z. B. in der CI-Pipeline.

Ergebnisse


In zukünftigen Versionen von Angular wird ESLint mit Grundregeln sofort einsatzbereit sein. Jetzt erfordert der ESLint-Konfigurationsprozess einige zusätzliche Schritte, ESLint verfügt nicht über Entsprechungen für einige Regeln von TSLint und Angular ESLint befindet sich noch in der Alpha-Version. Daher liegt es an Ihnen, jetzt zu ESLint zu wechseln oder nicht.

Den Leitfadencode, zusätzliche Regeln, Prettier, Husky und Lint-Staged müssen Sie jedoch selbst konfigurieren. Ich hoffe, dieser Artikel hat Ihnen geholfen, herauszufinden, wie all diese Dinge zusammenarbeiten.

Das Konfigurieren von Lintern mag wie eine triviale Aufgabe erscheinen, beinhaltet jedoch einige wichtige organisatorische Probleme: Auswahl von Styleguides, Synchronisierung verschiedener Lösungen miteinander.

Die Zeit, die Sie in Zukunft für die Konfiguration des Linter benötigen, spart Ihnen jedoch erheblich Zeit bei der Erörterung des Stils und der Formatierung des Codes bei der Codeüberprüfung, reduziert die Anzahl der Fehler, die in den Anforderungspool fallen, und stellt die Konsistenz der Codebasis sicher.

Eine Beispielimplementierung finden Sie auf Github .

Wenn Sie einen Fehler in der Konfiguration finden oder Add-Ons haben - schreiben Sie!

Verweise



All Articles