ในโลกของการพัฒนาเว็บแอปพลิเคชัน ฝั่ง Frontend ต้องมีวิธีดึงข้อมูลจาก API อย่างมีประสิทธิภาพ ซึ่งใน Next.js มีหลายแนวทางให้เลือกใช้ เช่น getServerSideProps (SSR), getStaticProps (SSG), หรือ Client-side Fetching ซึ่งแต่ละวิธีก็มีข้อดีข้อเสียต่างกันไป
ถ้าพูดถึงการดึงข้อมูลแบบ Client-side แล้ว SWR เป็นตัวเลือกที่หลายคนชอบ เพราะมันช่วยให้การ fetch ข้อมูลลื่นไหล อัปเดตอัตโนมัติ และยังจัดการแคชได้อย่างฉลาด วันนี้เราจะมาทำความรู้จัก SWR และดูวิธีใช้งานใน Next.js กันแบบเข้าใจง่าย ๆ
🔍 SWR คืออะไร?
SWR ย่อมาจาก Stale-While-Revalidate เป็นแนวคิดที่ช่วยให้การดึงข้อมูลเร็วและสดใหม่ตลอดเวลา โดยที่ไม่ต้องให้ผู้ใช้รอนานเกินไป โดยถูกพัฒนาโดยทีมเดียวกับ Next.js (Vercel) ทำให้มันเหมาะกับการใช้ในโปรเจ็กต์ที่พัฒนาโดย Next.js มาก
หลักการของ SWR คือ
- คืนค่าข้อมูลเก่าจากแคชก่อน เพื่อให้ผู้ใช้เห็นข้อมูลเร็วที่สุด
- ดึงข้อมูลใหม่จาก API อยู่เบื้องหลัง
- อัปเดตข้อมูลใหม่ ใน UI อัตโนมัติ
ฟังดูดีใช่ไหม? เพราะมันช่วยให้การโหลดข้อมูลไม่กระตุก และมีประสบการณ์ใช้งานที่ดีขึ้น
🚀 ติดตั้ง SWR
ก่อนอื่น ถ้ายังไม่ได้ติดตั้ง SWR สามารถติดตั้งได้ง่าย ๆ ด้วยคำสั่งนี้
npm install swr
# หรือถ้าใช้ yarn
yarn add swr
เสร็จแล้วก็พร้อมลุย! 🎉
🛠 วิธีใช้ SWR เบื้องต้น
SWR ใช้งานง่ายมาก ๆ เพียงแค่ import และใช้ useSWR ใน React Component
import useSWR from 'swr'
const fetcher = (url) => fetch(url).then(res => res.json())
export default function Profile() {
const { data, error } = useSWR('/api/user', fetcher)
if (error) return <div>โหลดข้อมูลไม่สำเร็จ 😢</div>
if (!data) return <div>กำลังโหลดข้อมูล... ⏳</div>
return (
<div>
<h1>สวัสดี, {data.name}!</h1>
<p>อีเมล: {data.email}</p>
</div>
)
}
อธิบายโค้ด
- เราใช้ useSWR เพื่อดึงข้อมูลจาก /api/user
- fetcher คือฟังก์ชันที่ใช้ดึงข้อมูลจาก API
- ถ้ามี error จะแสดงข้อความผิดพลาด
- ถ้าข้อมูลยังมาไม่ถึง จะแสดงข้อความ กำลังโหลด...
- ถ้าทุกอย่างเรียบร้อยแล้ว ก็โชว์ข้อมูลที่ดึงมาได้
ข้อดีของวิธีนี้คือ ไม่ต้องใช้ useEffect หรือจัดการ state เองเลย เพราะ SWR จัดการให้หมด!
⚡️ ทำไม SWR ถึงดีกว่า useEffect + fetch?
บางคนอาจสงสัยว่า "แล้วทำไมไม่ใช้ useEffect กับ fetch ตรง ๆ ล่ะ?" คำตอบคือ SWR ดีกว่าเพราะ
✅ จัดการแคชให้อัตโนมัติ – ไม่ต้องโหลดข้อมูลซ้ำถ้ายังอยู่ในแคช
✅ อัปเดตข้อมูลเมื่อมีการเปลี่ยนแปลง – ไม่ต้อง reload หน้าเอง
✅ รองรับการ Revalidate อัตโนมัติ – ดึงข้อมูลใหม่เมื่อลูกค้ากลับมาที่หน้าเว็บ
✅ รองรับการดึงข้อมูลแบบ on-focus & re-fetch on reconnect – ไม่ต้องกดรีเฟรชเอง
ถ้าใช้ useEffect และ fetch เราต้องเขียนโค้ดจัดการแคชเอง ซึ่งยุ่งยากและซับซ้อนกว่า
🔄 ตัวอย่างการใช้ Mutate และ Revalidate
ถ้าต้องการให้ข้อมูลอัปเดตทันทีโดยไม่ต้องรอ SWR รีเฟรชเอง สามารถใช้ mutate ได้
import useSWR, { mutate } from 'swr'
const fetcher = (url) => fetch(url).then(res => res.json())
export default function Dashboard() {
const { data } = useSWR('/api/stats', fetcher)
return (
<div>
<h1>ยอดผู้ใช้งาน: {data ? data.users : 'กำลังโหลด...'}</h1>
<button onClick={() => mutate('/api/stats')}>โหลดข้อมูลใหม่</button>
</div>
)
}
เมื่อกดปุ่ม โหลดข้อมูลใหม่ ระบบจะดึงข้อมูลใหม่จาก API ทันที
🔐 ใช้ SWR กับ Authentication
SWR เหมาะกับระบบที่ต้องใช้ Token Authentication เช่น JWT หรือ OAuth เพราะสามารถส่ง Header ไปกับทุก Request ได้ง่าย ๆ
import useSWR from 'swr'
const fetcher = (url) =>
fetch(url, {
headers: {
Authorization: `Bearer ${localStorage.getItem('token')}`,
},
}).then((res) => res.json())
export default function UserProfile() {
const { data, error } = useSWR('/api/profile', fetcher)
if (error) return <div>โหลดข้อมูลไม่สำเร็จ</div>
if (!data) return <div>กำลังโหลด...</div>
return <h1>ชื่อผู้ใช้: {data.username}</h1>
}
🔥 การใช้งาน SWR กับ GraphQL
ถ้าใช้ GraphQL เราก็สามารถใช้ SWR ได้ โดยเปลี่ยนจาก fetch เป็นการส่ง Query ไปยัง API
const fetcher = (query) =>
fetch('/graphql', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query }),
}).then((res) => res.json())
const GET_USER = `
{
user {
name
email
}
}
`
export default function UserProfile() {
const { data, error } = useSWR(GET_USER, fetcher)
if (error) return <div>โหลดข้อมูลไม่สำเร็จ</div>
if (!data) return <div>กำลังโหลด...</div>
return <h1>ชื่อ: {data.user.name}</h1>
}
📌 สรุป
SWR เป็นเครื่องมือที่ช่วยให้การดึงข้อมูลแบบ Client-side ง่ายขึ้น โดยที่ไม่ต้องจัดการแคชเอง รองรับการอัปเดตข้อมูลอัตโนมัติ และมีประสิทธิภาพสูงกว่าการใช้ useEffect + fetch แบบเดิม ๆ
✅ เหมาะกับ
- ดึงข้อมูลที่เปลี่ยนแปลงบ่อย เช่น ยอดไลก์, คอมเมนต์, จำนวนผู้ใช้
- แสดงข้อมูลให้ผู้ใช้เร็วที่สุด โดยใช้แคช
- อัปเดตข้อมูลอัตโนมัติ โดยไม่ต้องรีเฟรชหน้า
ถ้าคุณใช้ Next.js อยู่แล้ว ลองเอา SWR ไปใช้ดู รับรองว่าชีวิตง่ายขึ้นแน่นอน! 🚀
ไม่มีความคิดเห็น:
แสดงความคิดเห็น