กลยุทธ์การแคชออฟไลน์: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เว็บแอปแม니เฟสต์
- การลงทะเบียนและวงจรชีวิตของ Service Worker
- กลยุทธ์การแคชออฟไลน์: CacheFirst และ NetworkFirst
- การแจ้งเตือนแบบพุช