vite-env-only refuse node:fs avec Intlayer
Si vous avez utilisé le plugin vite-env-only (comme mentionné dans d'anciennes suggestions pour React-Router v7) et que vous voyez :
Error: [vite-env-only] Import denied* Denied by specifier pattern: /^node:/* Importer: index.html* Import: "node:fs"…même s'il n'y a aucun node:fs dans votre bundle client, il s'agit d'un faux positif.
Quelle en est la cause
vite-env-only effectue une vérification basée sur Babel tôt dans la résolution du graphe Vite, avant :
- les alias (y compris les mappages browser vs node d'Intlayer),
- l'élimination du code mort,
- la résolution SSR vs client,
- les modules virtuels comme ceux de React-Router.
Les packages Intlayer contiennent du code pouvant s'exécuter à la fois sur Node et dans le navigateur. À un stade intermédiaire, un module natif Node comme node:fs peut apparaître dans le graphe avant que Vite ne l'élimine du build client. vite-env-only le détecte et génère immédiatement une erreur, même si le bundle final ne le contient pas.
React-Router et les modules serveur
Dans la documentation de React-Router au sujet des conventions des modules serveur (https://reactrouter.com/api/framework-conventions/server-modules), l'équipe suggère explicitement d'utiliser vite-env-only pour empêcher que des imports réservés au serveur ne fuient dans le bundle client.
Cependant, ces conventions s'appuient sur l'aliasing de Vite, les exports conditionnels et le tree-shaking pour éliminer le code réservé au serveur. Alors que l'aliasing et les exports conditionnels sont déjà appliqués, certains utilitaires basés sur Node sont encore présents dans des packages comme @intlayer/core à ce stade (même s'ils ne sont jamais importés côté client). Comme le tree-shaking n'a pas encore été exécuté, ces fonctions sont toujours analysées par Babel, et vite-env-only détecte leurs imports node: et génère un faux positif — alors qu'ils sont correctement purgés du bundle client final.
Comment corriger / contourner
Recommandation : Supprimer vite-env-only
Supprimez simplement le plugin. Dans de nombreux cas, vous n'en avez pas besoin — Vite gère déjà les imports client vs serveur via sa propre résolution.
Cela corrige la fausse erreur sur node:fs sans modification d'Intlayer.
Valider la build finale à la place
Si vous souhaitez toujours vous assurer qu'aucune API Node intégrée ne se retrouve dans le client, faites-le après la compilation, par ex. :
pnpm buildgrep -R "node:" dist/S'il n'y a aucun résultat, vos bundles client sont propres.
Résumé
- vite-env-only peut générer une erreur sur node:fs car il vérifie trop tôt.
- Vite + Intlayer + les conventions des server modules de React-Router suppriment normalement correctement les références réservées au serveur.
- Supprimer le plugin ou vérifier la sortie finale est généralement la meilleure solution.