0Pricing
TypeScript Academy · บทเรียน

การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า

ตรวจสอบและกำหนดชนิดข้อมูลให้ตัวแปรสภาพแวดล้อม เปิดเผยตัวแปรฝั่งไคลเอ็นต์ที่ปลอดภัยด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
  2. การดึงข้อมูลและการกำหนดชนิดข้อมูลแอ็กชัน
  3. การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า
← กลับไปที่ TypeScript Academy