Le symptôme
Sur un projet Symfony + React avec vite-plugin-symfony, le dev server démarre normalement... en apparence :
$ 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.
Le piège de ce message : ce n'est pas une erreur bloquante. Le serveur tourne, les pages se chargent. Mais tout est dégradé : premier chargement interminable (des centaines de requêtes réseau au lieu de quelques bundles), et surtout certaines dépendances CommonJS qui explosent au runtime avec des erreurs du type does not provide an export named 'default' — précisément ce que le pre-bundling est censé corriger.
Comprendre ce que fait le dependency scan
Au démarrage, Vite parcourt les entry points avec esbuild pour découvrir toutes les dépendances importées, puis les pré-bundle en modules ES optimisés dans node_modules/.vite/. Si ce scan échoue, Vite abandonne l'optimisation entière au lieu de planter — d'où le message discret entre parenthèses.
Le scan échoue dès qu'esbuild n'arrive pas à parser un fichier atteint depuis un entry point. Les causes classiques :
  • Du JSX dans un fichier .js : esbuild ne parse le JSX que dans les .jsx/.tsx par défaut.
  • Un entry point déclaré dans vite.config.js qui n'existe plus (fichier déplacé, renommé).
  • Un import vers un chemin cassé (alias @/ non résolu, casse différente entre macOS et Linux).
  • Un cache node_modules/.vite corrompu après une montée de version.
Le diagnostic
Premier réflexe : forcer le scan en mode verbeux pour voir la vraie erreur qu'il avale :
rm -rf node_modules/.vite
vite dev --force --debug deps 2>&1 | head -50
Avec --debug deps, l'erreur esbuild sous-jacente apparaît enfin. Dans mon cas :
✘ [ERROR] The JSX syntax extension is not currently enabled
    assets/components/PartenaireLogos.js:12:8:
      12 │   return <div className="logos-grid">
Un composant fraîchement extrait dans un fichier .js au lieu de .jsx. Le bundling de la page fonctionnait (le plugin React de Vite est plus tolérant à ce stade), mais le scanner, lui, utilise esbuild en configuration stricte — et abandonnait tout le pre-bundling à cause de ce seul fichier.
Le correctif
La correction propre : respecter la convention d'extension.
git mv assets/components/PartenaireLogos.js assets/components/PartenaireLogos.jsx
# + corriger les imports qui pointaient vers .js
Si on a une base de code existante pleine de JSX en .js et qu'on ne peut pas tout renommer d'un coup, on peut forcer le loader du scanner en attendant :
// vite.config.js — solution de transition, pas une cible
export default defineConfig({
    optimizeDeps: {
        esbuildOptions: {
            loader: { '.js': 'jsx' },
        },
    },
});
Après correction, redémarrage avec cache purgé :
rm -rf node_modules/.vite && npm run dev
# le message a disparu, premier chargement instantané
Ce que je retiens
  • « Failed to run dependency scan » n'est pas cosmétique : sans pre-bundling, le dev server est lent et les dépendances CommonJS peuvent casser au runtime.
  • vite --force --debug deps fait remonter la vraie erreur esbuild que le message générique masque.
  • Du JSX vit dans un fichier .jsx, point — le plugin React tolère le .js, le scanner esbuild non, et c'est le scanner qui décide du pre-bundling.
  • Après toute montée de version Vite, purger node_modules/.vite fait partie du réflexe de base.