ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã§å埩åã®ããåéå¯èœãªããŠã³ããŒããå®çŸããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãBackground Fetch APIãService WorkerããããŠãããã¯ãŒã¯äžææã§ãã·ãŒã ã¬ã¹ãªå€§å®¹éãã¡ã€ã«è»¢éãå®çŸããå®è·µçãªå®è£ æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã
ããã³ããšã³ãã®ããã¯ã°ã©ãŠã³ããã§ããããã¹ã¿ãŒããïŒå埩åã®ããåéå¯èœãªããŠã³ããŒãã®æ§ç¯
ãŸããŸãæ¥ç¶æ§ãé«ãŸãäžçã«ãããŠããŠã§ãã¯ãã¯ãåãªãéçãªããã¥ã¡ã³ãã®ããã®å Žæã§ã¯ãããŸãããé«è§£å床ã®ãããªã³ã³ãã³ãããè€éãªããžãã¹ãœãããŠã§ã¢ãæ²¡å ¥åã®ã²ãŒã ãŸã§ããããããã®ãæäŸãããªããã§ã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã®ãã©ãããã©ãŒã ãšãªã£ãŠããŸãããã®é²åã¯ãäžçäžã®éçºè ãçŽé¢ããªããã°ãªããªãé倧ãªèª²é¡ããããããŸããããã¯ããã°ãã°ä¿¡é Œæ§ãäœããããã¯ãŒã¯äžã§å€§å®¹éãã¡ã€ã«ã確å®ã«è»¢éããããšã§ãããœãŠã«ã®éå€é»è»ã«ä¹ã£ãŠãããŠãŒã¶ãŒãåç±³ã®èŸ²æéšã«ããåŠçããããã¯ããã€ã®äžå®å®ãªããã«ã®Wi-Fiæ¥ç¶ãå©çšããŠããå°éå®¶ã§ãããæ¥ç¶ãåããããšã¯ããŠã³ããŒãã®å€±æããŠãŒã¶ãŒã®äžæºããããŠå£ããäœéšãæå³ããŸããããã§ãBackground Fetch APIãç»æçãªè§£æ±ºçãšããŠç»å ŽããŸãã
`fetch()`ã`XMLHttpRequest`ãšãã£ãåŸæ¥ã®æ¹æ³ã¯åŒ·åã§ãããæ¬è³ªçã«ãŠã§ãããŒãžã®ã©ã€ããµã€ã¯ã«ã«çžãããŠããŸãããŠãŒã¶ãŒãã¿ããéããããå¥ã®ããŒãžã«ç§»åããããããšãããŠã³ããŒãã¯äžæãããŸããããŒãžã®ã»ãã·ã§ã³ãè¶ ããŠåç¶ããããã®çµã¿èŸŒã¿ã¡ã«ããºã ã¯ãããŸãããBackground Fetch APIã¯ããã®ãã©ãã€ã ãæ ¹æ¬çã«å€ããŸããããã«ããããŠã§ãã¢ããªã±ãŒã·ã§ã³ã¯å€§èŠæš¡ãªããŠã³ããŒãïŒããã³ã¢ããããŒãïŒã¿ã¹ã¯ããã©ãŠã¶èªäœã«åŒãæž¡ãããšãã§ããŸãããã©ãŠã¶ã¯ãã®åŸãåäžã®ãã©ãŠã¶ã¿ããšã¯ç¬ç«ããŠãããã¯ã°ã©ãŠã³ãã§è»¢éã管çããŸããããã¯ããŠãŒã¶ãŒãããŒãžãéããŠãããŠã³ããŒããç¶ç¶ã§ããããšãæå³ããããã«éèŠãªããšã«ããããã¯ãŒã¯æ¥ç¶ãå€åãããšãã«èªåçã«äžæåæ¢ããã³åéã§ããããšãæå³ããŸããããã¯ããŠã§ãäžã§çã«å埩åã®ããããã€ãã£ãã®ãããªããŠã³ããŒãäœéšãæ§ç¯ããããã®éµãšãªããŸãã
Background Fetch APIãšã¯ïŒã°ããŒãã«ãªèŠç¹ãã
ãã®æ žå¿ã«ãããŠãBackground Fetch APIã¯ãå€§èŠæš¡ãªãããã¯ãŒã¯ãªã¯ãšã¹ãããã©ãŠã¶ã®ãšã³ãžã³ã«å§ä»»ããããã«èšèšãããçŸä»£ã®ãŠã§ãæšæºã§ããããã«ãããéçºè ã¯ã¢ããªã±ãŒã·ã§ã³ã®å¯èŠãŠã£ã³ããŠã®å¯¿åœãè¶ ããŠæç¶ããããŠã³ããŒããã¢ããããŒããéå§ã§ããŸããããã¯åãªãå°ããªå©äŸ¿æ§ã§ã¯ãªããããå ç¢ã§é«æ©èœãªãŠã§ãã®ããã®åºç€æè¡ã§ãã
ã°ããŒãã«ãªèгç¹ãããã®åœ±é¿ãèããŠã¿ãŸããããäžçã®å€ãã®å°åã§ã¯ãé«éã§å®å®ããã€ã³ã¿ãŒãããã¯èŽ æ²¢åã§ãããåœããåã®ãã®ã§ã¯ãããŸãããã¢ãã€ã«ããŒã¿ã¯é«äŸ¡ã§åŸéå¶ã®å ŽåããããŸããã¢ããªã±ãŒã·ã§ã³ãçã«ã°ããŒãã«ã§ããããã«ã¯ããããã®å€æ§ãªãããã¯ãŒã¯ç¶æ³ãèæ ®ããå¿ èŠããããŸããããã¯ã°ã©ãŠã³ããã§ããã¯ãå ¬å¹³æ§ãå¯èœã«ããæè¡ã§ããããã«ãããæç¶çãªæ¥ç¶ãããªãå°åã®ãŠãŒã¶ãŒã§ããæè²ãããªãéèŠãªãœãããŠã§ã¢ã¢ããããŒãã®ããŠã³ããŒããéå§ããæ¥ç¶ãèš±ãéãããã¯ã°ã©ãŠã³ãã§å®äºããããšãä¿¡é Œã§ãã倱æãããã¡ã€ã«ã®åããŠã³ããŒãã«è²ŽéãªããŒã¿ãç¡é§ã«ããããšããããŸããã
ããã¯ã°ã©ãŠã³ããã§ããã®äž»ãªå©ç¹
- å埩åãšåé: ãããæå€§ã®ç¹åŸŽã§ãããã©ãŠã¶ã®åºç€ãšãªãããŠã³ããŒããããŒãžã£ãŒãããããã¯ãŒã¯ã®äžæãé©åã«åŠçããŸããæ¥ç¶ã倱ããããšããŠã³ããŒãã¯äžæåæ¢ãããæ¥ç¶ãå埩ãããšãäžæãããšããããèªåçã«åéãããŸããããã¯ãHTTPã®`Range`ããããŒãåŠçããããã®è€éãªJavaScriptããžãã¯ãå¿ èŠãšããã«è¡ãããŸãã
- ãªãã©ã€ã³æç¶æ§: ããŠã³ããŒãã¯ãã©ãŠã¶ã®ããã»ã¹ã«ãã£ãŠç®¡çãããService Workerã«ãã£ãŠåŠçããããããéããŠããã¿ãã«çžãããŸããããŠãŒã¶ãŒã¯ããŠã³ããŒããéå§ããã©ããããããéããå®¶ã«åž°ããåã³éããšãããŠã³ããŒããå®äºãŸãã¯é²è¡ããŠããã®ãèŠã€ããããšãã§ããŸãã
- ãªãœãŒã¹å¹ç: ãã©ãŠã¶ã¯ãªãœãŒã¹äœ¿çšéãæé©åããã®ã«æé©ãªç«å Žã«ãããŸããWi-Fiæ¥ç¶ãå©çšããŠè»¢éãã¹ã±ãžã¥ãŒã«ããã¢ãã€ã«ããŒã¿ãç¯çŽããããã»ã¹ã管çããŠããããªãŒå¯¿åœãæé©åã§ããŸããããã¯äžçäžã®ã¢ãã€ã«ãŠãŒã¶ãŒã«ãšã£ãŠéèŠãªæžå¿µäºé ã§ãã
- çµ±åããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹: ãã©ãŠã¶ã¯ãé²è¡äžã®ããŠã³ããŒãã«å¯ŸããŠãã€ãã£ããªã·ã¹ãã ã¬ãã«ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæäŸã§ããŸãããŠãŒã¶ãŒã¯ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ããã®ããŠã³ããŒãã管çããã®ãšåãå Žæã§ããããã®ãŠã§ãããŠã³ããŒãã衚瀺ããã³ç®¡çã§ããã·ãŒã ã¬ã¹ã§äœ¿ãæ £ããäœéšãçã¿åºããŸããããã«ã¯ã鲿ãå®äºã倱æã«é¢ããéç¥ãå«ãŸããŸãã
äž»èŠã³ã³ããŒãã³ãïŒService WorkerãšBackgroundFetchManager
ããã¯ã°ã©ãŠã³ããã§ãããçè§£ããããã«ã¯ããŸããã®2ã€ã®äž»èŠãªã³ã³ããŒãã³ãã«ç²ŸéããŠããå¿ èŠããããŸãããããã¯é£æºããŠåäœããŸããäžæ¹ããŠã§ãããŒãžãããªã¯ãšã¹ããéå§ããããäžæ¹ãããã¯ã°ã©ãŠã³ãã§çµæã管çããŸãã
çžã®äžã®åæã¡ïŒService Worker
Service Workerã¯Web Workerã®äžçš®ã§ãæ¬è³ªçã«ã¯ãã©ãŠã¶ãããã¯ã°ã©ãŠã³ãã§å®è¡ããJavaScriptã¹ã¯ãªããã§ãããã©ã®ãŠã§ãããŒãžãããå®å šã«åé¢ãããŠããŸããããã°ã©ã å¯èœãªãããã¯ãŒã¯ãããã·ãšããŠæ©èœãããããã¯ãŒã¯ãªã¯ãšã¹ããååããŠåŠçãããã£ãã·ã¥ã管çããããã·ã¥éç¥ãæå¹ã«ããŸããç¬ç«ããŠå®è¡ãããããããŠã§ããµã€ãããã©ãŠã¶ã®ã¿ãã§éãããŠããªããšãã§ãã¿ã¹ã¯ãå®è¡ã§ããŸããããã¯ã°ã©ãŠã³ããã§ããã«ãããŠãService Workerã¯ããŠã³ããŒãã®æçµçãªæåãŸãã¯å€±æããªãã¹ã³ããçµæã®ãã¡ã€ã«ãåŠçããUIãæŽæ°ãããããªãã©ã€ã³ã§äœ¿çšããããã«ã¢ã»ããããã£ãã·ã¥ãããããæ°žç¶çãªç°å¢ã§ãã
ææ®è ïŒThe BackgroundFetchManager
`BackgroundFetchManager`ã¯ãã¡ã€ã³ã®ãŠã§ãããŒãžã®JavaScriptããã¢ã¯ã»ã¹ã§ããã€ã³ã¿ãŒãã§ãŒã¹ã§ãããã¯ã°ã©ãŠã³ããã§ãããéå§ã»èšå®ããããã«äœ¿çšããŸããService Workerã®ç»é²ãªããžã§ã¯ããä»ããŠã¢ã¯ã»ã¹ããŸãïŒ`navigator.serviceWorker.ready.then(swReg => swReg.backgroundFetch)`ããã®äž»èŠãªã¡ãœããã¯`fetch()`ã§ãIDãããŠã³ããŒããããã¡ã€ã«ã®ãªã¹ããããã³äžé£ã®ãªãã·ã§ã³ãåŒæ°ã«åããŸãããã®ã¡ãœãããã¹ã¿ãŒãã®åå³ã§ãããããåŒã³åºããšããã©ãŠã¶ãåŠçãåŒãç¶ããService Workerã¯ãŽãŒã«ã©ã€ã³ã§åŸ æ©ããŸãã
å®è·µçãªã¹ããããã€ã¹ãããå®è£ ã¬ã€ã
倧ããªåç»ãã¡ã€ã«ã®ããã«åéå¯èœãªããŠã³ããŒããå®è£ ããããã»ã¹ãèŠãŠãããŸãããããã®äŸã¯ãç±³åœã®ã¡ãã£ã¢ãã©ãããã©ãŒã ãã€ã³ãã®eã©ãŒãã³ã°ãµã€ãããã€ãã®äŒæ¥ç ä¿®ããŒã¿ã«ãªã©ãæ®éçã«é©çšå¯èœã§ãã
ã¹ããã1ïŒãã©ãŠã¶ã®ãµããŒãç¶æ³ã確èªãã
äœããããŸãããŠãŒã¶ãŒã®ãã©ãŠã¶ãBackground Fetch APIããµããŒãããŠããããšã確èªããå¿ èŠããããŸããããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããšããŠç¥ããããã®å®è·µã¯ãæå ç«¯ã®æ©èœãåŸãããªããŠãããã¹ãŠã®ãŠãŒã¶ãŒã«æ©èœçãªäœéšãä¿èšŒããŸãã
ã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã¹ã¯ãªããã§ã`BackgroundFetchManager`ã®ååšã確èªããŸãïŒ
if ('BackgroundFetchManager' in self) { // APIããµããŒããããŠããã®ã§ã匷åãããããŠã³ããŒããã¿ã³ã衚瀺ã§ãã } else { // APIããµããŒããããŠããªãã®ã§ããã©ãŒã«ããã¯ïŒäŸïŒæšæºã®ãªã³ã¯ïŒãæäŸãã }
ã¹ããã2ïŒService Workerãç»é²ãã
ããã¯ã°ã©ãŠã³ããã§ããã¯åºæ¬çã«Service Workerã«äŸåããŠããŸããããã°ã¬ãã·ããŠã§ãã¢ããªïŒPWAïŒçšã«ãŸã æã£ãŠããªãå Žåã¯ãäœæããŠç»é²ããå¿ èŠããããŸãããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«`service-worker.js`ãšããååã®ãã¡ã€ã«ãäœæããŸããæ¬¡ã«ãã¡ã€ã³ã®JavaScriptãã¡ã€ã«ããç»é²ããŸãïŒ
async function registerServiceWorker() { if ('serviceWorker' in navigator) { try { const registration = await navigator.serviceWorker.register('/service-worker.js'); console.log('Service Worker registered successfully:', registration); } catch (error) { console.error('Service Worker registration failed:', error); } } } registerServiceWorker();
ã¹ããã3ïŒããã³ããšã³ãããããã¯ã°ã©ãŠã³ããã§ãããéå§ãã
ã§ã¯ããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšãã«ããŠã³ããŒããéå§ãã颿°ãäœæããŸãããããã®é¢æ°ã¯ã¢ã¯ãã£ããªService Workerã®ç»é²ãååŸãã`backgroundFetch.fetch()`ãåŒã³åºããŸãã
const downloadVideoButton = document.getElementById('download-video-btn'); downloadVideoButton.addEventListener('click', async () => { try { // Service Workerã®ç»é²ãååŸãã const swReg = await navigator.serviceWorker.ready; // ããŠã³ããŒãã®è©³çްãå®çŸ©ãã const videoUrl = '/assets/large-course-video.mp4'; const videoFileSize = 250 * 1024 * 1024; // 250 MB // ããã¯ã°ã©ãŠã³ããã§ãããéå§ãã const bgFetch = await swReg.backgroundFetch.fetch('course-video-download-01', [videoUrl], { title: 'ã¢ãžã¥ãŒã«1ïŒWebéçºå ¥é', icons: [{ sizes: '192x192', src: '/images/icons/icon-192.png', type: 'image/png', }], downloadTotal: videoFileSize, } ); console.log('Background Fetch started:', bgFetch); } catch (error) { console.error('Could not start Background Fetch:', error); } });
`swReg.backgroundFetch.fetch()`ã®ãã©ã¡ãŒã¿ãåè§£ããŠã¿ãŸãããïŒ
- ID (`'course-video-download-01'`): ãã®ç¹å®ã®ããŠã³ããŒããžã§ãã®ããã®äžæã®æååèå¥åãåŸã§ãã®ãžã§ããåç §ããããã«ãã®IDã䜿çšããŸãã
- ãªã¯ãšã¹ã (`[videoUrl]`): ãã§ããããURLã®é åãåäžã®ã°ã«ãŒãåããããžã§ãã§è€æ°ã®ãã¡ã€ã«ãããŠã³ããŒãã§ããŸãã
- ãªãã·ã§ã³ (`{...}`): ããŠã³ããŒããèšå®ããããã®ãªããžã§ã¯ãã`title`ãš`icons`ã¯ããã©ãŠã¶ããã€ãã£ãUIéç¥ãäœæããããã«äœ¿çšãããŸãã`downloadTotal`ã¯ããã¹ãŠã®ãã¡ã€ã«ãåãããäºæ³åèšãµã€ãºïŒãã€ãåäœïŒã§ãããããæäŸããããšã¯ããã©ãŠã¶ãæ£ç¢ºãªããã°ã¬ã¹ããŒã衚瀺ããããã«éèŠã§ãã
ã¹ããã4ïŒService Workerã§ã€ãã³ããåŠçãã
ããŠã³ããŒãããã©ãŠã¶ã«åŒãæž¡ããããšãããã³ããšã³ãã®ã³ãŒãã®ä»äºã¯äžæŠå®äºã§ããæ®ãã®ããžãã¯ã¯`service-worker.js`ã«ããããžã§ããå®äºãŸãã¯å€±æãããšãã«ãã©ãŠã¶ã«ãã£ãŠèµ·åãããŸãã
`backgroundfetchsuccess`ãš`backgroundfetchfail`ãšãã2ã€ã®éèŠãªã€ãã³ãããªãã¹ã³ããå¿ èŠããããŸãã
// service-worker.jså self.addEventListener('backgroundfetchsuccess', (event) => { const bgFetch = event.registration; event.waitUntil(async function () { console.log(`ããã¯ã°ã©ãŠã³ããã§ãã '${bgFetch.id}' ã¯æ£åžžã«å®äºããŸããã`); // ããŠã³ããŒããããã¡ã€ã«ãä¿åãããã£ãã·ã¥ãéã const cache = await caches.open('downloaded-assets-v1'); // ããŠã³ããŒãããããã¹ãŠã®ãã¡ã€ã«ã¬ã³ãŒããååŸãã const records = await bgFetch.matchAll(); // åã¬ã³ãŒãã«ã€ããŠãã¬ã¹ãã³ã¹ããã£ãã·ã¥ã«ä¿åãã const promises = records.map(async (record) => { const response = record.response.clone(); await cache.put(record.request, response); }); await Promise.all(promises); // ãªãã·ã§ã³ïŒããŠã³ããŒãéç¥ã®UIã¿ã€ãã«ãæŽæ°ãã await event.updateUI({ title: 'ããŠã³ããŒããå®äºããæºåãã§ããŸããïŒ' }); }()); }); self.addEventListener('backgroundfetchfail', (event) => { const bgFetch = event.registration; console.error(`ããã¯ã°ã©ãŠã³ããã§ãã '${bgFetch.id}' ã¯å€±æããŸããã`); // ãªãã·ã§ã³ïŒå€±æãåæ ããããã«UIãæŽæ°ãã event.updateUI({ title: 'ããŠã³ããŒãã«å€±æããŸãããããäžåºŠã詊ããã ããã' }); });
æåãã³ãã©ã§ã¯ãCache Storageãéãã`bgFetch.matchAll()`ã䜿çšããŠããŠã³ããŒãããããã¹ãŠã®ãã¡ã€ã«ãååŸããããããããã£ãã·ã¥ã«å ¥ããŸããããã«ããããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ãããªããªãã©ã€ã³åçã§ããããã«ãªããŸãã
ã¹ããã5ïŒé²æã®ç£èŠãšãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³
åªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã¯ããã£ãŒãããã¯ã®æäŸãäžå¯æ¬ ã§ãããŠãŒã¶ãŒããã©ãŠã¶ã«ãã£ãŠæäŸãããããŠã³ããŒãéç¥ãã¯ãªãã¯ãããšããã¢ããªã±ãŒã·ã§ã³ã®é¢é£ããŒãžã«ç§»åãããã¹ãã§ããããã¯Service Workerã®`backgroundfetchclick`ã€ãã³ãã§åŠçããŸãã
// service-worker.jså self.addEventListener('backgroundfetchclick', (event) => { const bgFetch = event.registration; if (bgFetch.id === 'course-video-download-01') { event.waitUntil( clients.openWindow('/downloads') ); } });
ãã®ã³ãŒãã¯ããŠãŒã¶ãŒããã®ç¹å®ã®ããŠã³ããŒããžã§ãã®éç¥ãã¯ãªãã¯ãããšãã«ããŠã§ããµã€ãã®`/downloads`ããŒãžãéããããã©ãŠã¶ã«æç€ºããŸãããã®ããŒãžã§ã¯ãããŠã³ããŒãã®é²æç¶æ³ãå®äºããããŠã³ããŒãã®ãªã¹ãã衚瀺ã§ããŸãã
åéã®éæ³ïŒå®éã®ä»çµã¿ã¯ïŒ
ããã¯ã°ã©ãŠã³ããã§ããã®æã匷åã§ãããããæã誀解ãããŠããåŽé¢ã¯ããã®èªååéæ©èœã§ããç¹å¥ãªã³ãŒããäœãæžããã«ãã©ã®ããã«æ©èœããã®ã§ããããïŒ
ãã®çãã¯ã責任ãé«åºŠã«æé©åãããã·ã¹ãã ã¬ãã«ã®ããã»ã¹ãã€ãŸããã©ãŠã¶èªèº«ã®ããŠã³ããŒããããŒãžã£ãŒã«å§ä»»ããããã§ããããã¯ã°ã©ãŠã³ããã§ãããéå§ãããšããããªãã¯ãããã¯ãŒã¯äžã®ãã€ããçŽæ¥ç®¡çããŠããããã§ã¯ãããŸããããã©ãŠã¶ã管çããŠããã®ã§ãã
ãããã¯ãŒã¯äžææã®ã€ãã³ãã®ã·ãŒã±ã³ã¹ã¯æ¬¡ã®ãšããã§ãïŒ
- ãŠãŒã¶ãŒããã¡ã€ã«ãããŠã³ããŒãäžã«ãããã€ã¹ã®ãããã¯ãŒã¯æ¥ç¶ã倱ãããŸãïŒäŸïŒãã³ãã«ã«å ¥ãïŒã
- ãã©ãŠã¶ã®ããŠã³ããŒããããŒãžã£ãŒããããã¯ãŒã¯ã®éå®³ãæ€åºãã転éãé©åã«äžæåæ¢ããŸããæ£åžžã«åä¿¡ããããã€ãæ°ãèšé²ããŠãããŸãã
- ãã®åŸããŠãŒã¶ãŒã®ããã€ã¹ããããã¯ãŒã¯æ¥ç¶ãå埩ããŸãã
- ãã©ãŠã¶ã¯èªåçã«ããŠã³ããŒãã®åéã詊ã¿ãŸããåããã¡ã€ã«ã«å¯ŸããŠãµãŒããŒã«æ°ããHTTPãªã¯ãšã¹ããéä¿¡ããŸãããä»åã¯`Range`ããããŒãå«ããŸããããã¯å®è³ªçã«ãµãŒããŒã«ãæåã®'X'ãã€ãã¯æ¢ã«æã£ãŠããŸãããã€ã'X+1'ããæ®ããéã£ãŠãã ããããšäŒããŸãã
- æ£ããèšå®ããããµãŒããŒã¯ã`206 Partial Content`ã¹ããŒã¿ã¹ã§å¿çãããã¡ã€ã«ã®æ®ãã®éšåã®ã¹ããªãŒãã³ã°ãéå§ããŸãã
- ãã©ãŠã¶ã¯ããã®æ°ããããŒã¿ãéšåçã«ããŠã³ããŒãããããã¡ã€ã«ã«è¿œå ããŸãã
ãã®ããã»ã¹å šäœã¯ãããªãã®JavaScriptã³ãŒãããã¯ééçã§ããService Workerã¯ããã¡ã€ã«ãå®å šã«ããŠã³ããŒããããŠæ£åžžã«çµåãããããããã»ã¹ãèŽåœçã«å€±æããå ŽåïŒäŸïŒãã¡ã€ã«ããµãŒããŒäžã«ååšããªããªã£ãå ŽåïŒã«ã®ã¿ãæåŸã«éç¥ãããŸãããã®æœè±¡åã¯éåžžã«åŒ·åã§ãéçºè ãè€éã§å£ããããããŠã³ããŒãåéããžãã¯ã®æ§ç¯ããè§£æŸããŸãã
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®é«åºŠãªæŠå¿µãšãã¹ããã©ã¯ãã£ã¹
æ£ç¢ºãª`downloadTotal`ã®æäŸ
`downloadTotal`ãªãã·ã§ã³ã¯ãåãªããããã°è¯ãã以äžã®ãã®ã§ããããããªããšããã©ãŠã¶ã¯äžç¢ºå®ãªé²æã€ã³ãžã±ãŒã¿ïŒäŸïŒå転ããã¢ã€ã³ã³ïŒãã衚瀺ã§ããŸããããããããã°ãæ£ç¢ºãªããã°ã¬ã¹ããŒã衚瀺ããæšå®æ®ãæéãèšç®ã§ããŸããããã«ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããŸãããã®å€ãååŸããã«ã¯ãäºåã«ãã¡ã€ã«ã®URLã«å¯ŸããŠ`HEAD`ãªã¯ãšã¹ããè¡ãã`Content-Length`ããããŒã確èªããããAPIãã¡ã¿ããŒã¿ã®äžéšãšããŠãã¡ã€ã«ãµã€ãºãæäŸããå¿ èŠããããŸãã
åäžãã§ããã§ã®è€æ°ãã¡ã€ã«ã®ç®¡ç
ãã®APIã¯ãé¢é£ããã¢ã»ãããã°ã«ãŒãåãããšãã«ç䟡ãçºæ®ããŸãããŠãŒã¶ãŒããã©ãã®ã£ã©ãªãŒããœãããŠã§ã¢ããã±ãŒãžãšãã®ããã¥ã¡ã³ãããŸãã¯ãã¹ãŠã®ãã¯ã¹ãã£ãšãªãŒãã£ãªãã¡ã€ã«ãå«ããããªã²ãŒã ã®ã¬ãã«ãããŠã³ããŒãããå Žé¢ãæ³åããŠã¿ãŠãã ããã`backgroundFetch.fetch()`ã«URLã®é åãæž¡ãããšãã§ããŸããããã¯ãã©ãŠã¶ã«ãã£ãŠåäžã®ååçãªãžã§ããšããŠæ±ããããã³ãã«å šäœã«å¯ŸããŠ1ã€ã®éç¥ãš1ã€ã®ããã°ã¬ã¹ããŒã衚瀺ãããŸãã`backgroundfetchsuccess`ãã³ãã©ã§ã¯ã`bgFetch.matchAll()`ãã¬ã³ãŒãã®é åãè¿ããããããåå¥ã«åŠçã§ããŸãã
ãšã©ãŒåŠçãšå€±æã·ããªãª
ããŠã³ããŒãã¯å€ãã®çç±ã§å€±æããå¯èœæ§ããããŸãïŒãµãŒããŒã404ãšã©ãŒãè¿ãããŠãŒã¶ãŒã®ãã£ã¹ã¯å®¹éãäžè¶³ããããŸãã¯ãŠãŒã¶ãŒããã©ãŠã¶ã®UIããæåã§ããŠã³ããŒãããã£ã³ã»ã«ãããªã©ã§ãã`backgroundfetchfail`ã€ãã³ããã³ãã©ã¯ã»ãŒããã£ãããã§ããããã䜿çšããŠãéšåçãªããŒã¿ãã¯ãªãŒã³ã¢ããããã¢ããªã±ãŒã·ã§ã³å ã§ãŠãŒã¶ãŒã«éç¥ããå Žåã«ãã£ãŠã¯å詊è¡ãã¿ã³ãæäŸã§ããŸãã倱æãèµ·ããããããšãçè§£ããããšããå ç¢ãªã·ã¹ãã ãæ§ç¯ããããã®éµã§ãã
Cache APIã«ããããŠã³ããŒãæžã¿ã¢ã»ããã®ä¿å
ããŠã³ããŒãããããŠã§ãã¢ã»ãããä¿åããããã®æãäžè¬çã§å¹æçãªå Žæã¯ãCache APIã§ããããã¯ã`Request`ãªããžã§ã¯ããš`Response`ãªããžã§ã¯ãå°çšã«èšèšãããã¹ãã¬ãŒãžã¡ã«ããºã ã§ããããŠã³ããŒããããã¡ã€ã«ããã£ãã·ã¥ã«é 眮ããããšã§ãåŸã§ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ããããšãããšãã«Service WorkerããçŽæ¥æäŸã§ããã¢ããªã±ãŒã·ã§ã³ãçã«ãªãã©ã€ã³å¯Ÿå¿ã«ããããšãã§ããŸãã
ããŸããŸãªæ¥çã§ã®ãŠãŒã¹ã±ãŒã¹
ããã¯ã°ã©ãŠã³ããã§ããã®å¿çšç¯å²ã¯åºå€§ã§ãæ°å€ãã®ã°ããŒãã«ãªç£æ¥ã«ãŸããã£ãŠããŸãïŒ
- ã¡ãã£ã¢ïŒãšã³ã¿ãŒãã€ã¡ã³ã: ãŠã§ãããŒã¹ã®ã¹ããªãŒãã³ã°ãµãŒãã¹ã¯ãªãã©ã€ã³ã¢ãŒããæäŸã§ããã©ã®åœã®ãŠãŒã¶ãŒã§ãããã€ãã£ãã¢ããªã®ã«ãŠã³ã¿ãŒããŒããšåæ§ã«ããã©ã€ããéå€ã®ããã«æ ç»ã鳿¥œãããŠã³ããŒãã§ããŸãã
- æè²ïŒeã©ãŒãã³ã°: ã¢ããªã«ã®å€§åŠã¯ãåŠçã倧ããªãããªè¬çŸ©ãã€ã³ã¿ã©ã¯ãã£ããªã³ãŒã¹ææãããŠã³ããŒãããããã®ãŠã§ãããŒã¿ã«ãæäŸã§ããèªå® ã®ã€ã³ã¿ãŒãããç°å¢ãæªãåŠçã§ãæè²ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
- äŒæ¥ïŒãã£ãŒã«ããµãŒãã¹: ã°ããŒãã«ãªè£œé äŒç€Ÿã¯ãçŸå Žã®ãšã³ãžãã¢ã«PWAãæäŸããã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ã®ãªãé éå°ã«åããåã«ãæ©æ¢°ã®å·šå€§ãª3Dåè·¯å³ãæè¡ããã¥ã¢ã«ãããŠã³ããŒããããããšãã§ããŸãã
- æ è¡ïŒèгå : æ è¡ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒãç®çå°ã®ãªãã©ã€ã³ããããã·ãã£ã¬ã€ãããã±ããæ å ±ãããŠã³ããŒãã§ããããã«ããé«äŸ¡ãªåœéããŒã¿ããŒãã³ã°æéãã圌ããæããŸãã
ãã©ãŠã¶ã®äºææ§ãšå°æ¥ã®å±æ
ãã®èšäºã®å·çæç¹ã§ã¯ãBackground Fetch APIã¯äž»ã«Google ChromeãMicrosoft Edgeãªã©ã®ChromiumããŒã¹ã®ãã©ãŠã¶ã§ãµããŒããããŠããŸããCanIUse.comãMDN Web Docsãªã©ã®ãªãœãŒã¹ã§ææ°ã®äºææ§æ å ±ã確èªããããšãéèŠã§ãããŸã æ®éçã«æ¡çšãããŠããããã§ã¯ãããŸããããäž»èŠãªãã©ãŠã¶ã§ã®ãã®ååšã¯å€§ããªåé²ã瀺ããŠããŸãããŠã§ããã©ãããã©ãŒã ãé²åãç¶ããã«ã€ããŠããã®ãããªAPIã¯ãŠã§ããšãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®éã®æ©èœã®ã£ãããåããæ°äžä»£ã®åŒ·åã§ãå埩åããããã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªPWAãžã®éãéããŠããŸãã
çµè«ïŒãã¹ãŠã®äººã®ããã«ããå埩åã®ãããŠã§ããæ§ç¯ãã
Background Fetch APIã¯ãåã«ãã¡ã€ã«ãããŠã³ããŒãããããã®ããŒã«ã§ã¯ãããŸãããããã¯ãç§ãã¡ãæ§ç¯ããããŠã§ãã®çš®é¡ã«ã€ããŠã®å£°æã§ããå埩åãããããŠãŒã¶ãŒäžå¿ã§ãããã€ã¹ããããã¯ãŒã¯æ¥ç¶ã®å質ã«é¢ä¿ãªãããã¹ãŠã®äººã®ããã«æ©èœãããŠã§ãã§ããå€§èŠæš¡ãªè»¢éããã©ãŠã¶ã«ãªãããŒãããããšã§ããŠãŒã¶ãŒãããã°ã¬ã¹ããŒãèŠã€ããäžå®ããè§£æŸãã圌ãã®ããŒã¿ãšããããªãŒãç¯çŽããå ç¢ã§ä¿¡é Œæ§ã®é«ãäœéšãæäŸããŸãã
å€§èŠæš¡ãªãã¡ã€ã«è»¢éãå«ã次ã®ãŠã§ããããžã§ã¯ããèšç»ããéã«ã¯ãåŸæ¥ã®`fetch`ãè¶ ããŠèããŠã¿ãŠãã ããããŠãŒã¶ãŒã®ã°ããŒãã«ãªæèãèæ ®ããããã¯ã°ã©ãŠã³ããã§ããã®åãæŽ»çšããŠãçã«ã¢ãã³ãªãªãã©ã€ã³ãã¡ãŒã¹ãã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãã ããããŠã§ãã®æªæ¥ã¯æ°žç¶çã§å埩åããããä»ãããªãã®ããŠã³ããŒãããããªãããšãã§ããŸãã