Web Background SyncãæŽ»çšããŠãWebã¢ããªã±ãŒã·ã§ã³ã®å ç¢ãªãªãã©ã€ã³ããŒã¿åæãå®çŸããŸããããæŠç¥ãå®è£ ããã¹ããã©ã¯ãã£ã¹ã解説ããŸãã
Web Background Sync: ä¿¡é Œæ§ã®é«ããªãã©ã€ã³ããŒã¿åææŠç¥
仿¥ã®çžäºæ¥ç¶ãããäžçã§ã¯ããŠãŒã¶ãŒã¯ãããã¯ãŒã¯æ¥ç¶ã«é¢ä¿ãªããWebã¢ããªã±ãŒã·ã§ã³ãå©çšå¯èœã§æ©èœããããšãæåŸ ããŠããŸããWeb Background Syncã¯ãéçºè ãå®å®ããæ¥ç¶ã確ä¿ã§ãããŸã§ã¢ã¯ã·ã§ã³ãå»¶æã§ããããã«ãã匷åãªWeb APIã§ããããªãã©ã€ã³æã§ãããŒã¿ã®æŽåæ§ãšã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããŸãããã®èšäºã§ã¯ãWeb Background Syncã®çè§£ãšå®è£ ã«é¢ããå æ¬çãªã¬ã€ããæäŸããäž»èŠãªæŠå¿µãå®è·µçãªäŸãããã³ãã¹ããã©ã¯ãã£ã¹ãç¶²çŸ ããŸãã
Web Background Syncã®çè§£
Web Background Syncã¯ããŠãŒã¶ãŒãããŒãžãéãããããªãã©ã€ã³ã«ãªã£ããããŠããWebããŒãžããã©ãŠã¶ã«ããã¯ã°ã©ãŠã³ãã§é¢æ°ãå®è¡ããããã«èŠæ±ã§ãããã¯ãããžãŒã§ããããã¯ç¹ã«ä»¥äžã®ãããªã¿ã¹ã¯ã«åœ¹ç«ã¡ãŸãã
- ãã©ãŒã ã®éä¿¡: ãŠãŒã¶ãŒããªãã©ã€ã³ã§ãã£ãŠãããã©ãŒã ããŒã¿ãéä¿¡ãããããšãä¿èšŒããŸãã
- ã¡ãã»ãŒãžã®éä¿¡: ãŠãŒã¶ãŒãæ¥ç¶ãå埩ãããšãã«ã¡ãã»ãŒãžãéä¿¡ãããããšãä¿èšŒããŸãã
- ããŒã¿ã®æŽæ°: 宿çã«ãªã¢ãŒããµãŒããŒãšããŒã¿ãåæããŸãã
äžå¿çãªèãæ¹ã¯ããããã¯ãŒã¯ãå©çšå¯èœã«ãªã£ããšãã«ããªã¬ãŒãããã€ãã³ãããã©ãŠã¶ã«ç»é²ããããšã§ãããã®ã€ãã³ãã¯ãWebããŒãžãšã¯å¥ã«ããã¯ã°ã©ãŠã³ãã§å®è¡ãããã¹ã¯ãªããã§ããService Workerã«ãã£ãŠåŠçãããŸãã
Web Background Syncã®ä»çµã¿
- ç»é²: WebããŒãžã¯ã
navigator.serviceWorker.ready.then()ãã§ãŒã³ãä»ããŠããã¯ã°ã©ãŠã³ãåæã€ãã³ããç»é²ããŸãã - Service Workerã«ããåå: Service Workerã¯åæã€ãã³ããååããŸãã
- ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã®å®è¡: Service Workerã¯ããµãŒããŒãžã®ããŒã¿éä¿¡ãªã©ã®ç®çã®ã¿ã¹ã¯ãå®è¡ããã³ãŒããå®è¡ããŸãã
- æåãŸãã¯å€±æã®åŠç: Service Workerã¯ã¿ã¹ã¯ã®æåãŸãã¯å€±æãåŠçããŸããã¿ã¹ã¯ã倱æããå ŽåïŒäŸ: ãããã¯ãŒã¯ãåŒãç¶ãå©çšã§ããªãããïŒãåŸã§å詊è¡ã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ãšã¡ãªãã
Web Background Syncã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã®æ°å€ãã®å¯èœæ§ãè§£ãæŸã¡ãŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäž: ãŠãŒã¶ãŒã¯ãããã¯ãŒã¯æ¥ç¶ã®åé¡ã«ãã£ãŠãããã¯ãããããšãªããã¢ããªã±ãŒã·ã§ã³ãšã®å¯Ÿè©±ãç¶ããããšãã§ããŸãã
- ããŒã¿ã®æŽåæ§: ããŒã¿ãæçµçã«ãµãŒããŒãšåæãããããšãä¿èšŒããããŒã¿æå€±ãé²ããŸãã
- ä¿¡é Œæ§ã®åäž: Webã¢ããªã±ãŒã·ã§ã³ããããã¯ãŒã¯ã®é害ã«å¯ŸããŠããå埩åã®ãããã®ã«ããŸãã
- ããã¯ã°ã©ãŠã³ãåŠç: 峿ã®ãŠãŒã¶ãŒæäœãå¿ èŠãšããªãå»¶æãããã¿ã¹ã¯ãèš±å¯ããŸãã
Web Background Syncã®å®éã®äŸ
- ãœãŒã·ã£ã«ã¡ãã£ã¢: ãªãã©ã€ã³æã§ããŠãŒã¶ãŒãã¢ããããŒããæçš¿ã§ããããã«ããæ¥ç¶ãå埩ãããšãã«å ¬éãããããšãä¿èšŒããŸãããã¿ãŽãã¢ã®èŸºå¢ã®å°ã§åçãæçš¿ãããŠãŒã¶ãŒãæ³åããŠã¿ãŠãã ãããæåã¯ã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ããªããŠããåŸã§åæãããŸãã
- Eã³ããŒã¹: ãŠãŒã¶ãŒããªãã©ã€ã³ã§ã«ãŒãã«ååã远å ããããæ³šæããããã§ããããã«ãããªã³ã©ã€ã³ã«ãªã£ããæ³šæãéä¿¡ãããããšãä¿èšŒããŸããããã¯ãã€ã³ãã®èŸ²æéšã®ãããªã€ã³ã¿ãŒããããäžå®å®ãªå°åã§ã¯éåžžã«éèŠã§ãã
- ããŒãã¢ããª: ããŒãããªãã©ã€ã³ã§ä¿åããæ¥ç¶ãå©çšå¯èœã«ãªã£ããšãã«ããã€ã¹éã§åæããŸããçŽäºå°åž¯ã®ãžã£ãŒããªã¹ããã¡ã¢ãåã£ãŠããç¶æ³ãèããŠã¿ãŠãã ããã圌ãã¯èªåã®ä»äºãå®å šã«ããã¯ã¢ããããããšããä¿èšŒãå¿ èŠã§ãã
- ã¡ãŒã«ã¯ã©ã€ã¢ã³ã: ãªãã©ã€ã³ã§ã¡ãŒã«ãäœæããŠéä¿¡ããæ¥ç¶ã確ç«ããããéä¿¡ããããšããä¿èšŒãåŸãŸãã
Web Background Syncã®å®è£ : ã¹ããããã€ã¹ãããã¬ã€ã
Web Background Syncã®å®è£ ã«ã¯ãService Workerã®ç»é²ãåæã€ãã³ãã®ç»é²ãService Workerå ã§ã®åæã€ãã³ãã®åŠçãªã©ãããã€ãã®ã¹ããããå«ãŸããŸãã
1. Service Workerã®ç»é²
ãŸããã¡ã€ã³ã®JavaScriptãã¡ã€ã«ã§Service Workerãç»é²ããŸãã
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker registered with scope:', registration.scope);
})
.catch(error => {
console.error('Service Worker registration failed:', error);
});
}
2. åæã€ãã³ãã®ç»é²
次ã«ãåæã€ãã³ããç»é²ããŸããåæã€ãã³ãã«ã¯ååãå¿ èŠã§ããããšãã°ã'sync-new-post'ã§ãããã®ååã¯ãåŸã§Service Workerã§å®è¡ãããç¹å®ã®ã¿ã¹ã¯ãèå¥ããããã«äœ¿çšãããŸãã
function registerSync() {
navigator.serviceWorker.ready.then(function(swRegistration) {
return swRegistration.sync.register('sync-new-post');
}).then(function() {
console.log('Sync registered');
}).catch(function(err) {
console.log('Sync registration failed!', err);
});
}
ãã©ãŒã ã®éä¿¡ãªã©ãåæãå¿ èŠãªã¢ã¯ã·ã§ã³ããŠãŒã¶ãŒã詊ã¿ããšãã«ãã®é¢æ°ãåŒã³åºããŸãã
document.getElementById('new-post-form').addEventListener('submit', function(event) {
event.preventDefault();
// Save data to IndexedDB or local storage
saveData('new-post-form', {
title: document.getElementById('title').value,
content: document.getElementById('content').value
}).then(function() {
registerSync();
});
});
3. Service Workerã§ã®åæã€ãã³ãã®åŠç
sw.jsãã¡ã€ã«ã§ãsyncã€ãã³ãããªãã¹ã³ããç¹å®ã®ã¿ã¹ã¯ãåŠçããŸãã
self.addEventListener('sync', function(event) {
console.log('Background syncing!', event);
if (event.tag === 'sync-new-post') {
console.log('Syncing new Post');
event.waitUntil(
getData('new-post-form')
.then(function(data) {
if (data) {
// Send the data to the server
return fetch('https://your-api.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify(data)
})
.then(function(res) {
if (res.ok) {
return res.json();
}
})
.then(function(data) {
console.log('Sent data', data);
deleteData('new-post-form'); // Clear data from storage
})
.catch(function(err) {
console.log('Error while sending data', err);
// Throwing an error will retry the sync event later
throw err;
});
}
})
);
}
});
説æ:
syncã€ãã³ããªã¹ããŒã¯ããã©ãŠã¶ããããã¯ãŒã¯ãå©çšå¯èœã§ãããç»é²ãããã€ãã³ãïŒ'sync-new-post'ïŒãå®è¡ãããã¹ãã§ãããšå€æãããšãã«ããªã¬ãŒãããŸããevent.waitUntil()ã¯ãPromiseã解決ããããŸã§Service Workerãçµäºããªãããšãä¿èšŒããŸããããã¯ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«äžå¯æ¬ ã§ããgetData('new-post-form')颿°ã¯ãããŒã«ã«ã«ä¿åãããããŒã¿ïŒäŸ: IndexedDBããïŒãååŸããŸããããŒã«ã«ããŒã¿ã¹ãã¬ãŒãžã管çããããã«getDataãšdeleteDataãå®è£ ããŠãããšä»®å®ããŠããŸããfetch()APIã¯ããµãŒããŒã«ããŒã¿ãéä¿¡ããããšããŸãã- ãªã¯ãšã¹ããæåããå ŽåãããŒã¿ã¯ããŒã«ã«ã¹ãã¬ãŒãžããã¯ãªã¢ãããŸãã
- ãªã¯ãšã¹ãäžã«ãšã©ãŒãçºçããå Žåããšã©ãŒãã¹ããŒãããŸããããã«ããããã©ãŠã¶ã«åæã€ãã³ããåŸã§å詊è¡ãããã¹ãã§ããããšãéç¥ãããŸãã
4. ããŒã¿ã¹ãã¬ãŒãž
ãŠãŒã¶ãŒããªãã©ã€ã³ã®å Žåãåæã€ãã³ããç»é²ããåã«ããŒã¿ãããŒã«ã«ã«ä¿åããå¿
èŠããããŸããIndexedDBã¯ããã®ç®çã«é©ãã匷åãªãã©ãŠã¶ããŒã¹ã®NoSQLããŒã¿ããŒã¹ã§ããããåçŽãªããŒã¿ã®å Žåã¯localStorageã䜿çšããããšãã§ããŸãã
IndexedDBã«ããŒã¿ãä¿åããäŸ:
function saveData(st, data) {
return new Promise(function(resolve, reject) {
var request = indexedDB.open('posts-db', 1);
request.onsuccess = function() {
var db = request.result;
var tx = db.transaction('posts', 'versionchange');
tx.objectStore('posts').put(data, st);
return tx.complete ? resolve() : reject(tx.error);
};
request.onerror = function(event) {
console.log('Database opening failed', event);
reject(event);
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
db.createObjectStore('posts');
};
});
}
function getData(st) {
return new Promise(function(resolve, reject) {
var request = indexedDB.open('posts-db', 1);
request.onsuccess = function() {
var db = request.result;
var tx = db.transaction('posts', 'readonly');
var getReq = tx.objectStore('posts').get(st);
getReq.onsuccess = function() {
resolve(getReq.result);
};
getReq.onerror = function() {
reject(getReq.error);
};
};
request.onerror = function(event) {
console.log('Database opening failed', event);
reject(event);
};
});
}
function deleteData(st) {
return new Promise(function(resolve, reject) {
var request = indexedDB.open('posts-db', 1);
request.onsuccess = function() {
var db = request.result;
var tx = db.transaction('posts', 'versionchange');
tx.objectStore('posts').delete(st);
tx.complete ? resolve() : reject(tx.error);
};
request.onerror = function(event) {
console.log('Database opening failed', event);
reject(event);
};
});
}
5. Web Background Syncã®ãã¹ã
Chrome DevToolsã䜿çšããŠWeb Background Syncããã¹ãã§ããŸãã
- DevToolsãéããŸãã
- ãApplicationãã¿ãã«ç§»åããŸãã
- å·ŠåŽã®ããã«ã§ãService WorkersããéžæããŸãã
- Service WorkerãèŠã€ããŸãã
- ãOfflineããã§ãã¯ããã¯ã¹ããªã³ã«ããŠããªãã©ã€ã³ãã·ãã¥ã¬ãŒãããŸãã
- åæã€ãã³ããç»é²ããã¢ã¯ã·ã§ã³ãããªã¬ãŒããŸãïŒäŸ: ãã©ãŒã ãéä¿¡ããŸãïŒã
- ãOfflineããã§ãã¯ããã¯ã¹ããªãã«ããŠãæ¥ç¶ã®å埩ãã·ãã¥ã¬ãŒãããŸãã
- Service Workerã®æšªã«ãããSyncããã¿ã³ãã¯ãªãã¯ããŠãåæã€ãã³ããæåã§ããªã¬ãŒããŸãããŸãã¯ããã©ãŠã¶ãèªåçã«åæã詊ã¿ãã®ãåŸ ã€ã ãã§ãæ§ããŸããã
Web Background Syncã®ãã¹ããã©ã¯ãã£ã¹
å¹ççã§ä¿¡é Œæ§ã®é«ãWeb Background Syncã®å®è£ ãä¿èšŒããããã«ããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ããŒã¿ãµã€ãºãæå°éã«æãã: åæããããŒã¿ãå¯èœãªéãå°ããä¿ã¡ã転éãããããŒã¿éãåæžããŸãã
- ææ°é¢æ°çããã¯ãªããå®è£ ãã: 倱æããåæè©Šè¡ãå詊è¡ããããã«ææ°é¢æ°çããã¯ãªãæŠç¥ã䜿çšããŸããããã«ããããµãŒããŒãžã®ç¹°ãè¿ããªã¯ãšã¹ãã®éè² è·ãé²ããŸãã
- ãšã©ãŒãé©åã«åŠçãã: åæäžã®æœåšçãªåé¡ã«å¯ŸåŠããããã«ãé©åãªãšã©ãŒåŠçãå®è£ ããŸããåæã®ã¹ããŒã¿ã¹ããŠãŒã¶ãŒã«éç¥ããŸãã
- äžæã®åæã¿ã°ã䜿çšãã: ç°ãªãåæã€ãã³ããèå¥ããããã«ã説æçã§äžæã®åæã¿ã°ã䜿çšããŸããããã«ãããåæã¿ã¹ã¯ã广çã«ç®¡çããã³åªå é äœä»ãã§ããŸãã
- ããããªãŒå¯¿åœãèæ ®ãã: ç¹ã«ã¢ãã€ã«ããã€ã¹ã§ã¯ãããããªãŒæ¶è²»ã«æ³šæããŠãã ãããäžèŠãªåæè©Šè¡ãé »ç¹ã«è¡ããªãããã«ããŠãã ããã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ãæäŸãã: åæããã»ã¹ã®ã¹ããŒã¿ã¹ã«ã€ããŠãŠãŒã¶ãŒã«æ å ±ãæäŸããŸããåæãæåããããä¿çäžã§ãããã瀺ãããã«ãéç¥ãŸãã¯èŠèŠçãªæãããã䜿çšããŸãã
é«åºŠãªæŠç¥
åšæçãªããã¯ã°ã©ãŠã³ãåæ
ãã®èšäºã§ã¯ã1åéãã®ããã¯ã°ã©ãŠã³ãåæã«çŠç¹ãåœãŠãŠããŸãããåšæçãªããã¯ã°ã©ãŠã³ãåæã®æŠå¿µããããŸãããã ãããµããŒãã¯éåžžã«éå®çã§ãããããããªãŒãšããŒã¿ãç¯çŽããããã«ãã©ãŠã¶ã«ãã£ãŠå³ããå¶éãããŠããŸããæ³šæããŠã絶察ã«å¿ èŠãªãéã䜿çšããªãã§ãã ããã
æ¥œèŠ³çæŽæ°
ããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ããã«ãæ¥œèŠ³çæŽæ°ã®å®è£ ãæ€èšããŠãã ãããããã¯ãããŒã¿ããµãŒããŒãšåæãããåã§ãã£ãŠããã¢ã¯ã·ã§ã³ãæåãããã®ããã«UIãå³åº§ã«æŽæ°ããããšãå«ã¿ãŸããåæã倱æããå Žåã¯ãUIã以åã®ç¶æ ã«æ»ãããŠãŒã¶ãŒã«éç¥ã§ããŸãã
ç«¶å解決
å Žåã«ãã£ãŠã¯ãè€æ°ã®ãŠãŒã¶ãŒããªãã©ã€ã³ã§åãããŒã¿ã倿ŽãããšãããŒã¿ç«¶åãçºçããããšããããŸãããããã®ç¶æ³ãåŠçããããã«ãç«¶å解決æŠç¥ãå®è£ ããŠãã ãããäžè¬çãªæŠç¥ã«ã¯ä»¥äžãå«ãŸããŸãã
- åŸæžãåªå (Last-Write-Wins): æåŸã«åæãããæŽæ°ã以åã®æŽæ°ãäžæžãããŸãã
- ããŒãž: ç«¶åããæŽæ°ãããŒãžããããšããŸãã
- ãŠãŒã¶ãŒä»å ¥: ãŠãŒã¶ãŒã«æåã§ç«¶åã解決ããããã«ä¿ããŸãã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
Web Background Syncã䜿çšããéã¯ã以äžã®ã»ãã¥ãªãã£äžã®èæ ®äºé ã«çæããŠãã ããã
- ããŒã¿æå·å: æ©å¯ããŒã¿ã¯ãããŒã«ã«ã«ä¿åããåã«æå·åããŠãã ããã
- èªèšŒ: èš±å¯ããããŠãŒã¶ãŒã®ã¿ãåæã€ãã³ããããªã¬ãŒã§ããããšã確èªããŠãã ããã
- ããŒã¿æ€èšŒ: æªæã®ããããŒã¿ãåæãããªãããã«ããµãŒããŒåŽã§ããŒã¿ãæ€èšŒããŠãã ããã
- HTTPS: 転éäžã®ããŒã¿ãä¿è·ããããã«ãåžžã«HTTPSã䜿çšããŠãã ããã
çµè«
Web Background Syncã¯ãéçºè ãå埩åã®ããä¿¡é Œæ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãã匷åãªãã¯ãããžãŒã§ãããã®ã³ã¢ã³ã³ã»ãããçè§£ãããã¹ããã©ã¯ãã£ã¹ãå®è£ ããé«åºŠãªæŠç¥ãæ€èšããããšã§ããããã¯ãŒã¯æ¥ç¶ã®åé¡ãã·ãŒã ã¬ã¹ã«åŠçããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããWebãšã¯ã¹ããªãšã³ã¹ãäœæã§ããŸãããã®èšäºã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã匷åããããã«Web Background SyncãæŽ»çšããããã®åŒ·åºãªåºç€ãæäŸããŸãããäžçäžã®ãããã¯ãŒã¯ç¶æ³ãå€åãç¶ããäžããªãã©ã€ã³åææè¡ãç¿åŸããããšã¯ãçã«ãŠããã¿ã¹ã§é åçãªWebãšã¯ã¹ããªãšã³ã¹ãäžçäžã®ãŠãŒã¶ãŒã«æäŸããããã«äžå¯æ¬ ãšãªãã§ãããã