แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด
ใช้รูปแบบการจัดวางไฟล์ของ App Router ได้แก่ loading.js, error.js และ not-found.js เพื่อสร้างเส้นทางที่ทนทาน รองรับการสตรีม และมีทางเลือกสำรองที่เรียบร้อยเมื่อเกิดปัญหา
แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด เป็นบทเรียน Next.js 15 Fullstack Web Apps ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Next.js 15 Fullstack Web Apps และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Next.js 15 Fullstack Web Apps มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
Why Loading and Error UI Matter
Advanced routing is not only about where a route lives but about what users see while it resolves or fails. The App Router gives you special files that wrap segments automatically.
loading.jsrenders an instant fallback while the segment streams.error.jscatches runtime errors in that segment.not-found.jsrenders whennotFound()is called.
The loading.js Convention
A loading.js file in a segment folder is automatically wrapped around page.js in a React Suspense boundary. While the server component awaits data, the loading UI shows instantly.
export default function Loading() {
return <div className="spinner">Loading dashboard...</div>;
}Skeletons Beat Spinners
For perceived performance, render a skeleton that mirrors the final layout instead of a generic spinner. It reduces layout shift and feels faster.
export default function Loading() {
return (
<ul>
{Array.from({ length: 5 }).map((_, i) => (
<li key={i} className="skeleton-row" />
))}
</ul>
);
}Streaming with Suspense
Because loading.js is just Suspense under the hood, the rest of the layout renders immediately while only the slow segment streams in. You can also nest your own Suspense boundaries inside a page for finer control.
import { Suspense } from 'react';
export default function Page() {
return (
<section>
<h1>Reports</h1>
<Suspense fallback={<p>Loading chart...</p>}>
<SlowChart />
</Suspense>
</section>
);
}The error.js Convention
error.js must be a Client Component. It receives the thrown error and a reset function to retry rendering the segment.
'use client';
export default function Error({ error, reset }) {
return (
<div>
<p>Something went wrong: {error.message}</p>
<button onClick={() => reset()}>Try again</button>
</div>
);
}Error Boundaries Are Scoped
An error.js catches errors in its segment and its children, but not in the layout at the same level. To catch layout errors, place the error file one level up.
- Errors bubble up to the nearest parent boundary.
- The root layout cannot be caught by a sibling error file.
global-error.js for the Root
To catch errors in the root layout itself, add global-error.js. It replaces the entire document, so it must render its own <html> and <body> tags.
'use client';
export default function GlobalError({ error, reset }) {
return (
<html>
<body>
<h2>App crashed</h2>
<button onClick={() => reset()}>Reload</button>
</body>
</html>
);
}Triggering not-found.js
Call notFound() from next/navigation inside a server component to render the nearest not-found.js and send a 404 status.
import { notFound } from 'next/navigation';
export default async function Page({ params }) {
const post = await getPost(params.id);
if (!post) notFound();
return <article>{post.title}</article>;
}Custom not-found.js UI
Place not-found.js in any segment to override the default 404 for that part of the route tree. A root-level one acts as the global 404 page.
import Link from 'next/link';
export default function NotFound() {
return (
<div>
<h2>Post not found</h2>
<Link href="/blog">Back to blog</Link>
</div>
);
}Combining the Conventions
A robust segment folder often contains all four files working together:
page.js— the contentloading.js— streamed fallbackerror.js— runtime failure recoverynot-found.js— missing resource
Each is wired up automatically by the App Router with no manual provider setup.
Logging Errors in Production
Use a useEffect inside error.js to report errors to your monitoring service while still showing recovery UI to the user.
'use client';
import { useEffect } from 'react';
export default function Error({ error, reset }) {
useEffect(() => {
reportToSentry(error);
}, [error]);
return <button onClick={reset}>Retry</button>;
}Quick Check
Which statement about error.js in the App Router is correct?
Recap
You learned the App Router's resilience conventions:
loading.jswraps segments in Suspense for instant streamed fallbacks.error.js(Client Component) recovers from runtime errors withreset.global-error.jscatches root-layout failures.not-found.jsrenders whennotFound()is called.
Together they make advanced routes graceful under load and failure.
คำถามที่พบบ่อย
บทเรียน “แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Next.js 15 Fullstack Web Apps ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Next.js 15 Fullstack Web Apps มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด”
ใช้รูปแบบการจัดวางไฟล์ของ App Router ได้แก่ loading.js, error.js และ not-found.js เพื่อสร้างเส้นทางที่ทนทาน รองรับการสตรีม และมีทางเลือกสำรองที่เรียบร้อยเมื่อเกิดปัญหา คุณปฏิบัติ Next.js 15 Fullstack Web Apps ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Next.js 15 Fullstack Web Apps หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Next.js 15 Fullstack Web Apps บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Next.js 15 Fullstack Web Apps นี้ได้ไหม
ได้ บทเรียน Next.js 15 Fullstack Web Apps ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางแบบไดนามิกและเซกเมนต์ครอบคลุมทั้งหมด
- เลย์เอาต์ซ้อนกันและกลุ่มเส้นทาง
- เส้นทางคู่ขนานและเส้นทางดักจับ
- แนวทางการจัดการส่วนติดต่อผู้ใช้ขณะโหลดและเกิดข้อผิดพลาด