Workbox

การบำรุงรักษา Service Worker และตรรกะพื้นที่เก็บข้อมูลแคชอาจเป็นเรื่องที่ท้าทายเมื่อ PWA ของคุณมีขนาดใหญ่ขึ้น Workbox คือชุดไลบรารีโอเพนซอร์สเพื่อช่วยในการทำงาน Workbox สรุป API ระดับล่าง เช่น Service Worker API และ Cache Storage API และแสดงอินเทอร์เฟซที่เป็นมิตรต่อนักพัฒนาซอฟต์แวร์มากขึ้น

งานที่ Google Ads ช่วยได้คือการจับคู่กลยุทธ์การแคชกับเส้นทาง (หรือรูปแบบการกำหนดเส้นทาง) การทำงานกับสตรีม และการใช้ฟีเจอร์ต่างๆ เช่น การซิงค์ในเบื้องหลังด้วยวิดีโอสำรองที่เหมาะสม

กล่องงานจะช่วยคุณจัดการการแคชและแสดงเนื้อหาได้ นอกจากนี้ยังเป็นไลบรารีที่ใช้กันมากที่สุดสำหรับ Service Worker ด้วย เว็บไซต์ในอุปกรณ์เคลื่อนที่ 54% ใช้ในเครื่องมือสร้างบิลด์และ CLI มากมาย ซึ่งรวมถึง Angular CLI, Create-React-App และ Vue CLI มีปลั๊กอินสำหรับไลบรารีและเฟรมเวิร์กอื่นๆ ส่วนใหญ่ด้วย เช่น Next.js

54%

เว็บไซต์บนอุปกรณ์เคลื่อนที่ที่มี Service Worker ใช้ไลบรารี Workbox

โมดูลกล่องงาน

กล่องงานมีไลบรารีหลายรายการที่เรียกว่าโมดูลภายใน โดยแต่ละโมดูลจะมุ่งเน้นที่การจัดการเนื้อหาและพฤติกรรมของโปรแกรมทำงานของบริการในแง่มุมที่แตกต่างกัน

โมดูล Workbox ทำงานในบริบทต่างๆ เช่น

  • ในบริบทของ Service Worker: คุณนำเข้าโมดูลที่ต้องการและใช้จากไฟล์ Service Worker ได้ เช่น เพื่อช่วยจัดการการแคชและแสดงไฟล์ด้วยกลยุทธ์ต่างๆ
  • ในบริบทหลักของ window: การช่วยลงทะเบียน Service Worker และสื่อสารกับผู้ปฏิบัติงาน
  • เป็นส่วนหนึ่งของระบบบิลด์ เช่น Webpack สำหรับวัตถุประสงค์ต่างๆ เช่น การสร้างไฟล์ Manifest ของเนื้อหา หรือแม้กระทั่งการสร้าง Service Worker ทั้งหมด

