Run your app with different environments: Development, UAT, and Production.
📁 Files Structure
project/
├── frontend/
│ ├── .env # Production
│ ├── .env.development # Development
│ ├── .env.uat # UAT
│ └── vite.config.ts
├── backend/
│ ├── .env # Production
│ ├── .env.development # Development
│ ├── .env.uat # UAT
│ └── src/config/configuration.ts
🎯 Frontend Setup
1. Environment Files
# .env
VITE_API_URL=https://api.yourapp.com
# .env.development
VITE_API_URL=http://localhost:3000
# .env.uat
VITE_API_URL=https://api-uat.yourapp.com
2. vite.config.ts
import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react-swc';
export default defineConfig(({ mode }) => {
loadEnv(mode, process.cwd(), '');
return {
plugins: [react()],
resolve: {
alias: { '@': '/src' }
}
};
});
3. package.json
{
"scripts": {
"dev": "vite",
"dev:uat": "vite --mode uat",
"build": "vite build",
"build:uat": "vite build --mode uat"
}
}
4. Usage
// In any component
const apiUrl = import.meta.env.VITE_API_URL;
// Check environment
console.log('Environment:', import.meta.env.MODE);
🚀 Backend Setup
1. Environment Files
# .env
NODE_ENV=production
DATABASE_URL=postgresql://user:pass@prod-db:5432/myapp
# .env.development
NODE_ENV=development
DATABASE_URL=postgresql://user:pass@localhost:5432/myapp_dev
# .env.uat
NODE_ENV=uat
DATABASE_URL=postgresql://user:pass@uat-db:5432/myapp_uat
2. Configuration
// src/config/configuration.ts
export default () => {
const env = process.env.NODE_ENV || 'production';
require('dotenv').config({
path: env === 'production' ? '.env' : `.env.${env}`
});
return {
environment: env,
port: parseInt(process.env.PORT, 10) || 3000,
database: process.env.DATABASE_URL
};
};
3. App Module
// src/app.module.ts
import { ConfigModule } from '@nestjs/config';
import configuration from './config/configuration';
@Module({
imports: [
ConfigModule.forRoot({
load: [configuration],
isGlobal: true,
}),
],
})
export class AppModule {}
4. package.json
{
"scripts": {
"start:dev": "NODE_ENV=development nest start --watch",
"start:uat": "NODE_ENV=uat nest start",
"start:prod": "NODE_ENV=production node dist/main"
}
}
5. Usage
// In controllers
import { ConfigService } from '@nestjs/config';
@Controller()
export class AppController {
constructor(private config: ConfigService) {}
@Get('health')
getHealth() {
return {
environment: this.config.get('environment'),
status: 'ok'
};
}
}
🎮 Commands
Frontend
npm run dev # Development environment
npm run dev:uat # UAT environment
npm run build # Production build
Backend
npm run start:dev # Development environment
npm run start:uat # UAT environment
npm run start:prod # Production environment
🔍 Check Environment
Frontend
console.log('Environment:', import.meta.env.MODE);
// Output: development, uat, or production
Backend
console.log('Environment:', process.env.NODE_ENV);
// Output: development, uat, or production
🐳 Docker
# Frontend Dockerfile
FROM node:18-alpine as builder
ARG BUILD_MODE=production
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build -- --mode ${BUILD_MODE}
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# Build commands
docker build -t myapp:dev --build-arg BUILD_MODE=development .
docker build -t myapp:uat --build-arg BUILD_MODE=uat .
docker build -t myapp:prod .
✅ Best Practices
- Use VITE_ prefix for frontend environment variables
- Keep .env for production as default
- Never commit secrets - use .env.local for sensitive data
- Check console logs to verify which environment is running
- Use TypeScript for better development experience
🚨 Common Issues
- Missing variables: Check file names (.env.development, not .env.dev)
- Wrong environment: Check console output for confirmation
- Docker not working: Make sure to pass BUILD_MODE argument
That's it! Simple environment configuration without complex setup.
Top comments (0)