การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า
ตรวจสอบและกำหนดชนิดข้อมูลให้ตัวแปรสภาพแวดล้อม เปิดเผยตัวแปรฝั่งไคลเอ็นต์ที่ปลอดภัยด้วย NEXT_PUBLIC และรวมการตั้งค่าสำหรับเซิร์ฟเวอร์กับไคลเอ็นต์ไว้ที่ศูนย์กลาง
การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
บทนำ
เป้าหมาย: รวมศูนย์ตัวแปรสภาพแวดล้อมที่ผ่านการตรวจสอบและทำให้ชนิดสอดคล้องกัน คุณจะแยกวิเคราะห์ process.env ด้วย zod ส่งออกออบเจ็กต์ env ที่มีชนิด และเปิดเผยเฉพาะ NEXT_PUBLIC_* ให้ไคลเอ็นต์
- การตรวจสอบขณะทำงาน
- การเปิดเผยระหว่างฝั่งเซิร์ฟเวอร์กับฝั่งไคลเอ็นต์
- แหล่งข้อมูลจริงเพียงหนึ่งเดียว
สคีมาและตัวแยกวิเคราะห์
สร้างสคีมาแยกกันสำหรับเซิร์ฟเวอร์และไคลเอ็นต์ ให้การเริ่มระบบล้มเหลวทันทีเมื่อการกำหนดค่าไม่ถูกต้อง
// app/lib/env.ts
import { z } from "zod"
const serverSchema = z.object({
NODE_ENV: z.enum(["development", "test", "production"]),
DATABASE_URL: z.string().url(),
API_SECRET: z.string().min(1)
})
const clientSchema = z.object({
NEXT_PUBLIC_API_BASE: z.string().url()
})
function parseEnv<T extends z.ZodTypeAny>(schema: T, source: Record<string, unknown>) {
const r = schema.safeParse(source)
if (!r.success) {
console.error(r.error.format())
throw new Error("Invalid environment variables")
}
return r.data as z.infer<T>
}
export const serverEnv = parseEnv(serverSchema, process.env)
export const clientEnv = parseEnv(clientSchema, process.env)การใช้งานฝั่งเซิร์ฟเวอร์
ไฟล์ฝั่งเซิร์ฟเวอร์ (ตัวจัดการเส้นทางและคอมโพเนนต์ฝั่งเซิร์ฟเวอร์) สามารถเข้าถึงข้อมูลลับจาก serverEnv ได้ อย่าเปิดเผยข้อมูลเหล่านี้แก่ไคลเอ็นต์เด็ดขาด
// app/api/users/route.ts
import { NextResponse } from "next/server"
import { serverEnv } from "@/app/lib/env"
export async function GET() {
// Safe to read secrets on the server
const db = serverEnv.DATABASE_URL
return NextResponse.json({ ok: true, dbConfigured: Boolean(db) })
}การใช้งานฝั่งไคลเอ็นต์
คอมโพเนนต์ฝั่งไคลเอ็นต์นำเข้าเฉพาะ clientEnv ซึ่งมีตัวแปร NEXT_PUBLIC_* ข้อมูลลับจะไม่ถูกส่งไปยังเบราว์เซอร์
"use client"
import { clientEnv } from "@/app/lib/env"
export default function ApiBaseNotice() {
return <small>API base: {clientEnv.NEXT_PUBLIC_API_BASE}</small>
}การกำหนดชนิดแบบแอมเบียนต์
การกำหนดชนิดแบบแอมเบียนต์ช่วยปรับปรุง DX สำหรับ process.env แต่ไม่ได้ตรวจสอบขณะทำงาน—จึงยังต้องคงการตรวจสอบด้วย zod ไว้
// env.d.ts (optional hints; runtime validation still required)
/// <reference types="node" />
declare namespace NodeJS {
interface ProcessEnv {
NODE_ENV: "development" | "test" | "production"
DATABASE_URL?: string
API_SECRET?: string
NEXT_PUBLIC_API_BASE?: string
}
}แนวทางปฏิบัติที่ดี
แนวทางปฏิบัติที่ดี:
- อย่าอ่านข้อมูลลับในไฟล์ฝั่งไคลเอ็นต์เด็ดขาด
- ตรวจสอบครั้งเดียวเมื่อเริ่มต้นระบบ และให้ระบบที่ไม่ใช่การใช้งานจริงหยุดทำงานอย่างรวดเร็วเพื่อค้นหาปัญหา
- รวมการเข้าถึงสภาพแวดล้อมไว้หลังโมดูลขนาดเล็กเพื่อให้สอดคล้องกันและรองรับการทดสอบ
การตรวจสอบการกำหนดชนิดสภาพแวดล้อม
ตรวจสอบอย่างรวดเร็ว: รูปแบบที่ปลอดภัยสำหรับการกำหนดชนิดและการเปิดเผยตัวแปรสภาพแวดล้อมคืออะไร
สรุปทบทวน
สรุปทบทวน: แยกวิเคราะห์ process.env ด้วย zod ส่งออก serverEnv/clientEnv ที่มีชนิด และอาศัย NEXT_PUBLIC_* เพื่อเปิดเผยข้อมูลแก่ไคลเอ็นต์อย่างปลอดภัย
คำถามที่พบบ่อย
บทเรียน “การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า”
ตรวจสอบและกำหนดชนิดข้อมูลให้ตัวแปรสภาพแวดล้อม เปิดเผยตัวแปรฝั่งไคลเอ็นต์ที่ปลอดภัยด้วย NEXT_PUBLIC และรวมการตั้งค่าสำหรับเซิร์ฟเวอร์กับไคลเอ็นต์ไว้ที่ศูนย์กลาง คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
- การดึงข้อมูลและการกำหนดชนิดข้อมูลแอ็กชัน
- การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า