โมดูลยอดนิยมบางส่วนมีดังนี้

  • การกำหนดเส้นทางกล่องจดหมาย: เมื่อ Service Worker สกัดกั้นคำขอโมดูลนี้จะกำหนดเส้นทางคำขอเหล่านั้นไปยังฟังก์ชันอื่นที่มีการตอบกลับ เป็นการใช้งานตัวแฮนเดิลเหตุการณ์ fetch ตามที่ระบุไว้ในส่วนการแสดงโฆษณา
  • workbox-strategies: ชุดกลยุทธ์การแคชรันไทม์ที่จัดการการตอบกลับคําขอ เช่น แคชก่อนและเก่าเกินไปในระหว่างตรวจสอบความถูกต้องอีกครั้ง คือการใช้กลยุทธ์ต่างๆ ที่กล่าวถึงในส่วนการแสดงโฆษณา
  • การแคชล่วงหน้า: เป็นการใช้งานไฟล์การแคชในเครื่องจัดการเหตุการณ์ install ของโปรแกรมทำงานของบริการ (หรือที่เรียกว่าการแคชล่วงหน้า) ดังที่กล่าวไว้ในบทการแคช โมดูลนี้จะช่วยให้คุณแคชชุดไฟล์ไว้ล่วงหน้าได้อย่างง่ายดายและจัดการการอัปเดตเนื้อหาเหล่านั้นได้อย่างมีประสิทธิภาพ เราจะพูดถึงการอัปเดตเนื้อหาในส่วนเนื้อหาการอัปเดต
  • workbox-expiration: เป็นปลั๊กอินที่ใช้กับกลยุทธ์การแคชเพื่อนำคำขอที่แคชออกโดยพิจารณาจากจำนวนรายการในแคชหรือตามอายุของคำขอที่แคชไว้ ซึ่งจะช่วยจัดการแคชและจำกัดเวลาและจำนวนรายการในแคชแต่ละรายการ
  • workbox-window: ชุดโมดูลที่ตั้งใจจะทำงานในบริบทของหน้าต่าง ซึ่งก็คือภายในหน้าเว็บ PWA ของคุณ คุณสามารถลดความซับซ้อนของกระบวนการลงทะเบียนและการอัปเดตของ Service Worker และช่วยให้สื่อสารระหว่างโค้ดที่ทำงานในบริบทของ Service Worker กับบริบทหน้าต่างได้ง่ายขึ้น

การใช้ Workbox

Workbox มีวิธีต่างๆ ในการผสานรวมลงใน PWA คุณเลือกได้ว่ารายการใดเหมาะกับสถาปัตยกรรมของแอปมากที่สุด ดังนี้

  • Workbox CLI: ยูทิลิตีบรรทัดคำสั่งที่สร้าง Service Worker เต็มรูปแบบ แทรกไฟล์ Manifest ของแคชล่วงหน้า หรือคัดลอกไฟล์ Workbox ที่จำเป็น
  • Workbox Build: โมดูล npm ที่สร้าง Service Worker ที่สมบูรณ์ แทรกไฟล์ Manifest ของแคชล่วงหน้า และคัดลอกไฟล์ Workbox เป้าหมายนี้มีไว้เพื่อผสานรวมกับกระบวนการบิลด์ของคุณเอง
  • workbox-sw: วิธีโหลดแพ็กเกจ Service Workbox จาก CDN ที่ไม่ใช้กระบวนการบิลด์

Workbox CLI มีวิซาร์ดที่ช่วยคุณสร้างโปรแกรมทำงานของบริการ หากต้องการเรียกใช้วิซาร์ด ให้พิมพ์คำสั่งต่อไปนี้ในบรรทัดคำสั่ง

npx workbox-cli wizard

CLI ของ Workbox กำลังทำงานในเทอร์มินัล

การแคชและการแสดงผลด้วย Workbox

การใช้งานทั่วไปของ Workbox คือการใช้โมดูลการกำหนดเส้นทางและกลยุทธ์ร่วมกันเพื่อแคชและแสดงไฟล์

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

โมดูลการกำหนดเส้นทางกล่องงานช่วยจัดเรียงคำขอขาเข้าไปยัง Service Worker และจับคู่คำขอเหล่านั้นกับกลยุทธ์หรือฟังก์ชันการแคชเพื่อรับการตอบกลับสำหรับคำขอเหล่านั้น

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

ตัวอย่างโค้ดต่อไปนี้ใช้กลยุทธ์แรกที่แคช (ผ่านโมดูล CacheFirst) เพื่อแคชและแสดงการนำทางหน้าเว็บ

import { registerRoute } from 'workbox-routing';
import { CacheFirst } from 'workbox-strategies';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';

const pageStrategy = new CacheFirst({
  // Put all cached files in a cache named 'pages'
  cacheName: 'pages',
  plugins: [
    // Only requests that return with a 200 status are cached
    new CacheableResponsePlugin({
      statuses: [200],
    }),
  ],
});

