เทคนิคการทำ data fetching ด้วย SWR
สวัสดีครับ วันนี้เราจะมาลองใช้งานเครื่องมือในการทำ data fetching ที่มีชื่อว่า SWR กัน ก่อนอื่นมาดูกันว่า SWR คืออะไรและเราได้ประโยชน์อะไรจากการใช้งาน
ปัญหา
ปัจจุบันการ fetch ข้อมูลจาก backend ส่วนใหญ่เราจะคุ้นเคยกับการใช้งาน Axios ซึ่งมีข้อเสีย คือเวลาที่เราทำการ fetch ข้อมูลมาแสดงจะมีจังหวะที่ฝั่ง frontend จะต้องรอ response กลับมาจาก backend ระหว่างนี้ผู้ใช้งานก็จะเห็น loading อนิเมชัน และหากผู้ใช้งานมีการเปลี่ยนหน้าไปมาก็จะต้องรอโหลดข้อมูลทุกครั้ง ซึ่ง SWR จะมาช่วยแก้ปัญหานี้
SWR คืออะไร?
SWR ย่อมาจาก Stale While Revalidate ซึ่งเป็นกระบวนการทำ caching ให้กับข้อมูลที่เราทำการ fetch มาจาก server โดยหลักการ คือเมื่อมีการยิง request เพื่อจะไป fetch ข้อมูล SWR จะทำการคืนค่าจาก caching มาให้ (stale) และทำการยิง request ไป fetch ข้อมูล (revalidate) และสุดท้ายเมื่อได้ข้อมูลกลับมาก็จะนำมา update ให้อีกที ข้อดีก็คือจะทำให้ UX (user experiences) ดีขึ้นเพราะผู้ใช้งานสามารถเห็นข้อมูลได้ทันทีไม่ต้องรอ response กลับมาจาก server
วิธีการใช้งาน
ติดตั้งด้วย yarn หรือ npm
ตัวอย่างการใช้งาน
จาก code ทำการ import useSWR ซึ่งเป็น React hooks เข้ามาจาก SWR และนำมาใช้งานโดยทำการส่ง parameter ให้ 2 ตัว ตัวแรกคือค่าของ key ซึ่งจะเป็นค่า unique ของข้อมูลแต่ละตัวที่เราจะทำการ caching ในตัวอย่างค่าของ key คือ [‘/api/user/’, userId] ซึ่งเป็น array ของ ‘/api/user/’ และ userId โดย React component ทำการรับ props ชื่อ userId เข้ามาเพื่อจะนำไปใช้ในการ fetch profile ของ userId นี้เราจึงทำการส่งค่า key ที่เป็นของ userId นี้ให้กับ useSWR เพื่อทำการ caching ข้อมูล
แล้ว fetcher คืออะไร fetcher คือ wrapper function ของการ fetch ข้อมูลตามตัวอย่างในรูปเราใช้ fetch ที่เป็น native fetch ของ browser หรือใครคุ้นเคยกับการใช้ axios ก็สามารถใช้ได้เช่นกัน
ค่าที่ return กลับมาจาก useSWR คือ data และ error และนอกจากนี้เรายังสามารถกำหนด option เพิ่มเติมในการใช้งานได้
SWR Options
เราสามารถกำหนดค่า options เพิ่มเติมในการใช้งานได้ ในตัวอย่างมีการกำหนดค่า refreshInterval ซึ่งจะทำการ fetch ข้อมูลให้ทุก ๆ 3 วินาที หรือ options อื่น ๆ เช่น revalidateOnFocus ซึ่งค่า default เป็น true การทำงานคือ หากเรามีการสลับ tab ของ browser ไปที่ tab อื่นและสลับกลับมาจะทำการ fetch ข้อมูลให้อัตโนมัติ
Mutate
หากเราต้องการให้ผู้ใช้งานสามารถเห็นการเปลี่ยนแปลงข้อมูลได้ทันที เราสามารถใช้ความสามารถของ mutate ได้ ตามตัวอย่างจะเป็นการยิง request เพื่อไป update ข้อมูล name ของผู้ใช้งานเราสามารถใช้ mutate ในการ update ข้อมูล local ที่อยู่ใน cache เพื่อนำข้อมูลมาแสดงให้ผู้ใช้งานเห็นได้ทันที และทำการยิง request ไป update ข้อมูลจริงบน server และเมื่อได้ response จาก server ก็นำข้อมูลมา update ข้อมูลใน cache อีกที
Infinite Loading
กรณีที่เราต้องการทำ infinite loading เช่น fetch ข้อมูล notification มาแสดงก็สามารถใช้งาน feature useSWRInfinite ได้ โดยหลักการทำงานคือ useSWRInfinite จะทำการ cache ค่าตาม url ที่เปลี่ยนไปโดยจะ return ค่า index กลับมาให้ใช้ในการกำหนด pagination ของการ fetch ข้อมูลซึ่งการเปลี่ยนค่า index นี้สามารถทำได้ด้วยการใช้ function setSize ที่ return มาให้ส่วนเบื้องหลังการเก็บค่า cache ของ useSWRInfinite เป็นอย่างไร ลองดูตัวอย่าง log ด้านล่างได้เลยครับ
จากภาพเราลอง log ค่า keys ของ cache ที่ useSWRInfinite ทำการเก็บไว้จะพบว่ามีการเก็บค่าของข้อมูลที่ fetch มาแต่ละชุดตามค่าของ size ที่เปลี่ยนไป และมีการเก็บค่า arg, err, size ของค่าปัจจุบันไว้เพื่อที่หากมีการ revalidate ข้อมูลก็จะสามารถนำค่าใน cache มาแสดงได้ถูกต้อง
จบไปแล้วนะครับสำหรับการใช้งาน SWR เบื้องต้นในการทำ data fetching เพื่อช่วยเพิ่ม UX (user experiences) ให้ผู้ใช้งานมีความรู้สึกว่าได้ใช้งานแบบ real-time โดยหลักการนี้เรียกว่า Optimistic UI หากเพื่อน ๆ คนไหนสนใจก็ลองหาข้อมูลเพิ่มเติมได้ครับ แล้วไว้พบกันใหม่ใน blog หน้าครับ