Code Quality

ESLint

ESLint ist der pluggable Linter, der Bugs findet und Konventionen erzwingt, bevor sie das Review erreichen. Mit Flat Config und TypeScript-Support passt er in jeden modernen Stack.

intermediate13 min readUpdated 15. Sept. 2026
eslint.config.js
js
// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
  js.configs.recommended,
  ...tseslint.configs.recommended,
  {
    rules: {
      "no-console": ["warn", { allow: ["warn", "error"] }],
      "no-unused-vars": "off",
      "@typescript-eslint/no-unused-vars": "error",
    },
  },
);
Parses
JavaScript und TypeScript
Config
eslint.config.js (flat)
Regeln
Off, warn, error
Fixes
Viele Regeln mit Auto-Fix
Erweiterbar
Plugins und Parser
Läuft in
CLI, Editoren, CI

Warum es wichtig ist

Warum sich Linting auszahlt

Bugs frühzeitig finden

Regeln erkennen ungenutzte Variablen, unsichere Gleichheitsprüfungen, fehlende awaits und hunderte andere Fehler, bevor sie live gehen.

Automatische Fixes

Viele Probleme werden mit --fix behoben, sodass Style-Fragen und einfache Bugs ohne manuelles Editieren korrigiert werden.

Konventionen erzwingen

Teams kodifizieren ihre Standards in der Config, damit sich Reviews auf das Design konzentrieren können statt auf Nitpicks.

Das Gesamtbild

Die drei Grundideen hinter ESLint

Ein Parser liest deinen Code, ein Satz von Regeln meldet Probleme und die Config entscheidet, welche Regeln wo gelten.

Der Parser

Lesen

Wandelt Quellcode in einen AST um, den Regeln untersuchen können, einschließlich TypeScript über einen Parser.

Regeln

Melden

Einzelne Prüfungen, die jeweils als off, warn oder error konfigurierbar und oft automatisch behebbar sind.

Config

Zusammensetzen

Flat Config-Dateien kombinieren empfohlene Presets, Plugins und Overrides pro Datei.

ESLint auf einen Blick

Der Kern von ESLint

eslint.config.js

Die Flat Config-Datei, die ein Array von Config-Objekten exportiert.

Rule Severity

off, warn und error steuern, wie jede Regel gemeldet wird.

Plugins

Fügen Regeln für React, TypeScript, Imports, Accessibility und mehr hinzu.

Presets

Shareable Configs bündeln einen kuratierten Satz von Regeln.

--fix

Wendet automatische Fixes für die Regeln an, die dies unterstützen.

Editoren und CI

Lokal beim Speichern linten und den Build in der CI fehlschlagen lassen.

Eine kurze Geschichte

Vom JSHint-Nachfolger zum Linting-Standard

  1. 2013

    ESLint veröffentlicht

    Nicholas Zakas erstellt einen vollständig pluggable Linter als Nachfolger von JSHint.

    13
  2. 2015

    ES6 und JSX Support

    Moderne Syntax und React-Support machen ESLint zur Standardwahl.

    15
  3. 2019

    TypeScript First-Class

    typescript-eslint bringt type-aware Linting in das Ökosystem.

    19
  4. 2024

    Flat Config als Standard

    Das Flat Config-Format wird zum Standard und ersetzt .eslintrc-Dateien.

    24
  5. Heute

    Der Linting-Standard

    Wird von fast jedem JavaScript- und TypeScript-Projekt verwendet.

    Heute

Der vollständige Leitfaden

ESLint: Alles was Sie wissen müssen

Was ist ESLint?

ESLint ist ein pluggable Linter für JavaScript und TypeScript. Es analysiert Ihren Code und überführt ihn in einen Syntax-Baum, wendet eine Reihe von Regeln darauf an und meldet Probleme. Die Regeln reichen von der Erkennung echter Bugs – ungenutzte Variablen, fehlende await, unsichere Gleichheitsprüfungen – bis hin zu Konventionen, die Ihr Team durchsetzen möchte.

