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

เจค อาร์ชิบาลด์
เจค อาร์ชิบาลด์

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

พร้อมรับฟังเรื่องการอัปเดตการใช้งาน API แคชของ Service Worker ของ Chrome ไหม

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

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

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

มี ถูกต้อง แคช! เพิ่มทั้งหมดเลย! Chrome 46

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

วิธีทำงานของ 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 และคำขอ แล้วดึงข้อมูล แล้วเพิ่มลงในแคช กระบวนการนี้หมายถึงธุรกรรม - หากการดึงข้อมูลหรือการเขียนล้มเหลว การดำเนินการทั้งหมดจะล้มเหลว และแคชจะกลับสู่สถานะก่อนหน้า ซึ่งมีประโยชน์อย่างยิ่งสำหรับการดำเนินการติดตั้งเช่นข้างต้น โดยที่ความล้มเหลว 1 ครั้งหมายถึงความล้มเหลวโดยรวม

ตัวอย่างข้างต้นอยู่ใน Service Worker แต่เข้าถึง Caches API ได้จากหน้าต่างๆ เช่นกัน

Firefox รองรับ 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 1 รายการ หากสามารถแคชได้อย่างอิสระ เช่น อาจมีส่วนหัว 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 - ไม่สนใจส่วนหัว "แตกต่าง" ในคำตอบที่แคชไว้

Firefox รองรับการทำงานแบบนี้อยู่แล้วใน... ตอนนี้คุณก็เข้าใจแล้วว่า ไปบอก Ben Kelly ได้เลยว่าเขาเก่งมากแค่ไหนในการทำให้เรื่องเหล่านี้ลงใน Firefox

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

พบกันใหม่คราวหน้าสำหรับบทใหม่ที่น่าตื่นเต้นของ "สิ่งที่เรานำมาใช้ใน Cache API"