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

แคช Apollo: การทำให้เป็นมาตรฐานและการอัปเดต

ทำความเข้าใจ InMemoryCache ที่ทำให้เป็นมาตรฐานของ Apollo และอัปเดตข้อมูลในแคชหลังการกลายข้อมูลโดยไม่ต้องดึงข้อมูลใหม่

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

วิธีที่ InMemoryCache ทำให้ข้อมูลเป็นมาตรฐาน

InMemoryCache จัดเก็บออบเจ็กต์แต่ละรายการด้วยคีย์แคชที่ประกอบด้วย __typename และ id: User:1, Post:42 เมื่อคำค้นหาส่งคืน User ที่มี id "1" ระบบจะจัดเก็บรายการนั้นไว้เพียงครั้งเดียวภายใต้คีย์นี้ ไม่ว่าคำค้นหาที่แตกต่างกันจะมีรายการดังกล่าวอยู่กี่คำค้นหาก็ตาม

คำค้นหาใดก็ตามที่ดึงข้อมูล User:1 ในภายหลังจะอ่านข้อมูลจากรายการแคชเดียวกัน ทำให้ทุกคอมโพเนนต์เห็นข้อมูลชุดเดียวกัน

การอัปเดตข้ามคำค้นหาโดยอัตโนมัติ

เมื่อ mutation ส่งคืนออบเจ็กต์ User:1 ที่อัปเดตแล้ว Apollo จะเขียนข้อมูลนั้นลงในรายการแคช User:1 คำค้นหาที่กำลังทำงานอยู่ทุกคำซึ่งมี User:1 จะสะท้อนฟิลด์ที่อัปเดตแล้วในส่วนติดต่อผู้ใช้โดยอัตโนมัติ โดยไม่ต้องเขียนโค้ดเพิ่มเติม

การส่งต่อข้อมูลโดยอัตโนมัตินี้เป็นข้อได้เปรียบหลักของแคชที่ทำให้ข้อมูลเป็นมาตรฐาน เมื่อเทียบกับแคชแบบเอกสาร (ที่ใช้คำค้นหาเป็นคีย์)

cache.readQuery

อ่านผลลัพธ์ปัจจุบันของคำค้นหาจากแคช: cache.readQuery({ query: GET_USERS }) จะส่งคืนออบเจ็กต์ข้อมูลเช่นเดียวกับที่ useQuery ส่งคืน หากคำค้นหาไม่มีอยู่ในแคช ระบบจะส่งคืนค่า null

ใช้ readQuery ภายในฟังก์ชันอัปเดตของ mutation เพื่ออ่านรายการปัจจุบันก่อนแก้ไข

cache.writeQuery

cache.writeQuery({ query: GET_USERS, data: { users: updatedUsers } }) จะเขียนข้อมูลลงในแคชโดยตรง และทำให้คอมโพเนนต์ทั้งหมดที่อ่าน GET_USERS เรนเดอร์ใหม่ โดยไม่ส่งคำขอเครือข่าย

ใช้ readQuery ร่วมกับ writeQuery เพื่อสร้างการอัปเดตแคชแบบไม่เปลี่ยนแปลงข้อมูลเดิม: อ่าน สร้างอาร์เรย์ใหม่ แล้วเขียนกลับ

cache.modify สำหรับการอัปเดตเอนทิตีโดยตรง

cache.modify({ id: cache.identify(user), fields: { name: () => 'New Name' } }) จะแก้ไขฟิลด์ของเอนทิตีเฉพาะรายการในแคชโดยตรง ไม่จำเป็นต้องอ่านคำค้นหาก่อน หากทราบ ID ของเอนทิตีในแคชแล้ว

ออบเจ็กต์ fields จะจับคู่ชื่อฟิลด์กับฟังก์ชันตัวปรับแต่ง ซึ่งรับค่าปัจจุบันและส่งคืนค่าใหม่

การอัปเดตแคชหลัง mutation

ส่งฟังก์ชันอัปเดตให้กับ useMutation: useMutation(ADD_POST, { update(cache, { data: { addPost } }) { cache.modify({ id: cache.identify(user), fields: { posts: existingPosts => [...existingPosts, addPost] } }); } }).

การดำเนินการนี้จะเพิ่มโพสต์ใหม่ต่อท้ายอาร์เรย์โพสต์ที่แคชไว้ของผู้ใช้ และอัปเดตคอมโพเนนต์ทั้งหมดที่แสดงรายการโพสต์ของผู้ใช้

cache.evict: การนำรายการออกจากแคช

cache.evict({ id: 'User:1' }) จะนำรายการ User:1 ออกจากแคช คำค้นหาที่กำลังทำงานอยู่ซึ่งมี User:1 จะเรนเดอร์ใหม่โดยไม่มีเอนทิตีนั้นในผลลัพธ์

หลังจากนำรายการออกแล้ว ให้เรียก cache.gc() เพื่อลบออบเจ็กต์ที่ไม่สามารถเข้าถึงได้จากคำค้นหาหลัก การทำเช่นนี้ช่วยป้องกันหน่วยความจำรั่วในแอปพลิเคชันที่ทำงานเป็นเวลานาน

การเก็บกวาดหน่วยความจำ

