vite-env-only nega node:fs com Intlayer
Se você usou o plugin vite-env-only (conforme mencionado em sugestões antigas do React-Router v7) e vir:
Error: [vite-env-only] Import denied* Denied by specifier pattern: /^node:/* Importer: index.html* Import: "node:fs"…mesmo que não haja node:fs no bundle do cliente, isto é um falso positivo.
O que causa
vite-env-only executa uma verificação baseada em Babel cedo na resolução do grafo do Vite, antes de:
- aliasing (incluindo os mapeamentos browser vs node do Intlayer),
- eliminação de código morto,
- resolução SSR vs client,
- módulos virtuais como os do React-Router.
Os pacotes do Intlayer contêm código que pode funcionar tanto no Node como no browser. Numa fase intermédia, um builtin do Node como node:fs pode aparecer no grafo antes do Vite o remover do build do cliente. O vite-env-only vê isso e gera um erro imediatamente, mesmo que o bundle final não o contenha.
React-Router e Módulos de Servidor
Na documentação do React-Router sobre as convenções de módulos de servidor (https://reactrouter.com/api/framework-conventions/server-modules), a equipe sugere explicitamente usar vite-env-only para evitar que importações exclusivas do servidor vazem para o bundle do cliente.
Porém, essas convenções dependem do aliasing do Vite, das conditional exports e do tree-shaking para remover o código exclusivo do servidor. Embora o aliasing e as conditional exports já estejam aplicados, alguns utilitários baseados em Node ainda estão presentes em pacotes como @intlayer/core nessa fase (mesmo que nunca sejam importados pelo cliente). Como o tree-shaking ainda não foi executado, essas funções ainda são analisadas pelo Babel, e o vite-env-only detecta suas importações node: e gera um falso positivo — mesmo que elas sejam corretamente purgadas do bundle final do cliente.
Como corrigir / contornar
Recomendado: Remover vite-env-only
Simplesmente remova o plugin. Em muitos casos você não precisa dele — o Vite já lida com importações cliente vs servidor através da sua própria resolução.
Isto corrige o erro falso de node:fs sem alterações no Intlayer.
Validar o build final em vez disso
Se ainda quiser garantir que não há built-ins do Node no cliente, faça isso após o build, por exemplo:
pnpm buildgrep -R "node:" dist/Se não houver resultados, os bundles do cliente estão limpos.
Resumo
- vite-env-only pode gerar erro sobre node:fs porque verifica cedo demais.
- O Vite + Intlayer + as convenções de server modules do React-Router normalmente removem corretamente as referências server-only.
- Remover o plugin ou verificar o final output normalmente é a melhor solução.