monorepo·vite·nextjs·2 min de leitura
Compartilhando variáveis de ambiente em um monorepo com Vite e Next.js
Como manter um único arquivo .env.shared no monorepo e gerar arquivos específicos com os prefixos do Vite e do Next.js.

Em um monorepo com apps em Vite e Next.js rola um detalhe chato: cada framework exige um prefixo diferente para expor variáveis ao cliente. Vite usa VITE_PUBLIC_, Next.js usa NEXT_PUBLIC_. Como manter um único lugar para variáveis comuns?
Uma solução simples: um arquivo .env.shared na raiz, e um script que gera os .env específicos com os prefixos corretos para cada app.
Passo 1: criar .env.shared
Na raiz do monorepo:
SECRET_KEY=your_secret_key
API_URL=your_api_url
Passo 2: script de geração
Crie um generate-env.js na raiz:
const fs = require('fs');
const path = require('path');
const envShared = path.join(__dirname, '.env.shared');
const envVite = path.join(__dirname, 'vite-project', '.env');
const envNext = path.join(__dirname, 'next-project', '.env');
const sharedVars = fs.readFileSync(envShared, 'utf-8').split('\n');
const viteVars = sharedVars.map((line) => {
if (line.startsWith('SECRET_KEY') || line.startsWith('API_URL')) {
return `VITE_PUBLIC_${line}`;
}
return line;
});
const nextVars = sharedVars.map((line) => {
if (line.startsWith('SECRET_KEY') || line.startsWith('API_URL')) {
return `NEXT_PUBLIC_${line}`;
}
return line;
});
fs.writeFileSync(envVite, viteVars.join('\n'), 'utf-8');
fs.writeFileSync(envNext, nextVars.join('\n'), 'utf-8');
Passo 3: rodar o script
node generate-env.js
Isso cria um .env em vite-project/ com prefixo VITE_PUBLIC_ e um .env em next-project/ com prefixo NEXT_PUBLIC_.
Boas práticas
- Adicione os
.envgerados ao.gitignorepara não vazar segredos. - Rode o script sempre que mudar o
.env.shared. - Adicione o script como passo do build ou do deploy.
- Para algo mais robusto, considere ferramentas como dotenv-vault ou um pacote interno no monorepo que exporte uma configuração tipada.
4 de maio de 2023 · Brazil