cache.gc() จะสำรวจกราฟแคชโดยเริ่มจากคำค้นหาที่กำลังทำงานอยู่ทั้งหมด แล้วลบเอนทิตีที่ไม่สามารถเข้าถึงได้อีกต่อไป สามารถเรียกใช้เป็นระยะหรือหลัง mutation แบบกลุ่มที่ลบเอนทิตีจำนวนมากได้อย่างปลอดภัย

เอนทิตีที่ถูกอ้างอิงโดยฮุก useQuery ที่กำลังทำงานอยู่จะไม่ถูกเก็บกวาด จะมีเพียงเอนทิตีที่ไม่มีเจ้าของและไม่เป็นส่วนหนึ่งของผลลัพธ์คำค้นหาใดอีกต่อไปเท่านั้นที่ถูกลบ

การเปลี่ยนเส้นทางแคชด้วยนโยบายฟิลด์

หากคุณค้นหาเอนทิตีเดียว (GET_USER ตาม id) ซึ่งถูกแคชไว้แล้วในคำค้นหาแบบรายการ Apollo สามารถอ่านเอนทิตีนั้นจากแคชได้โดยไม่ต้องส่งคำขอเครือข่ายรอบใหม่ โดยใช้นโยบายฟิลด์ ได้แก่ keyArgs และฟังก์ชันอ่านในนโยบายชนิดข้อมูล

ฟังก์ชันอ่านจะส่งคืนการอ้างอิงแคช: return toReference({ __typename: 'User', id: args.id }) ซึ่งบอกให้ Apollo อ่านข้อมูลจากรายการแคช User:id ที่มีอยู่แล้ว

keyFields แบบกำหนดเองสำหรับ ID ที่ไม่เป็นมาตรฐาน

หากเอนทิตีของคุณใช้ฟิลด์อื่นที่ไม่ใช่ id เป็นคีย์เฉพาะ (เช่น slug หรือ uuid) ให้กำหนดค่าในนโยบายชนิดข้อมูล: new InMemoryCache({ typePolicies: { Post: { keyFields: ['slug'] } } })

จากนั้น Apollo จะใช้ Post:my-post-slug เป็นคีย์แคชแทนการบังคับให้มีฟิลด์ id ซึ่งช่วยรักษาการทำข้อมูลให้เป็นมาตรฐานสำหรับสคีมาที่ใช้คีย์รูปแบบอื่น

refetchQueries เทียบกับฟังก์ชัน update

refetchQueries: [{ query: GET_USERS }] ในตัวเลือกของ useMutation จะเรียกการดึงข้อมูลจากเครือข่ายใหม่หลัง mutation ทำงานเสร็จ วิธีนี้เรียบง่ายกว่า แต่จะส่งคำขอเครือข่ายทุกครั้ง

ฟังก์ชัน update จะแก้ไขแคชภายในเครื่องและไม่ต้องส่งคำขอเครือข่ายรอบใหม่ ให้ใช้ refetchQueries เมื่อเขียนตรรกะการอัปเดตแคชได้ซับซ้อนเกินไป หรือเมื่อฟิลด์ที่เซิร์ฟเวอร์คำนวณทำให้การอัปเดตแคชภายในเครื่องไม่น่าเชื่อถือ

คีย์การทำข้อมูลให้เป็นมาตรฐานของ InMemoryCache

รูปแบบคีย์แคชเริ่มต้นที่ InMemoryCache ใช้จัดเก็บเอนทิตีคืออะไร

สรุปบทเรียน

InMemoryCache จะทำข้อมูลเอนทิตีให้เป็นมาตรฐานด้วย __typename+id ซึ่งทำให้เกิดการอัปเดตข้ามคำค้นหาโดยอัตโนมัติ อ่านและเขียนแคชด้วย cache.readQuery, cache.writeQuery และ cache.modify นำเอนทิตีออกด้วย cache.evict ตามด้วย cache.gc กำหนดฟิลด์คีย์แบบกำหนดเองผ่าน typePolicies สำหรับคีย์หลักที่ไม่ใช่ id

ใช้ฟังก์ชันอัปเดตของ mutation เพื่อประสิทธิภาพของแคชภายในเครื่อง และใช้ refetchQueries เมื่อฟิลด์ที่เซิร์ฟเวอร์คำนวณทำให้การอัปเดตภายในเครื่องไม่น่าเชื่อถือ

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

บทเรียน “แคช Apollo: การทำให้เป็นมาตรฐานและการอัปเดต” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แคช Apollo: การทำให้เป็นมาตรฐานและการอัปเดต”

ทำความเข้าใจ InMemoryCache ที่ทำให้เป็นมาตรฐานของ Apollo และอัปเดตข้อมูลในแคชหลังการกลายข้อมูลโดยไม่ต้องดึงข้อมูลใหม่ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “แคช Apollo: การทำให้เป็นมาตรฐานและการอัปเดต” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน GraphQL สำหรับนักพัฒนา React
  2. การตั้งค่า Apollo Client ใน React
  3. ฮุก useQuery และ useMutation
  4. แคช Apollo: การทำให้เป็นมาตรฐานและการอัปเดต
← กลับไปที่ React Academy