Il sintomo
Su un progetto Symfony + React con vite-plugin-symfony, il dev server si avvia normalmente... all'apparenza:
$ vite dev
VITE v7.3.5 ready in 754 ms
➜ Local: http://localhost:5173/build/
➜ Vite ⚡️ Symfony: vite-plugin-symfony: v8.2.4, pentatrion/vite-bundle: v8.2.4
(!) Failed to run dependency scan. Skipping dependency pre-bundling.
La trappola di questo messaggio: non è un errore bloccante. Il server gira, le pagine si caricano. Ma tutto è degradato: primo caricamento interminabile (centinaia di richieste di rete invece di pochi bundle), e soprattutto alcune dipendenze CommonJS che esplodono a runtime con errori del tipo does not provide an export named 'default' — esattamente ciò che il pre-bundling dovrebbe correggere.
Capire cosa fa il dependency scan
All'avvio, Vite percorre gli entry point con esbuild per scoprire tutte le dipendenze importate, poi le pre-bundla in moduli ES ottimizzati in node_modules/.vite/. Se questo scan fallisce, Vite abbandona l'intera ottimizzazione invece di andare in crash — da qui il messaggio discreto tra parentesi.
Lo scan fallisce non appena esbuild non riesce a fare il parsing di un file raggiunto da un entry point. Le cause classiche:
- Del JSX in un file .js: esbuild fa il parsing del JSX solo nei .jsx/.tsx per impostazione predefinita.
- Un entry point dichiarato in vite.config.js che non esiste più (file spostato, rinominato).
- Un import verso un percorso rotto (alias @/ non risolto, differenza di maiuscole tra macOS e Linux).
- Una cache node_modules/.vite corrotta dopo un aggiornamento di versione.
La diagnosi
Primo riflesso: forzare lo scan in modalità verbosa per vedere il vero errore che ingoia:
rm -rf node_modules/.vite
vite dev --force --debug deps 2>&1 | head -50
ACon --debug deps, l'errore esbuild sottostante appare finalmente. Nel mio caso:
✘ [ERROR] The JSX syntax extension is not currently enabled
assets/components/PartenaireLogos.js:12:8:
12 │ return <div className="logos-grid">Un componente appena estratto in un file .js invece di .jsx. Il bundling della pagina funzionava (il plugin React di Vite è più tollerante in questa fase), ma il scanner, invece, usa esbuild in configurazione strict — e abbandonava tutto il pre-bundling a causa di questo singolo file.
La correzione
La correzione pulita: rispettare la convenzione sull'estensione.
git mv assets/components/PartenaireLogos.js assets/components/PartenaireLogos.jsx
# + corriger les imports qui pointaient vers .js
Si si ha una codebase esistente piena di JSX in .js e non si può rinominare tutto in una volta, si può forzare il loader dello scanner nel frattempo:
// vite.config.js — solution de transition, pas une cible
export default defineConfig({
optimizeDeps: {
esbuildOptions: {
loader: { '.js': 'jsx' },
},
},
});After correzione, riavvio con cache svuotata:
rm -rf node_modules/.vite && npm run dev
# le message a disparu, premier chargement instantané
Quello che mi porto a casa
- «Failed to run dependency scan» non è cosmetico: senza pre-bundling, il dev server è lento e le dipendenze CommonJS possono rompersi a runtime.
- vite --force --debug deps fa emergere il vero errore esbuild che il messaggio generico maschera.
- Il JSX vive in un file .jsx, punto — il plugin React tollera il .js, lo scanner esbuild no, ed è lo scanner che decide il pre-bundling.
- After ogni aggiornamento di versione di Vite, svuotare node_modules/.vite fa parte del riflesso di base.