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

unstable_cache และ React cache()

แคชผลลัพธ์ของฟังก์ชันที่ใช้ทรัพยากรมากต่อคำขอหรือข้ามคำขอด้วยเครื่องมือแคชของ Next.js

unstable_cache และ React cache() เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยูทิลิตีแคชสองแบบ

Next.js มียูทิลิตีแคชที่เสริมกันสองแบบ ได้แก่ unstable_cache สำหรับแคชถาวรข้ามคำขอ และ cache() ของ React สำหรับกำจัดการทำซ้ำต่อคำขอ

React cache() — กำจัดการทำซ้ำต่อคำขอ

cache(fn) จาก React จะจดจำผลลัพธ์ของฟังก์ชันไว้ตลอดช่วงการแสดงผลบนเซิร์ฟเวอร์หนึ่งรอบ คอมโพเนนต์ฝั่งเซิร์ฟเวอร์สองตัวที่เรียกใช้ฟังก์ชันเดียวกันซึ่งแคชไว้จะได้รับผลลัพธ์เดียวกันโดยไม่ต้องเรียกฐานข้อมูลหรือจุดปลายทาง API ซ้ำ

import { cache } from 'react';

export const getUser = cache(async (id: string) => {
  return db.user.findUnique({ where: { id } });
});

// Both components call getUser(id) — only one DB query fires per request
// component A: const user = await getUser('1');
// component B: const user = await getUser('1'); // uses cached result

unstable_cache — แคชแบบคงอยู่

unstable_cache(fn, keyParts, options) จะคงผลลัพธ์ไว้ข้ามคำขอ จนกว่าจะสั่งตรวจสอบความถูกต้องใหม่โดยชัดแจ้ง ให้คิดว่านี่คือ fetch({ next: { revalidate } }) แต่ใช้ได้กับฟังก์ชันอะซิงโครนัสทุกชนิด (เช่น การสืบค้นฐานข้อมูล การเรียก Redis เป็นต้น)

import { unstable_cache } from 'next/cache';

const getProducts = unstable_cache(
  async () => db.products.findMany(),
  ['products-list'],      // cache key parts
  { revalidate: 60, tags: ['products'] } // options
);

// In a Server Component:
const products = await getProducts();

ส่วนประกอบคีย์แคช

อาร์กิวเมนต์ตัวที่สองของ unstable_cache คืออาร์เรย์ของสตริงที่ใช้สร้างคีย์แคช ให้ใส่ตัวแปรทั้งหมดที่มีผลต่อผลลัพธ์

const getUserPosts = unstable_cache(
  async (userId: string) => db.posts.findMany({ where: { userId } }),
  ['user-posts'],         // base key
  { tags: [`user-${userId}-posts`] } // per-user tag
);

// Call with userId — Next.js appends the argument to the key:
const posts = await getUserPosts(userId);

แท็กสำหรับการตรวจสอบความถูกต้องใหม่ตามคำขอ

ติดแท็กให้ฟังก์ชันที่แคชไว้ แล้วทำให้แคชเหล่านั้นไม่ถูกต้องด้วย revalidateTag() เมื่อข้อมูลเปลี่ยนแปลง เช่น หลังการเปลี่ยนแปลงข้อมูลใน Server Action

// Server Action
async function createProduct(data: FormData) {
  'use server';
  await db.products.create({ data: parseFormData(data) });
  revalidateTag('products'); // invalidates all cached functions tagged 'products'
  redirect('/products');
}

การตรวจสอบความถูกต้องใหม่ตามเวลา

กำหนด revalidate: N ใน options เพื่อให้ตรวจสอบแคชใหม่หลังผ่านไป N วินาที โดยมีแนวคิดคล้าย ISR สำหรับการเรียกใช้ fetch

const getStats = unstable_cache(
  async () => computeHeavyStats(),
  ['dashboard-stats'],
  { revalidate: 300 } // recompute at most every 5 minutes
);

การใช้แคช() ร่วมกับ unstable_cache

ใช้ cache() ภายใน unstable_cache สำหรับฟังก์ชันที่ถูกเรียกจากหลายตำแหน่งในการเรนเดอร์ครั้งเดียว: ขจัดการเรียกซ้ำภายในคำขอ และคงผลลัพธ์ไว้ข้ามคำขอ

// Deduplicate the DB call within a request:
export const getRawUser = cache(async (id: string) => db.user.findUnique({ where: { id } }));

// And cache the result persistently:
export const getUser = unstable_cache(getRawUser, ['user'], { revalidate: 60, tags: ['user'] });

ข้อจำกัดของ unstable_cache

unstable_cache ถูกระบุว่าไม่เสถียร เนื่องจาก API อาจเปลี่ยนแปลงก่อนจะมีความเสถียร ฟังก์ชันที่แคชไว้ไม่สามารถเข้าถึงข้อมูลเฉพาะคำขอ เช่น คุกกี้หรือส่วนหัวได้

React cache() สำหรับข้อมูลเลย์เอาต์

ห่อการดึงข้อมูลระดับเลย์เอาต์ด้วย cache() เพื่อให้ทั้งเลย์เอาต์และหน้าที่ซ้อนอยู่ซึ่งเรียกใช้ฟังก์ชันเดียวกันใช้ผลลัพธ์ร่วมกันภายในการเรนเดอร์ครั้งเดียว

// lib/data.ts
export const getCurrentUser = cache(async () => {
  const session = await getServerSession();
  return db.user.findUnique({ where: { id: session?.userId } });
});

// layout.tsx and page.tsx both call getCurrentUser() — one DB query

ควรใช้แต่ละแบบเมื่อใด

cache(): ขจัดการเรียกที่เหมือนกันภายในการเรนเดอร์ครั้งเดียว (คำขอเดียวกัน) unstable_cache: คงผลลัพธ์ไว้ข้ามหลายคำขอจนกว่าจะตรวจสอบความถูกต้องใหม่ ใช้ fetch + next.revalidate เมื่อเรียกใช้ API HTTP ภายนอก

ตรวจสอบความเข้าใจ

ความแตกต่างสำคัญระหว่าง cache() ของ React กับ unstable_cache ของ Next.js คืออะไร

สรุป

cache(fn) จะขจัดการเรียกซ้ำภายในการส่งต่อการเรนเดอร์ครั้งเดียว เหมาะสำหรับข้อมูลร่วมของเลย์เอาต์และหน้า ส่วน unstable_cache(fn, keys, { revalidate, tags }) จะคงผลลัพธ์ไว้ข้ามคำขอ พร้อมการทำให้ไม่ถูกต้องตามเวลาหรือตามแท็ก เหมาะสำหรับการสืบค้นฐานข้อมูลที่ใช้เวลานาน

คำถามที่พบบ่อย

บทเรียน “unstable_cache และ React cache()” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “unstable_cache และ React cache()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “unstable_cache และ React cache()”

แคชผลลัพธ์ของฟังก์ชันที่ใช้ทรัพยากรมากต่อคำขอหรือข้ามคำขอด้วยเครื่องมือแคชของ Next.js คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “unstable_cache และ React cache()” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. fetch() พร้อมตัวเลือกแคชใน Next.js
  2. unstable_cache และ React cache()
  3. การสร้างสถิตแบบเพิ่มทีละส่วน (ISR)
  4. Server Actions สำหรับการเปลี่ยนแปลงข้อมูล
← กลับไปที่ React Academy