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

กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst

ใช้ Cache-First กับทรัพยากรสแตติกและ Network-First กับการตอบกลับจาก API โดยใช้ Cache API และไลบรารี Workbox

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

เหตุใดกลยุทธ์การเก็บแคชจึงสำคัญ

Service worker สามารถดักจับการดึงข้อมูลทุกครั้งได้ แต่คุณต้องมีกลยุทธ์ เนื้อหาแต่ละประเภทต้องใช้กฎต่างกัน โลโก้ควรเก็บไว้ใน cache ตลอดไป การตอบกลับจาก API ควรใหม่เสมอ และบทความข่าวเหมาะกับการแสดงข้อมูลเก่าพร้อมตรวจสอบใหม่

Cache API

Service worker ใช้ API ของ cache ซึ่งเป็นที่เก็บคู่ Request → Response แบบคีย์-ค่า แยกขอบเขตตามต้นทาง และคงอยู่ข้ามเซสชัน

// open a cache:
const cache = await caches.open('v1');

// add resources:
await cache.add('/styles.css');
await cache.addAll(['/', '/app.js', '/styles.css']);

// look up:
const response = await cache.match('/styles.css');

// delete:
await cache.delete('/styles.css');

ใช้ cache ก่อน

ตรวจสอบ cache ก่อน หากพบก็ส่งกลับ หากไม่พบ ให้เปลี่ยนไปใช้ network แล้วเก็บการตอบกลับไว้ใน cache เหมาะสำหรับ: ทรัพยากรคงที่ แบบอักษร โลโก้ และโครงแอป

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(cached => {
      if (cached) return cached;
      return fetch(event.request).then(res => {
        const clone = res.clone();
        caches.open('v1').then(c => c.put(event.request, clone));
        return res;
      });
    })
  );
});

ใช้ network ก่อน

ลองใช้ network ก่อน หากล้มเหลวเมื่อออฟไลน์ ให้เปลี่ยนไปใช้ cache เหมาะสำหรับ: การเรียก API และเนื้อหาแบบไดนามิกที่ความใหม่สำคัญกว่าความเร็ว

self.addEventListener('fetch', (event) => {
  event.respondWith(
    fetch(event.request).then(res => {
      const clone = res.clone();
      caches.open('api-v1').then(c => c.put(event.request, clone));
      return res;
    }).catch(() => caches.match(event.request))
  );
});

แสดงข้อมูลเก่าพร้อมตรวจสอบใหม่

ส่งข้อมูลจาก cache กลับทันทีเพื่อความเร็ว จากนั้นดึงข้อมูลใหม่ในเบื้องหลังและอัปเดต cache ไว้สำหรับครั้งถัดไป เหมาะสำหรับ: อวตาร บทความข่าว และข้อมูลที่ใหม่ในระดับหนึ่ง

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(cached => {
      const network = fetch(event.request).then(res => {
        caches.open('v1').then(c => c.put(event.request, res.clone()));
        return res;
      });
      return cached || network;
    })
  );
});

ใช้ network เท่านั้น

ข้าม cache ทั้งหมดและไปที่ network เสมอ ใช้สำหรับคำขอที่ไม่ควรเก็บใน cache เช่น จุดเชื่อมต่อการยืนยันตัวตน การวิเคราะห์ และการเปลี่ยนแปลงข้อมูล

self.addEventListener('fetch', (event) => {
  if (event.request.url.includes('/api/auth')) {
    event.respondWith(fetch(event.request));
    return;
  }
  // ... other strategies
});

ใช้ cache เท่านั้น

ไม่ไปที่ network เด็ดขาด ส่งข้อมูลจาก cache กลับหรือแสดงความล้มเหลว เหมาะสำหรับไฟล์ที่เตรียมไว้ใน cache ล่วงหน้าและไม่ต้องการรีเฟรชระหว่างเซสชัน

กลยุทธ์ของ Workbox

Workbox รวมกลยุทธ์ทั้งหมดไว้เป็นคลาสแบบระบุชื่อ จึงมีโค้ดพื้นฐานที่ต้องเขียนน้อยลง

import { registerRoute } from 'workbox-routing';
import { CacheFirst, NetworkFirst, StaleWhileRevalidate } from 'workbox-strategies';