ปลั๊กอินช่วยให้คุณสามารถใช้ประโยชน์จากวงจรการแคชและคำขอแก้ปัญหาของ Workbox ได้ ในตัวอย่างนี้ CacheableResponsePlugin ใช้เพื่อแคชเฉพาะคำขอที่ส่งผลให้เกิดสถานะ 200 เพื่อป้องกันไม่ให้บันทึกคำขอที่ไม่ถูกต้องไว้ในแคช

เมื่อสร้างกลยุทธ์แล้ว ก็ถึงเวลาลงทะเบียนเส้นทางเพื่อใช้กลยุทธ์ ตัวอย่างต่อไปนี้เรียกใช้ registerRoute() โดยการส่งออบเจ็กต์คำขอไปยัง Callback หาก request.mode คือ "navigate" ก็จะใช้กลยุทธ์ CacheFirst (ในที่นี้เรียกว่า pageStrategy) ที่กำหนดไว้ในตัวอย่างโค้ดก่อนหน้า

// Cache page navigations (HTML) with a Cache First strategy
registerRoute( ({ request }) => request.mode === 'navigate',
  pageStrategy );

อ่านเอกสาร Workbox เพื่อดูตัวอย่างและแนวทางปฏิบัติแนะนำเพิ่มเติม

สำรองแบบออฟไลน์

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

ในตัวอย่างนี้ การผสมผสานของ Workbox และ Cache Storage API จะทำให้มีวิดีโอสำรองแบบออฟไลน์โดยใช้กลยุทธ์แบบแคชเท่านั้น ก่อนอื่น ในระหว่างวงจรการติดตั้งของโปรแกรมทำงานของบริการ ระบบจะเปิดแคช offline-fallbacks และเพิ่มอาร์เรย์ของข้อมูลสำรองแบบออฟไลน์ลงในแคช

import { setCatchHandler } from 'workbox-routing';

// Warm the cache when the service worker installs
self.addEventListener('install', event => {
  const files = ['/offline.html']; // you can add more resources here
  event.waitUntil(
    self.caches.open('offline-fallbacks')
        .then(cache => cache.addAll(files))
  );
});

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

// Respond with the fallback if a route throws an error
setCatchHandler(async (options) => {
  const destination = options.request.destination;
  const cache = await self.caches.open('offline-fallbacks');
  if (destination === 'document') {
    return (await cache.match('/offline.html')) || Response.error();
  }
  return Response.error();
});

สูตรอาหาร

รูปแบบการกำหนดเส้นทางและการแคชหลายรูปแบบ เช่น การนำทางของ NetworkFirst และการสำรองแบบออฟไลน์ ถือเป็นรูปแบบที่พบได้ทั่วไปเพียงพอที่จะรวมเป็นสูตรอาหารที่นำมาใช้ใหม่ได้ เลือก Workbox-recipes ที่จะช่วยได้หากมีโซลูชันที่เหมาะกับสถาปัตยกรรมของคุณ โดยปกติแล้วจะเป็นโค้ด 1 บรรทัดที่คุณต้องเพิ่มลงในโค้ดของโปรแกรมทำงานของบริการ

การแคชและการอัปเดตเนื้อหา

การแคชเนื้อหายังเกี่ยวข้องกับการอัปเดตด้วย กล่องงานจะช่วยคุณอัปเดตเนื้อหาด้วยวิธีที่คุณคิดว่าดีที่สุด โดยอาจมีการอัปเดตอยู่เสมอหากมีการเปลี่ยนแปลงบนเซิร์ฟเวอร์ หรือรอจนกว่าคุณจะมีแอปเวอร์ชันใหม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับการอัปเดตได้ในส่วนการอัปเดต

เล่นกับกล่องงาน

คุณสามารถเล่น Workbox ได้ทันทีโดยใช้ Code Lab ต่อไปนี้

แหล่งข้อมูล