Quand un projet vit sur un disque Windows monté dans WSL (/mnt/c/...), le hot reload de Vite ne se déclenche pas : on modifie un fichier, rien ne bouge dans le navigateur.
Cause
WSL2 utilise le protocole 9P pour accéder aux fichiers Windows via /mnt/c. Les événements inotify ne remontent pas à travers cette couche.
Le watcher de Vite (chokidar) s’appuie dessus et ne voit jamais les modifications.
Correctif
Activer le polling dans la config Vite. Avec Astro, ça se passe dans astro.config.mjs :
export default defineConfig({
vite: {
server: {
watch: {
usePolling: true,
},
},
},
});
Le hot reload fonctionne à nouveau, au prix d’un peu plus de CPU : le watcher scanne les fichiers à intervalle régulier au lieu d’écouter des événements du noyau.
Alternative
Déplacer le projet dans le système de fichiers natif de WSL (~/projets/... plutôt que /mnt/c/...). Les événements inotify fonctionnent alors normalement, sans polling. Mais si l’éditeur tourne côté Windows, l’accès aux fichiers passe par \\wsl$, ce qui a ses propres limites.
Références
- Issue WSL #4739 : les modifications de fichiers Windows ne déclenchent pas de notifications côté Linux. L’équipe WSL y confirme que le serveur Plan 9 ne supporte pas le file watching.
- Issue WSL #6255 : hot reload React cassé. Même confirmation de Craig Loewen (Microsoft) : pas de file watching sur les fichiers Windows via
/mnt/c. - Stack Overflow : comment activer inotify dans WSL2. Détaille pourquoi inotify fonctionne sur ext4 mais pas sur les montages 9P.
- DEV : HMR not working in Vite on WSL2. Le même correctif
usePolling: trueappliqué à un projet Vite classique. - Microsoft Learn : WSL interop. Recommandation officielle de garder les projets Linux hors de
/mnt/cà cause du protocole 9P.