การอัปเดต API แคชของ Service Worker

เราได้รับขอให้เขียนโพสต์นี้เกี่ยวกับการอัปเดตเล็กน้อยใน Service Worker Cache API เราคิดว่าเรื่องนี้ไม่น่าจะเขียนเป็นบทความแยกต่างหาก แต่หลังจากการโต้แย้งกันนานจนสุดท้ายต้องตัดสินด้วยการเล่นเกมปั่นแปะ ปรากฏว่าเราแพ้ ก็เลยได้บทความนี้มา

พร้อมที่จะฟังข้อมูลอัปเดตเกี่ยวกับการใช้งาน Service Worker Cache API ของ Chrome แล้วหรือยัง

เราได้ยินเสียงคุณไม่ชัด เราถามว่าคุณพร้อมที่จะฟังข้อมูลอัปเดตเกี่ยวกับการใช้งาน Service Worker Cache API ของ Chrome ไหม

(คุณอ่านต่อได้ก็ต่อเมื่อกระโดดขึ้นบนเก้าอี้แล้วตะโกนว่า "เย้" เท่านั้น การแกล้งทำท่าเหวี่ยงเชือกคล้องไปพร้อมๆ กันนั้นไม่บังคับ แต่เราขอแนะนำให้ทำ)

cache.addAll พร้อมใช้งานใน Chrome 46

ได้ ถูกต้อง แคช จุดเพิ่มทั้งหมด Chrome 46

โอเค โอเค เลิกพูดจาประชดประชันกัน เรื่องนี้เป็นเรื่องสำคัญมาก เนื่องจาก cache.addAll คือส่วนสุดท้ายที่เหลืออยู่ของ polyfill "สําคัญ" ของแคช ซึ่งหมายความว่าไม่จําเป็นต้องใช้อีกต่อไป

cache.addAll ทำงานดังนี้

// when the browser sees this SW for the first time
self.addEventListener('install', function(event) {
    // wait until the following promise resolves
    event.waitUntil(
    // open/create a cache named 'mysite-static-v1'
    caches.open('mysite-static-v1').then(function(cache) {
        // fetch and add this stuff to it
        return cache.addAll([
        '/',
        '/css/styles.css',
        '/js/script.js',
        '/imgs/cat-falls-over.gif'
        ]);
    })
    );
});

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

ตัวอย่างข้างต้นอยู่ใน Service Worker แต่คุณเข้าถึงแคช API จากหน้าเว็บได้อย่างเต็มที่เช่นกัน

Firefox รองรับ API นี้อยู่แล้วในรุ่นสำหรับนักพัฒนาซอฟต์แวร์ ดังนั้น API นี้จะพร้อมใช้งานพร้อมกับการติดตั้งใช้งาน Service Worker ที่เหลือ

แต่นั่นไม่ใช่ทั้งหมด ยังมีอีกหลายอย่างที่เราจะปรับปรุงแคชได้ในอนาคต

cache.matchAll กำลังจะเปิดตัวใน Chrome 47

ซึ่งจะช่วยให้คุณได้รับรายการที่ตรงกันหลายรายการ

caches.open('mysite-static-v1').then(function(cache) {
    return cache.matchAll('/');
}).then(function(responses) {
    // …
});

คำสั่งข้างต้นจะแสดงทุกอย่างใน mysite-static-v1 ที่ตรงกับ / แคชช่วยให้คุณมีรายการหลายรายการต่อ URL ได้หากแคชได้แบบอิสระ เช่น มีส่วนหัว Vary ต่างกัน

Firefox รองรับการดำเนินการนี้ในรุ่นสำหรับนักพัฒนาซอฟต์แวร์อยู่แล้ว ดังนั้นจึงจะพร้อมใช้งานพร้อมกับการใช้งาน Service Worker ที่เหลือ

ตัวเลือกการค้นหาแคชจะพร้อมใช้งานใน Chrome เร็วๆ นี้

ตัวแฮนเดิลการดึงข้อมูลมาตรฐานมีดังนี้

self.addEventListener('fetch', function(event) {
    event.respondWith(
    caches.match(event.request).then(function(response) {
        return response || fetch(event.request);
    })
    );
});

หากเราแคช / ไว้และได้รับคําขอ / ระบบจะแสดง / จากแคช อย่างไรก็ตาม หากเราได้รับคำขอสำหรับ /?utm_source=blahblahwhatever คำขอนั้นจะไม่มาจากแคช คุณแก้ปัญหานี้ได้ด้วยการละเว้นสตริงการค้นหา URL ขณะจับคู่ โดยทําดังนี้

self.addEventListener('fetch', function(event) {
    event.respondWith(
    caches.match(event.request, {
        ignoreSearch: true
    }).then(function(response) {
        return response || fetch(event.request);
    })
    );
});

ตอนนี้ /?utm_source=blahblahwhatever จะจับคู่กับรายการ / ตัวเลือกทั้งหมดมีดังนี้

  • ignoreSearch - ละเว้นส่วนการค้นหาของ URL ทั้งในส่วนอาร์กิวเมนต์คำขอและคำขอที่แคชไว้
  • ignoreMethod - ละเว้นเมธอดของอาร์กิวเมนต์คําขอ เพื่อให้คําขอ POST จับคู่กับรายการ GET ในแคชได้
  • ignoreVary - ละเว้นส่วนหัว Vary ในการตอบกลับที่แคชไว้

Firefox รองรับการดำเนินการนี้อยู่แล้วใน… คงไม่ต้องอธิบายแล้ว อย่าลืมไปบอก Ben Kelly ว่าเขายอดเยี่ยมเพียงใดที่ใส่ฟีเจอร์ทั้งหมดนี้ไว้ใน Firefox

หากต้องการติดตามการใช้งานตัวเลือกการค้นหาแคชของ Chrome โปรดไปที่ crbug.com/426309

แล้วพบกันใหม่ในบทถัดไปของ "สิ่งที่เราติดตั้งใช้งานในแคช API"