Der Nutzen summiert sich. Jede Regel fängt eine bestimmte Fehlerklasse einmal, überall und für immer ab, anstatt sich darauf zu verlassen, dass Reviewer dies bemerken. Viele Regeln beheben Fehler zudem selbstständig, sodass eslint --fix eine überraschend große Menge an Code automatisch bereinigt. ESLint ist eines der effektivsten Tools in einem JavaScript-Projekt.

Flat Config

ESLint verwendet die flat config: eine Datei, die ein Array von Konfigurationsobjekten exportiert. Diese ersetzt das ältere .eslintrc-Format durch explizite Imports und eine vorhersehbare Zusammensetzung.

// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
  { ignores: ["dist", "coverage", "**/*.generated.*"] },
  js.configs.recommended,
  ...tseslint.configs.recommended,
  {
    files: ["**/*.ts", "**/*.tsx"],
    rules: {
      "@typescript-eslint/no-floating-promises": "error",
    },
  },
);

Jedes Objekt kann festlegen, für welche Dateien es gilt, welche Plugins es registriert und welche Regeln es definiert. Spätere Objekte überschreiben frühere, sodass das Array von oben nach unten wie eine Kaskade gelesen wird.

Regeln und Schweregrad

Jede Regel hat einen Schweregrad: "off", "warn" oder "error".

// rules.js
export default [
  {
    rules: {
      eqeqeq: "error",              // require ===
      "no-unused-vars": "warn",
      "no-console": ["warn", { allow: ["warn", "error"] }],
    },
  },
];

Einige Regeln akzeptieren Optionen, wie es no-console hier tut. error führt zum Fehlschlagen der CI; warn meldet den Fehler, ohne den Prozess zu stoppen. Verwenden Sie warn für Regeln, die Sie schrittweise einführen, und error für alles, was einen Merge blockieren sollte.

Plugins und Presets

Plugins fügen Regeln für spezifische Ökosysteme hinzu, während Presets eine kuratierte Auswahl dieser Regeln bündeln.

// react.js
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";

export default [
  react.configs.flat.recommended,
  reactHooks.configs["recommended-latest"],
];

Gängige Plugins decken React, Vue, TypeScript, Imports, Testing-Libraries und Accessibility ab. Wenn man mit eslint:recommended startet und ein Framework-Preset hinzufügt, erhält man bereits 90 % des Nutzens bei fast keiner Konfiguration. Füge einzelne Regeln nur dann hinzu, wenn es einen konkreten Grund dafür gibt.

Typ-bewusstes Linting

typescript-eslint kann den TypeScript Type Checker für Regeln nutzen, die eine reine Syntax-Analyse nicht bewältigen kann.

// type-aware.js
export default tseslint.config({
  languageOptions: {
    parserOptions: {
      projectService: true,
      tsconfigRootDir: import.meta.dirname,
    },
  },
  rules: {
    "@typescript-eslint/no-floating-promises": "error",
    "@typescript-eslint/no-misused-promises": "error",
  },
});

Regeln wie no-floating-promises finden Bugs, die beim bloßen Lesen des Codes extrem schwer zu entdecken sind: zum Beispiel ein Promise, das niemals mit await aufgerufen wird. Typ-bewusstes Linting ist langsamer, da der Type Checker ausgeführt werden muss. Daher aktivieren viele Projekte diese Funktion für den Quellcode, lassen sie aber für Tests und Konfigurationsdateien weg.

Beheben und Deaktivieren

Viele Regeln lassen sich automatisch beheben. Führen Sie daher den Fixer aus, bevor Sie die Ausgabe lesen.

npx eslint . --fix

Wenn Sie eine Regel wirklich durchbrechen müssen, deaktivieren Sie diese so spezifisch wie möglich und begründen Sie dies.

// targeted.js
// eslint-disable-next-line no-console -- intentional debug log
console.log("payment flow", payload);