registerRoute(({ request }) => request.destination === 'image',
  new CacheFirst({ cacheName: 'images' })
);

registerRoute(({ url }) => url.pathname.startsWith('/api/'),
  new NetworkFirst({ cacheName: 'api', networkTimeoutSeconds: 3 })
);

registerRoute(({ request }) => request.destination === 'document',
  new StaleWhileRevalidate({ cacheName: 'pages' })
);

การหมดอายุของ cache

cache จะเพิ่มขึ้นตลอดไปหากไม่กำหนดขีดจำกัด Workbox มี ExpirationPlugin ให้ใช้

import { ExpirationPlugin } from 'workbox-expiration';

new CacheFirst({
  cacheName: 'images',
  plugins: [new ExpirationPlugin({
    maxEntries: 50,
    maxAgeSeconds: 30 * 24 * 60 * 60 // 30 days
  })]
});

การตอบกลับที่เก็บใน cache ได้

ตามค่าเริ่มต้น เบราว์เซอร์จะเก็บไว้ใน cache เฉพาะการตอบกลับรหัส 200 ข้ามการตอบกลับรหัส 4xx, 5xx และแบบ opaque (ข้ามต้นทางโดยใช้ no-cors) เพื่อไม่ให้ cache เต็มไปด้วยข้อผิดพลาด

หน้าสำรองเมื่อออฟไลน์

แสดงหน้าออฟไลน์ที่เป็นมิตรเมื่อการนำทางล้มเหลว ซึ่งให้ประสบการณ์ผู้ใช้ดีกว่าข้อผิดพลาดเริ่มต้นของเบราว์เซอร์

self.addEventListener('install', (e) => {
  e.waitUntil(caches.open('offline').then(c => c.add('/offline.html')));
});

self.addEventListener('fetch', (e) => {
  if (e.request.mode === 'navigate') {
    e.respondWith(
      fetch(e.request).catch(() => caches.match('/offline.html'))
    );
  }
});

เลือกกลยุทธ์ที่เหมาะสม

ทรัพยากรคงที่ เช่น โลโก้ แบบอักษร และ CSS: ใช้ cache ก่อน ข้อมูล API เช่น โปรไฟล์ผู้ใช้และฟีด: ใช้ network ก่อน เนื้อหาที่ควรใหม่เป็นครั้งคราว เช่น อวตารและข่าว: แสดงข้อมูลเก่าพร้อมตรวจสอบใหม่ การยืนยันตัวตน: ใช้ network เท่านั้น ไฟล์คงที่ที่ติดตั้งไว้ล่วงหน้า: ใช้ cache เท่านั้น

ตรวจสอบอย่างรวดเร็ว

กลยุทธ์การเก็บแคชใดเหมาะที่สุดสำหรับไฟล์ CSS ที่ไม่ค่อยเปลี่ยนแปลงแต่ต้องโหลดได้รวดเร็ว

สรุป: กลยุทธ์การเก็บแคช

ใช้ cache ก่อน: ทรัพยากรคงที่ (เร็วที่สุด แต่อาจล้าสมัย) ใช้ network ก่อน: ข้อมูล API (ใหม่ที่สุด แต่ช้ากว่า) แสดงข้อมูลจาก cache แล้วดึงข้อมูลใหม่ในเบื้องหลัง ใช้ network เท่านั้น: การยืนยันตัวตนและการเปลี่ยนแปลงข้อมูล ใช้ cache เท่านั้น: โครงที่ติดตั้งไว้ล่วงหน้า ใช้ Workbox เพื่อลดโค้ดพื้นฐาน กำหนดขีดจำกัดการหมดอายุ เพิ่มหน้าสำรองเมื่อออฟไลน์ และเลือกกลยุทธ์ตามประเภททรัพยากร

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

บทเรียน “กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst”

ใช้ Cache-First กับทรัพยากรสแตติกและ Network-First กับการตอบกลับจาก API โดยใช้ Cache API และไลบรารี Workbox คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เว็บแอปแม니เฟสต์
  2. การลงทะเบียนและวงจรชีวิตของ Service Worker
  3. กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst
  4. การแจ้งเตือนแบบพุช
← กลับไปที่ Frontend Academy