ข้ามไปยังเนื้อหา

Production & Ecosystem

React มีสอง build development build ใหญ่และช้ากว่าโดยตั้งใจ — รวม warning ที่ช่วยได้, prop-type check และ Strict Mode double-invoke ส่วน production build ตัดทั้งหมดนั้นออกเพื่อความเร็วและขนาด build tool ของคุณ (Vite / framework) สลับให้อัตโนมัติเมื่อคุณรัน production build:

Terminal window
npm run build # produces the optimized production bundle

อย่า ship development build เด็ดขาด — build นี้ช้าและใหญ่กว่าอย่างมีนัยสำคัญ และจำไว้ว่า <StrictMode> double-invoke เฉพาะใน development; ใน production ไม่ทำอะไรเลย ปล่อยไว้จึงไม่มีต้นทุน

bundle ใหญ่ก้อนเดียวหมายถึง user download code ของหน้าที่อาจไม่เคยเข้า React.lazy + <Suspense> แยก component เป็น chunk ของตัวเองที่โหลด on demand:

import { lazy, Suspense } from 'react';
const Dashboard = lazy(() => import('./Dashboard')); // separate chunk
function App() {
return (
<Suspense fallback={<Spinner />}>
<Dashboard /> {/* downloaded only when this renders */}
</Suspense>
);
}

แยกที่ route boundary ก่อน (แต่ละหน้าเป็น chunk) — นั่นคือการ split ที่คุ้มค่าที่สุด และ framework มักทำให้คุณอยู่แล้ว

React ตั้งใจให้เล็ก app จริงจึงประกอบ library ที่ยอมรับกันแล้วไม่กี่ตัว ตัวเลือกปัจจุบันที่ลงตัว:

ต้องการหยิบ
Routing (SPA)React Router — หรือ router ใน framework (Next.js)
Server state / data fetchingTanStack Query (React Query) หรือ RTK Query
FormReact Hook Form (+ schema validator อย่าง Zod)
Client stateZustand หรือ Redux Toolkit (หรือ Jotai) — เกินกว่าที่ Context จัดการได้สบาย
StylingCSS Modules, Tailwind หรือ CSS-in-JS library
Error monitoringSentry (พร้อม error boundary ที่ root ของ app)
flowchart TB
  react["React (view layer)"]
  react --> route["Routing:
React Router / framework"]
  react --> data["Server state:
TanStack Query"]
  react --> forms["Forms:
React Hook Form"]
  react --> state["Client state:
Zustand / Redux Toolkit"]
React บวกชิ้นส่วนที่ app จริงประกอบขึ้น

ความต่างสำคัญที่ช่วยประหยัดความเจ็บปวดมาก: server state (data จาก API — TanStack Query) และ client state (local UI state — useState/Context/Zustand) เป็นคนละปัญหา การพยายามเก็บ server data ใน client store (loading flag เอง, cache invalidation, refetch) คือการคิดใหม่แบบคลาสสิกที่ data library แก้ให้คุณแล้ว

  • build ด้วย production bundle; ตรวจว่าไม่ใช่ dev build
  • code-split ที่ route ด้วย lazy + Suspense
  • วาง error boundary ที่ root ของ app (และรอบ subtree ที่เสี่ยง) แล้วต่อเข้ากับ monitoring
  • เปิด <StrictMode> ไว้ — เป็น dev-only guard ที่ไม่มีต้นทุนใน production
  • แยก server state (data library) ออกจาก client state (local/store)
ความต่างระหว่าง development และ production build ของ React คืออะไร?
code-split component ให้โหลด on demand อย่างไร?
ทำไมต้องแยก server state กับ client state?
ปล่อย `<StrictMode>` ไว้ใน production มีต้นทุนเท่าไร?