Node.js, Package, dan Ekosistemnya · 7/7
Environment variable dan rahasia
Konfigurasi yang berbeda tiap mesin — dan aturan yang menjaga API key-mu tidak sampai ke browser.
Baca 22 menit
Setelah pelajaran ini kamu bisa
- Menjelaskan apa itu environment variable dan kenapa konfigurasi tinggal di sana
- Memakai file `.env`, dan tahu file env mana yang boleh di-commit
- Menjelaskan tepat variable mana yang sampai ke browser di Next.js
- Memvalidasi konfigurasi saat startup alih-alih crash belakangan
Environment variable adalah nilai yang diberikan sistem operasi ke programmu saat ia mulai. Inilah cara kode yang sama berperilaku berbeda di laptopmu dan di production tanpa satu baris pun berubah.
Aturan yang menentukan apa yang layak di sana: apa pun yang berbeda antar environment, dan apa pun yang rahasia. URL database itu berbeda. API key itu rahasia. Tarif pajak bukan keduanya — itu logika bisnis dan tempatnya di kode, di mana ia bisa direview dan diuji.
// Reading them. Always a string, or undefined.
const databaseUrl = process.env.DATABASE_URL;
const port = Number(process.env.PORT ?? 3000);
// This project's own example, from features/db/index.ts:
const path = process.env.DATABASE_PATH ?? join(process.cwd(), "data", "app.db");Jebakan falsy dan cara membaca yang benar. Setiap kesalahan ini pernah sampai ke production di suatu tempat.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
File .env
Mengatur variable manual setiap kali itu tidak praktis, jadi alat-alat membacanya dari file .env. Next.js melakukannya otomatis — tidak butuh library.
# .env.local - your machine, never committed
DATABASE_PATH=./data/dev.db
SESSION_SECRET=a-long-random-string-for-development
NEXT_PUBLIC_SITE_NAME=Fullstack Learning Path| File | Tujuan | Di-commit? |
|---|---|---|
.env.example | Template yang mendaftar nama yang dibutuhkan, tanpa nilai asli | Ya |
.env.local | Nilai asli di mesinmu, termasuk rahasia | Jangan pernah |
.env.development | Default non-rahasia bersama untuk dev | Biasanya ya |
.env.production | Default non-rahasia bersama untuk prod | Biasanya ya |
.env | Default untuk semua environment | Hanya kalau tidak ada rahasia di dalamnya |
Parser `.env`. Perhatikan kasus-kasus tepinya — komentar, tanda kutip, baris kosong, dan nilai yang mengandung tanda sama dengan.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Batas NEXT_PUBLIC_
Ini paragraf terpenting di pelajaran ini. Di Next.js, variable yang namanya diawali NEXT_PUBLIC_ akan disubstitusikan ke bundle browser saat build. Sisanya tetap di server.
// Server-only. Available in Server Components, Server Actions, Route Handlers.
process.env.SESSION_SECRET // never sent to the browser
process.env.DATABASE_URL
// Public by design. Embedded into the JavaScript every visitor downloads.
process.env.NEXT_PUBLIC_SITE_NAME
process.env.NEXT_PUBLIC_ANALYTICS_ID
// The mistake:
"use client";
const secret = process.env.SESSION_SECRET; // undefined - and that is the
// framework protecting youundefined di client component itu fitur. Bug-nya adalah saat ada yang "memperbaikinya" dengan mengganti nama variable-nya jadi NEXT_PUBLIC_SESSION_SECRET.// features/config/env.ts - imported early, so it runs at startup.
import "server-only";
function required(name: string): string {
const value = process.env[name];
if (!value) throw new Error("Missing required env var: " + name);
return value;
}
export const config = {
sessionSecret: required("SESSION_SECRET"),
databasePath: process.env.DATABASE_PATH ?? "./data/app.db",
isProduction: process.env.NODE_ENV === "production",
} as const;config dan mendapat nilai bertype alih-alih string | undefined.Tugas praktik
Di proyek ini, buat .env.local berisi DATABASE_PATH=./data/experiment.db, lalu jalankan bun run dev, daftarkan sebuah akun, dan pastikan ada file baru muncul di data/experiment.db. Lalu cek .gitignore dan pastikan .env.local dan /data/ sudah diabaikan — lalu jelaskan dalam satu kalimat kenapa masing-masingnya begitu.
Hasil yang diharapkan
File database baru di path yang kamu pilih, dan kedua entri sudah ada di .gitignore.
Cek pemahaman
Pilih jawaban dulu