- Pubblicato il
Cos’è un linter? Capire ESLint e la sua importanza per il codice pulito
- Autori
Cos’è un linter? Capire ESLint e la sua importanza per il codice pulito
Quando più sviluppatori lavorano sulla stessa base di codice, le incoerenze di stile e gli errori nascosti possono accumularsi rapidamente.
È qui che entrano in gioco i linter, che controllano automaticamente il codice per individuare potenziali problemi e impongono uno stile coerente in tutto il progetto.
In questo articolo esploreremo cos’è un linter, perché dovresti usarne uno e perché ESLint è diventato lo strumento di riferimento nell’ecosistema JavaScript e TypeScript.
Cosa rilevano i linter
Un linter analizza il codice e rileva diverse categorie di problemi prima che causino bug o incoerenze.
Errori di sintassi → Problemi che rendono il codice non valido o non eseguibile. Esempi:
- Parentesi tonde o graffe mancanti →
if (user.isLoggedIn { - Stringhe non chiuse →
console.log("Hello) - Istruzioni
returnfuori posto o mancanti.
- Parentesi tonde o graffe mancanti →
Problemi di qualità del codice → Pattern che non violano la sintassi ma possono provocare errori durante l’esecuzione o confusione. Esempi:
- Variabili inutilizzate → Dichiarare
const result = computeValue();senza mai usareresult. - Codice irraggiungibile → Avere istruzioni dopo un
return. - Variabili che ne nascondono altre → Riutilizzare il nome di una variabile di un ambito esterno.
- Variabili inutilizzate → Dichiarare
Incoerenze di stile → Differenze di formattazione e di stile che rendono il codice più difficile da leggere. Esempi:
- Punti e virgola mancanti o rientri incoerenti.
- Usare
"double quotes"in un file e'single quotes'in un altro. - Mescolare tabulazioni e spazi per i rientri.
Violazioni delle buone pratiche → Codice che tecnicamente funziona ma contrasta con i pattern consigliati. Esempi:
- Usare API deprecate (ad esempio,
ReactDOM.render()in React 18). - Usare
varinvece diletoconst. - Chiamare funzioni asincrone senza
await. - Usare
==invece di===, il che può causare bug sottili di conversione implicita dei tipi.
- Usare API deprecate (ad esempio,
I linter come ESLint non si limitano a individuare errori, impongono convenzioni e impediscono che cattive abitudini entrino nel repository.
Perché usare un linter?
1. Individuare gli errori in anticipo
I linter rilevano problemi prima ancora che l’app venga eseguita.
Per esempio, ESLint può avvisarti di una variabile non definita o di un await mancante in una funzione asincrona, risparmiandoti tempo di debug in seguito.
2. Garantire coerenza
Un linter impone uno stile di programmazione uniforme a tutto il team, evitando discussioni inutili su tabulazioni o spazi oppure su dove mettere le virgole.
3. Migliorare la qualità del codice
I linter incoraggiano un codice più pulito e manutenibile segnalando pattern complessi o rischiosi (come callback profondamente annidate o importazioni inutilizzate).
4. Integrarsi nel flusso di lavoro
Vengono eseguiti automaticamente nell’IDE, durante i commit (tramite hook pre-commit come Husky) o nelle pipeline CI/CD, mantenendo pulita la base di codice a ogni passaggio.
Approfondimento su ESLint: lo standard per JavaScript e TypeScript
ESLint è il linter più popolare nell’ecosistema JavaScript ed è ampiamente usato nei progetti React, Node.js e TypeScript.
🔧 Funzionalità principali
- Altamente configurabile → Personalizza ogni regola in base al tuo stile.
- Ecosistema di plugin → Estendilo con plugin della community (ad esempio, React, Jest, sicurezza, accessibilità).
- Supporto TypeScript → Integrazione completa tramite
@typescript-eslint. - Regole con correzione automatica → Molti problemi possono essere corretti automaticamente con:
npx eslint . --fix - Integrazioni → Funziona con VS Code, WebStorm, GitHub Actions e quasi tutti i sistemi CI.
Configurare ESLint
Puoi configurare ESLint nel tuo progetto con:
npx eslint --init
Se usi ESLint v8.23 o successivo, questo comando creerà un file Flat Config chiamato eslint.config.mjs (invece del vecchio formato .eslintrc.json). Questo formato moderno usa moduli JavaScript e offre prestazioni e chiarezza migliori.
Ecco un semplice esempio di configurazione che potresti usare in un progetto Next.js + TypeScript:
// eslint.config.mjs
import js from '@eslint/js'
import tseslint from 'typescript-eslint'
import prettier from 'eslint-config-prettier'
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({ baseDirectory: import.meta.dirname })
export default [
js.configs.recommended, // Core JavaScript best practices
...tseslint.configs.recommended, // TypeScript-specific linting
...compat.extends('next/core-web-vitals'), // Next.js and React recommendations
prettier, // Avoid rule conflicts with Prettier
{
files: ['**/*.{js,jsx,ts,tsx}'],
rules: {
'no-console': ['warn', { allow: ['warn', 'error'] }],
'@typescript-eslint/no-unused-vars': [
'warn',
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
],
semi: ['error', 'always'],
},
},
]
Spiegazione
Analizziamo cosa succede:
js.configs.recommended
Carica le regole di base consigliate di ESLint, che coprono problemi fondamentali di JavaScript come:
- Variabili inutilizzate
- Codice irraggiungibile
- Istruzioni return mancanti
- Errori di sintassi
tseslint.configs.recommended
Aggiunge regole specifiche per TypeScript, rilevando per esempio:
- Importazioni inutilizzate
- Uso scorretto dei tipi
- Variabili dichiarate ma mai usate nei file
.ts/.tsx
compat.extends('next/core-web-vitals')
Applica le regole di Next.js e React, tra cui:
- Buone pratiche di accessibilità (a11y)
- Controlli sull’uso dei React Hooks
- Avvisi sui problemi di prestazioni (come usare
<img>invece di<Image>)
prettier
Disattiva le regole di linting relative alla formattazione che altrimenti entrerebbero in conflitto con Prettier.
rules
Adattamenti personalizzati specifici del progetto:
'no-console': ['warn']→ consenteconsole.warneconsole.error, ma segnala le altre chiamate alla console.'@typescript-eslint/no-unused-vars'→ segnala variabili o parametri dichiarati ma non usati (ignora quelli che iniziano con_).'semi': ['error', 'always']→ impone l’uso dei punti e virgola.
Questa configurazione offre:
- Linting JavaScript + TypeScript affidabile
- Buone pratiche Next.js integrate
- Compatibilità automatica con Prettier
- Regole semplici e chiare che rendono la base di codice coerente, leggibile e priva di bug
Una volta creato questo file, puoi eseguire il linting del progetto con:
npm run lint
oppure correggere automaticamente i problemi risolvibili:
npm run lint -- --fix
ESLint e altri linter a confronto
| Funzionalità | ESLint | TSlint (deprecato) | JSHint | StandardJS |
|---|---|---|---|---|
| Linguaggi supportati | JavaScript, TypeScript | TypeScript | JavaScript | JavaScript |
| Configurabile | ✅ Sì | ⚠️ Limitato | ⚠️ Limitato | ❌ No (stile fisso) |
| Ecosistema di plugin | 🟢 Ampio | 🔴 Piccolo | 🔴 Piccolo | 🔴 Minimo |
| Correzione automatica | ✅ Sì | ⚠️ Parziale | ⚠️ Parziale | ✅ Sì |
| Manutenzione attiva | 🟢 Sì | 🔴 No | 🟡 Raramente | 🟢 Sì |
Da quando TSlint è stato ufficialmente deprecato a favore di ESLint, quasi tutti i progetti JavaScript e TypeScript moderni usano oggi ESLint.
Buone pratiche per usare ESLint
- Combina ESLint con Prettier per la formattazione automatica del codice.
- Aggiungi controlli ESLint agli hook pre-commit di Git con Husky o lint-staged.
- Eseguilo nella pipeline CI per imporre la qualità del codice nelle pull request.
- Potresti usare pacchetti consigliati come eslint-config-airbnb o eslint-plugin-react
Conclusione
I linter sono essenziali per mantenere basi di codice pulite, coerenti e prive di errori, soprattutto nei progetti collaborativi. Tra questi, ESLint si distingue come lo strumento più flessibile e potente per gli sviluppatori JavaScript e TypeScript.
Che tu lavori da solo o in un grande team, aggiungere ESLint al tuo flusso di lavoro garantisce che il codice rimanga professionale, leggibile e manutenibile nel lungo periodo.
Vuoi vedere ESLint in azione? Consulta la sua documentazione ufficiale oppure prova ad aggiungerlo al tuo progetto con npx eslint --init.