การตอบกลับที่แคชได้สำหรับเวิร์กบ็อกซ์

เมื่อแคชเนื้อหาระหว่างรันไทม์ ไม่มีกฎใดที่ใช้ได้กับทั้งหมด คำตอบที่ได้รับคือ "ถูกต้อง" และมีสิทธิ์ที่จะบันทึกและนำมาใช้ใหม่

โมดูล workbox-cacheable-response มอบวิธีมาตรฐานในการกำหนด ควรแคชการตอบกลับตาม รหัสสถานะตัวเลข การมีอยู่ของ ส่วนหัว ด้วยค่าเฉพาะ หรือทั้ง 2 อย่างรวมกัน

การแคชตามรหัสสถานะ

คุณสามารถกําหนดค่ากลยุทธ์ Workbox ให้พิจารณาชุดรหัสสถานะที่มีสิทธิ์แคชได้โดยเพิ่มอินสแตนซ์ CacheableResponsePlugin ลงในพารามิเตอร์ plugins ของกลยุทธ์ ดังนี้

import {registerRoute} from 'workbox-routing'; import {CacheFirst} from 'workbox-strategies'; import {CacheableResponsePlugin} from 'workbox-cacheable-response';  registerRoute(   ({url}) =>     url.origin === 'https://third-party.example.com' &&     url.pathname.startsWith('/images/'),   new CacheFirst({     cacheName: 'image-cache',     plugins: [       new CacheableResponsePlugin({         statuses: [0, 200],       }),     ],   }) ); 

การกำหนดค่านี้จะบอก Workbox ว่าเมื่อประมวลผลคำตอบสำหรับ คำขอกับ https://third-party.example.com/images/ แคชคำขอทั้งหมด โดยมีรหัสสถานะเป็น 0 หรือ 200

การแคชตามส่วนหัว

คุณสามารถกำหนดค่ากลยุทธ์ Workbox เพื่อเลือก เพื่อหาค่าส่วนหัวที่ระบุเป็นเกณฑ์ในการเพิ่มข้อมูล ลงในแคชโดยการตั้งค่าออบเจ็กต์ headers เมื่อสร้างปลั๊กอิน ดังนี้

import {registerRoute} from 'workbox-routing'; import {StaleWhileRevalidate} from 'workbox-strategies'; import {CacheableResponsePlugin} from 'workbox-cacheable-response';  registerRoute(   ({url}) => url.pathname.startsWith('/path/to/api/'),   new StaleWhileRevalidate({     cacheName: 'api-cache',     plugins: [       new CacheableResponsePlugin({         headers: {           'X-Is-Cacheable': 'true',         },       }),     ],   }) ); 

เมื่อประมวลผลการตอบกลับสำหรับ URL คำขอที่มี /path/to/api/ ให้ดูที่ส่วนหัวชื่อ X-Is-Cacheable (ซึ่งเซิร์ฟเวอร์จะเพิ่มลงในคำตอบ) หากมีส่วนหัวนั้นและมีการตั้งค่าเป็นค่า "true" ระบบจะแคชคำตอบได้

ถ้ามีการระบุส่วนหัวหลายรายการ จะต้องมีส่วนหัวเพียงรายการเดียวเท่านั้น ตรงกับค่าที่เชื่อมโยง

การแคชตามส่วนหัวและรหัสสถานะ

คุณสามารถใช้ทั้งสถานะและการกำหนดค่าส่วนหัวร่วมกันได้ เงื่อนไขทั้ง 2 ข้อต้องตรงกันเพื่อให้การตอบกลับได้รับการพิจารณาว่าแคชได้ กล่าวคือ การตอบกลับต้องมีรหัสสถานะที่กําหนดค่าไว้อย่างใดอย่างหนึ่ง และต้องมีส่วนหัวที่ระบุไว้อย่างน้อย 1 รายการ

import {registerRoute} from 'workbox-routing'; import {StaleWhileRevalidate} from 'workbox-strategies'; import {CacheableResponsePlugin} from 'workbox-cacheable-response';  registerRoute(   ({url}) => url.pathname.startsWith('/path/to/api/'),   new StaleWhileRevalidate({     cacheName: 'api-cache',     plugins: [       new CacheableResponsePlugin({         statuses: [200, 404],         headers: {           'X-Is-Cacheable': 'true',         },       }),     ],   }) ); 

ค่าเริ่มต้นคืออะไร

หากคุณใช้หนึ่งในกลยุทธ์ที่มีในตัวของ Workbox โดย กำลังกำหนดค่า cacheableResponse.CacheableResponsePlugin เกณฑ์เริ่มต้นต่อไปนี้คือ ใช้เพื่อกำหนดว่าการตอบสนองที่ได้รับจากเครือข่ายควร ถูกแคช:

  • staleWhileRevalidate และ networkFirst: การตอบกลับที่มีสถานะ 0 (นั่นคือการตอบกลับแบบทึบ) หรือ 200 จะถือว่าแคชได้
  • cacheFirst: การตอบกลับที่มีสถานะ 200 จะถือว่าแคชได้

