Formatting & Linting
Bij het ontwikkelen van front-end code is het belangrijk om consistente code-stijl en kwaliteit te waarborgen. Het feit dat front-end code nagenoeg altijd in JavaScript is geschreven geeft hier nog meer reden toe. JavaScript geeft je namelijk heel veel vrijheid om problemen op verschillende manieren op te lossen. Linting geeft je juist een mogelijkheid om hierin wat striktere afspraken te maken.
Om te voorkomen dat er discussie binnen je team ontstaat over bepaalde stijlkeuzes is het slim om je code te linten en te formatten. Dit voorkomt inconsistenties en bugs in de codebase en maakt hem beter leesbaar. Een snelle en moderne tool die dit voor je doet is Biome.
Voordelen van formatting en linting zijn:
-
✔️ Consistentie in de codebase: je code ziet er overal hetzelfde uit, ongeacht wie het geschreven heeft.
-
✔️ Fouten vroegtijdig opsporen: linters vangen veelgemaakte fouten op. Denk aan: ongebruikte variabelen, ontbrekende return statements, verkeerde vergelijkingen (
==versus===). -
✔️ Betere code kwaliteit: linters dwingen je om best practices te volgen. Ze waarschuwen voor potentieel problematische patronen.
-
✔️ Makkelijkere onboarding nieuwe teamleden: nieuwe developers leren meteen de juiste patronen en stijl.
Wat is formatting?
Formatting verwijst naar de stijl van je code: hoe deze eruitziet qua inspringing, spaties, regels en leestekens. Een formatter zorgt ervoor dat alle code in een project er uniform uitziet, ongeacht wie de code heeft geschreven.
Typische formatting-regels
- Gebruik van spaties of tabs voor inspringing en hoeveel (2, 4, etc.)
- Maximale regellengte (hoeveel karakters)
- Gebruik van enkele of dubbele aanhalingstekens ('' vs "")
- Komma's aan het einde van objecten of arrays (trailing commas)
Wat is linting?
Linting controleert de logica en kwaliteit van je code. Een linter analyseert je code op fouten, onlogische patronen, onveilige constructies en slechte praktijken. Waar formatting zich richt op stijl, richt linting zich op correctheid en consistentie.
Typische linting-controles
- Ongebruikte variabelen of imports
- Vergelijkingen met
==in plaats van=== - Niet-gedefinieerde variabelen
- Console-statements in productiecode
Populaire Tools
Prettier
Prettier is een "opinionated formatter" - het legt één vaste stijl op, zodat je geen eindeloze discussies voert over spaties en puntkomma’s. Het ondersteunt veel programmeertalen en kan worden geïntegreerd in verschillende editors en build-tools.
ESLint
ESLint is een veelgebruikte linter voor JavaScript en TypeScript. Het biedt uitgebreide mogelijkheden om je code te analyseren en te controleren op fouten en inconsistenties. Je kunt ESLint uitbreiden met plug-ins voor frameworks zoals React, Vue of Next.js.
Stylelint
Stylelint is een linter voor CSS en aanverwante talen zoals SCSS en Less.
Het helpt bij het handhaven van consistente stijlen en het voorkomen van fouten
in je stylesheets. Voorbeelden van regels die Stylelint kan afdwingen zijn het
gebruik van onnodige units, zoals 0px, de volgorde van properties en het
vermijden van dubbele definities.
Biome
Biome is de moderne opvolger van de traditionele ESLint + Prettier combinatie. Het is geschreven in Rust, waardoor het razendsnel is, en het combineert formatting, linting en code-analyse in één tool. Biome ondersteunt JavaScript, TypeScript, JSON, CSS, HTML, Markdown en meer. Biome is zeer configureerbaar, je kan kiezen voor de gekozen default instellingen of deze aanpassen naar je eigen regels. Configuratiebestanden kunnen per map worden overgeschreven en overerven.
Integratie in je workflow
Deze tools kunnen worden geïntegreerd in je ontwikkelworkflow op verschillende manieren:
- Editor-integratie: De meeste moderne code-editors zoals VSCode en Webstorm ondersteunen plugins voor Prettier, ESLint, Stylelint en andere tools. Hierdoor worden fouten en formatteerproblemen direct tijdens het typen gemarkeerd.
- Pre-commit hooks: Tools zoals Husky kunnen worden gebruikt om linting en formatting uit te voeren voordat code wordt gecommit naar een versiebeheersysteem zoals Git. Dit zorgt ervoor dat alleen goedgekeurde code wordt toegevoegd aan de codebase.
- Continuous Integration (CI): Linting en formatting kunnen worden opgenomen in je CI/CD-pijplijn om ervoor te zorgen dat alle code die wordt samengevoegd aan de kwaliteitsnormen voldoet.
Voorbeelden
Prettier
Installatie (met npm):
npm install --save-dev --save-exact prettier
Voorbeeld configuratiebestand (.prettierrc.json)
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5"
}
Voeg ook een .prettierignore toe om
bestanden of mappen uit te sluiten van formatting.
Commando: (Let op: dit commando kan alle bestanden wijzigen)
npx prettier . --write
Meer documentatie: Prettier Docs
ESLint
Installatie en configuratie (met npm):
npm init @eslint/config@latest
Voorbeeld configuratiebestand (eslint.config.js)
import { defineConfig } from "eslint/config";
import js from "@eslint/js";
export default defineConfig([
{ files: ["**/*.js"], plugins: { js }, extends: ["js/recommended"] },
{
rules: {
"no-unused-vars": "warn",
"no-undef": "warn",
},
},
]);
Commando: (Let op: --fix verbetert bestanden waar mogelijk)
npx eslint . --fix
Meer documentatie: ESLint Docs
Biome
Installatie (met npm):
npm i -D -E @biomejs/biome
Voorbeeld configuratiebestand (biome.json), makkelijk te genereren met:
npx @biomejs/biome init
{
"$schema": "https://biomejs.dev/schemas/2.0.5/schema.json",
"formatter": {
"enabled": false
},
"linter": {
"enabled": false
},
"assist": {
"enabled": false
},
"overrides": [
{
"includes": ["**/*.astro"],
"linter": {
"rules": {
"style": {
"useConst": "off",
"useImportType": "off"
},
"correctness": {
"noUnusedVariables": "off",
"noUnusedImports": "off"
}
}
}
}
]
}
Commando:
npx biome check --write
Linting en formatting kunnen ook apart worden uitgevoerd met biome lint en
biome format.
Meer documentatie: Biome Docs.
Integratie in de workflow
Automatisch bij opslaan
De meeste IDE’s, zoals VS Code, kunnen automatisch Prettier en ESLint of Biome draaien bij het opslaan van bestanden.
- Prettier: VSCode Extension, WebStorm Integration, Sublime Text Integration
- ESLint: ESLint VSCode Extension, WebStorm Integration, Sublime Text Integration
- Biome: Biome VSCode Extension, WebStorm Integration, Sublime Text Integration
Pre-commit hooks
Met Husky en lint-staged of Lefthook kun je pre-commit hooks instellen om formatting en linting uit te voeren voordat code wordt gecommit.
Voorbeeld met Biome in een Shell script
#!/bin/sh
set -eu
npx @biomejs/biome check --staged --files-ignore-unknown=true --no-errors-on-unmatched
Continuous Integration (CI)
Je kunt linting en formatting opnemen in je CI/CD-pijplijn met tools zoals GitHub Actions, GitLab CI of Jenkins om ervoor te zorgen dat alle code die wordt samengevoegd aan de kwaliteitsnormen voldoet.
De Prettier GitHub Action werkt met de
autofix.ci-app. Zie de
Prettier CI-documentatie. Voor Biome is een
first party GitHub Action
beschikbaar, zie de
Biome CI-documentatie.
Conclusie
Wanneer elke ontwikkelaar werkt volgens dezelfde richtlijnen, verdwijnt veel van de frictie die normaal gesproken tijdens samenwerking of code reviews ontstaat. Teams hoeven minder tijd te besteden aan het bespreken van stijlverschillen en kunnen zich richten op inhoudelijke verbeteringen en architecturale beslissingen. Het resultaat is een stabielere codebase en een meer voorspelbare ontwikkelervaring. Door deze tools te integreren in je workflow, kun je de kwaliteit en consistentie van je code aanzienlijk verbeteren.
Biome: een eenvoudige setup en een tool met snelle performance
Een tool zoals Biome die zowel formatting als linting combineert, kan de setup en het onderhoud van deze tools vereenvoudigen, waardoor teams sneller aan de slag kunnen met het handhaven van codekwaliteit.
Ga je linting en formatting tools gebruiken in een bestaand project? Waarschijnlijk zullen veel bestanden aangepast worden door de tools. Het is aan te raden om deze wijzigingen in een aparte commit te plaatsen, en deze te mergen op een moment dat er weinig actieve ontwikkeling plaatsvindt. Zo voorkom je dat er veel merge-conflicten ontstaan met andere lopende werkzaamheden.