Ein pauschales /* eslint-disable */ am Anfang einer Datei schaltet alles aus – auch die Regeln, die echte Bugs erkannt hätten. Bevorzugen Sie eine einzeilige Deaktivierung mit einer Begründung und passen Sie die Konfiguration an, falls eine Regel mit Ihren Standards kollidiert.

Editoren und CI

Installiere die ESLint-Extension für deinen Editor und aktiviere „fix-on-save“. So erhältst du bereits während des Tippens Feedback und sichere Fixes werden sofort angewendet, wodurch das Linting Teil des Editing-Loops wird und nicht als lästige Pflicht empfunden wird. Führe ESLint in der CI als separaten Schritt aus, damit Fehler klar und schnell ersichtlich sind, und cache die Ergebnisse, sofern möglich.

Wo ESLint ins Spiel kommt

ESLint kümmert sich um die Code-Qualität; Prettier übernimmt die Formatierung. Das Standard-Setup sieht vor, dass Prettier für den Style zuständig ist, während die kollidierenden ESLint-Regeln deaktiviert werden – oft mithilfe einer Shared Config. Zusammen sorgen sie dafür, dass Reviewer über das Design diskutieren anstatt über Abstände und Semikolons.

Best Practices

  • Beginnen Sie mit eslint:recommended und einem Framework-Preset und fügen Sie dann gezielt Regeln hinzu.
  • Verwenden Sie die Flat Config mit expliziten Imports und einer klaren Ignores-Liste.
  • Überlassen Sie das Formatting vollständig Prettier und deaktivieren Sie kollidierende ESLint-Regeln.
  • Führen Sie --fix aus, bevor Sie die verbleibenden Probleme analysieren.
  • Aktivieren Sie type-aware rules für Quelldateien.
  • Deaktivieren Sie Regeln nur punktuell und fügen Sie einen Kommentar hinzu, der erklärt, warum.
  • Nutzen Sie Linting im Editor, in einem Pre-Commit-Hook und in der CI.

Häufige Fehler

  • Linting von dist, generiertem Code und Dependencies.
  • Pauschales Deaktivieren von Regeln, anstatt die eigentliche Ursache zu beheben.
  • Alle Regeln gleichzeitig aktivieren und im “Noise” versinken.
  • Duplizieren von Formatierungsregeln, die bereits von Prettier übernommen werden.
  • Type-aware Linting auf dem gesamten Repo ausführen und so die Performance verschlechtern.
  • Warnings als harmlos betrachten, bis sie sich zu einem riesigen Berg aufstauen.

Wie geht es weiter?

ESLint ist das Quality Gate für deine Codebase. Kombiniere es mit Prettier für das Formatting, vertiefe die Typisierung mit TypeScript und binde es in den Vite Build sowie deine CI-Pipeline ein. Aktiviere anschließend eine neue Regel und behebe jeden entsprechenden Fehler – es ist eine kleine Gewohnheit mit einer großen Wirkung.

Eine Regel deaktivieren

Ändere die Config oder füge ein gezieltes Disable mit einer Begründung hinzu. Pauschale Deaktivierungen auf Dateiebene verstecken echte Probleme.

Bevorzugt
// eslint-disable-next-line no-console
console.log("debugging payment flow");
Vermeiden
/* eslint-disable */
// the whole file is now
// unchecked, including
// real mistakes

Verwendung von Flat Config

Flat Config ist der aktuelle Standard — ein einfaches Array von Config-Objekten, das leichter zusammenzusetzen und zu debuggen ist.

Bevorzugt
export default [
  js.configs.recommended,
  {
    files: ["**/*.ts"],
    rules: { semi: "error" },
  },
];
Vermeiden
// legacy .eslintrc.json with
// extends, overrides and
// implicit plugin resolution

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, ESLint zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch ESLint — mit Quizzen und echtem Code, den Sie im Browser ausführen können.