โดยค่าเริ่มต้น ส่วนหัวการตอบกลับไม่ได้ใช้เพื่อระบุความสามารถในการแคช

เหตุใดจึงมีค่าเริ่มต้นที่แตกต่างกัน

ค่าเริ่มต้นจะแตกต่างกันไปตามว่าระบบจะแคชคำตอบที่มีสถานะ 0 (เช่น คำตอบแบบทึบ) หรือไม่ เนื่องจาก "กล่องดำ" ลักษณะการตอบสนองที่ไม่ชัดเจน เป็นไปไม่ได้ที่โปรแกรมทำงานของบริการจะทราบได้ว่าการตอบกลับ ถูกต้องหรือไม่ หรือแสดงถึงการตอบกลับข้อผิดพลาดที่ส่งคืนจาก เซิร์ฟเวอร์แบบข้ามต้นทาง

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

สําหรับกลยุทธ์ที่เกี่ยวข้องกับการแคชคําตอบแรกที่ได้รับและนําคําตอบที่แคชไว้มาใช้ซ้ำอย่างไม่จํากัด ผลกระทบของการแคชข้อผิดพลาดชั่วคราวและนํามาใช้ซ้ำจะรุนแรงกว่า เพื่อความปลอดภัยโดยค่าเริ่มต้น cacheFirst จะปฏิเสธที่จะบันทึกการตอบกลับ เว้นแต่ว่าจะมีการตอบกลับที่มีรหัสสถานะเป็น 200

การใช้งานขั้นสูง

หากต้องการใช้ตรรกะการแคชเดียวกันนอกกลยุทธ์ Workbox คุณสามารถใช้คลาส CacheableResponse ได้โดยตรง

import {CacheableResponse} from 'workbox-cacheable-response';  const cacheable = new CacheableResponse({   statuses: [0, 200],   headers: {     'X-Is-Cacheable': 'true',   }, });  const response = await fetch('/path/to/api');  if (cacheable.isResponseCacheable(response)) {   const cache = await caches.open('api-cache');   cache.put(response.url, response); } else {   // Do something when the response can't be cached. } 

ประเภท

CacheableResponse

คลาสนี้ช่วยให้คุณตั้งกฎที่กําหนดว่าต้องระบุรหัสสถานะและ/หรือส่วนหัวใดบ้างเพื่อให้Responseได้รับการพิจารณาว่าแคชได้

พร็อพเพอร์ตี้

  • เครื่องมือสร้าง

    เป็นโมฆะ

    หากต้องการสร้างอินสแตนซ์ CacheableResponse ใหม่ คุณต้องระบุพร็อพเพอร์ตี้ config อย่างน้อย 1 รายการ

    หากระบุทั้ง statuses และ headers ไว้ ระบบจะถือว่า Response แคชได้ก็ต่อเมื่อเป็นไปตามเงื่อนไขทั้ง 2 ข้อ

    ฟังก์ชัน constructor มีรูปแบบดังนี้

    (config?: CacheableResponseOptions) => {...}

  • isResponseCacheable

    โมฆะ

    ตรวจสอบการตอบกลับเพื่อดูว่าสามารถแคชได้หรือไม่ โดยอิงตามข้อมูลนี้ ของออบเจ็กต์

    ฟังก์ชัน isResponseCacheable มีรูปแบบดังนี้

    (response: Response) => {...}

    • การตอบกลับ

      คำตอบ

      คำตอบที่กําลังตรวจสอบความสามารถในการแคช

    • returns

      บูลีน

      true หาก Response สามารถแคชได้ และ false หรือไม่เช่นนั้น

CacheableResponseOptions

พร็อพเพอร์ตี้

  • ส่วนหัว

    ออบเจ็กต์ ไม่บังคับ

  • สถานะ

    number[] ไม่บังคับ

CacheableResponsePlugin

คลาสที่ใช้ cacheWillUpdate Lifecycle Callback ซึ่งจะช่วยให้เพิ่มการตรวจสอบความสามารถในการแคชลงในคำขอที่ส่งผ่านกลยุทธ์ในตัวของ Workbox ได้ง่ายขึ้น

พร็อพเพอร์ตี้

  • เครื่องมือสร้าง

    โมฆะ

    ในการสร้างอินสแตนซ์ CacheableResponsePlugin ใหม่ คุณต้องระบุที่ พร็อพเพอร์ตี้ config อย่างน้อย 1 รายการ

    หากระบุทั้ง statuses และ headers ไว้ ทั้ง 2 เงื่อนไขจะต้อง ตรงกันเพื่อให้ Response พิจารณาว่าสามารถแคชได้

    ฟังก์ชัน constructor มีรูปแบบดังนี้

    (config: CacheableResponseOptions) => {...}