ใใใซใกใฏใ็ช็ถใงใใPWAใฎใชใใฉใคใณ่กจ็คบๅฏพๅฟใๅฟ
้ ใซใชใใพใใ
โๅฏพๅฟๅฟ
้ ใฏๆต็ณใซๆฉใใใใจใใใใจใงๆคๅใไธๆ่ฆ้ใใใใใใงใใ
ChromeใฎใขใใใใผใใซใใWebใขใใชใPWAใจใใฆใคใณในใใผใซใงใใใใฉใใใฎๅบๆบใ่ฆ็ดใใใพใใ
Googleใใใฎ็บ่กจ
- Chrome 89 ไปฅ้ใPWAใใชใใฉใคใณๆใซๆๅนใชๅฟ็ญใ่ฟใใชใๅ ดๅใ้็บ่ ใใผใซใฎใณใณใฝใผใซใซ่ญฆๅใ่กจ็คบใใใใ
- **Chrome 93(ไปๅนดๅพๅไปฅ้ใชใชใผในไบๅฎ)**ไปฅ้ใใชใใฉใคใณใง้ฉๅใซๅไฝใใชใWebใขใใชใฏPWAใจใใฆใคใณในใใผใซใงใใชใใชใใ
ๅบๅ ธ๏ผใGoogle Chrome 89ใใๅ ฌ้ ๏ฝใผใญใใค่ๅผฑๆง1ไปถใๅซใ47ไปถใฎๅ้กใไฟฎๆญฃ
ใคใพใใชใใฉใคใณใงใไฝฟใใใใใซใใฆใญใใฃใฆใใจใงใใญใ
็พ็ถใใชใใฉใคใณใซๅฏพๅฟใใฆใใPWAใตใคใใฏใใพใใชใๆใใชใฎใงๆฉๆฅใซๅฏพๅฟใใในใใงใใใใญใ
ๅ ใฟใซใชใใฉใคใณ่กจ็คบใซๅฏพๅฟใใฆใใชใใจไปฅไธใฎ่กจ็คบใๅบใพใใ๏ผใใกใใๅใใฆใใใชใใงใ๏ผ
ใใฎๅ้กใๅ้ฟใใใซใฏ่ณใฃใฆ็ฐกๅใงใ**ใชใใฉใคใณ็จใฎใใผใธใ็จๆใใใ ใใงใใใใงใใ**ใพใๅฝใใๅใงใใใ
ใชใฎใงไปๅใฏHTML+JSใงใชใใฉใคใณๅฏพๅฟใใใ้ๅฝขใไฝใใพใใ
ๅ่๏ผPWAใงPUSH้็ฅๆฉ่ฝใๅฎ่ฃ ใ
ๅฎ่ฃ
ๆณจๆ
PWAใฏSSLๅฏพๅฟใๅฟ ้ ใงใใใๆณจๆใใ ใใใ๏ผไธๅฟlocalhostใงใฏ้SSLใงใๅใใพใ๏ผ
ๆงๆ
html
โ img
โ โ logo.png
โ index.html
โ sw.js
manifest.json
PWAใจใใฆ่ช่ญใใใใใใซใใคใใฎmanifest.jsonใไฝๆใใพใใไปฅไธใใณใใฌใผใใงใใ
{
"name": "PWA Offline Test",
"short_name": "PWA",
"icons": [
{
"src": "/img/icon.png",
"sizes": "144x144",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#99d9ea"
}
Manifest.jsonใฎ่ฉณใใๆธใๆนใฏๅฑฑใปใฉใใใใงๅ่ใซใใฆใใ ใใใ
ServiceWorker
PWAใๅไฝใใใใใใซๅฟ ่ฆใชServiceWorkerใๆธใใพใใ
// ใใผใธใงใณๅฎ็พฉ
var CACHE_VERSION = 'ca-v1';
var DISP_VERSION = 'ca-d-v1';
// ใญใฃใใทใฅใฎๅฏพ่ฑกใซใใใใฃใฌใฏใใช๏ผcss/jsใฏๅๅฅใง่ฟฝๅ ๏ผ
var resources = [
'/',
'/img'
];
// ใญใฃใใทใฅ่ฟฝๅ
self.addEventListener('install', function (event) {
console.log('ServiceWorker Install');
event.waitUntil(
caches.open(CACHE_VERSION)
.then(function (cache) {
console.log('cache.addAll');
cache.addAll(resources);
})
);
});
// ใญใฃใใทใฅ่กจ็คบ
self.addEventListener('fetch', function (event) {
console.log('ServiceWorker fetch');
event.respondWith(
// ใญใฃใใทใฅใๅญๅจใใใใใงใใฏ
caches.match(event.request)
.then(function (response) {
if (response) {
return response;
} else {
// ใญใฃใใทใฅใใชใๅ ดๅใญใฃใใทใฅใซๅ
ฅใใ
return fetch(event.request)
.then(function (res) {
return caches.open(DISP_VERSION)
.then(function (cache) {
console.log('cache.put');
cache.put(event.request.url, res.clone());
return res;
});
})
.catch(function () {
// ไฝใใใชใ
});
}
})
);
});
// ๅคใใญใฃใใทใฅใๅ้ค
self.addEventListener('activate', function (event) {
console.log('activate ServiceWorker');
event.waitUntil(
caches.keys()
.then(function (keyList) {
return Promise.all(keyList.map(function (key) {
if (key !== CACHE_VERSION && key !== DISP_VERSION) {
console.log('cache.delete');
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
ใใฎ่จไบใๅ่ใซใใใฆใใใ ใใพใใใ
htmlใใผใธ
ใชใใฉใคใณใง่กจ็คบใใใใใใฎHTMLใๆธใใพใใใใฎ้ใใใฃใๆธใใใใคใ่ชญใฟ่พผใพใใพใใ
ไปฅไธใใณใใฌใผใ
<head>
<link rel="manifest" href="/manifest.json">
<!-- ๆๅญใณใผใ่จญๅฎ&ใขใใคใซๅฏพๅฟๅ -->
<meta charset="utf8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<script>
// ServiceWorkerใ่ชญใฟ่พผใพใใ
window.addEventListener('load', function () {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(function (registration) {
return registration.pushManager.getSubscription().then(function (subscription) {
console.log("subscription", subscription)
if (subscription) {
return subscription
}
return registration.pushManager.subscribe({
userVisibleOnly: true
})
})
}).then(function (subscription) {
var endpoint = subscription.endpoint
console.log("pushManager endpoint:", endpoint)
}).catch(function (error) {
console.log("serviceWorker error:", error)
})
}
})
</script>
</head>
<body>
PWAใฎใชใใฉใคใณ่กจ็คบใในใ๏ผใใญใณใใใผใธ๏ผ
<br>
<a href="https://hoge.com/index2.html">2ใใผใธ็ฎใธ</a>
<!-- ใใผใธใฎ้ท็งปใใงใใพใใใใฎ้ใ้ท็งปๅ
ใใผใธใซใServiceWorkerใ่ชญใฟ่พผใพใใชใใจใใพใๆฉ่ฝใใชใๅ ดๅใใใใพใ -->
<br>
<img src="/icon.png">
</body>
</html>
ใใใงๅฎ่ฃ ใฏ็ตใใใงใใใใใใฆใฟใพใใใใ
ๅไฝ็ขบ่ช
็ป้ขไธ้จใซใคใณในใใผใซใไฟใใใใใขใใใ่กจ็คบใใใใฎใงใคใณในใใผใซใใฆใฟใพใใ
ใคใณในใใผใซใ็ตใใใจ้็ฅใ่กจ็คบใใใพใใฎใง้ใใฆ่กจ็คบใ็ขบ่ชใใฆใใ ใใใ
ใกใใใจ่กจ็คบใใงใใใ่ฉฆใใซๆฉๅ
ใขใผใใซใใพใ
ใใใงใขใใชใ้ใใฆใๅ้กใชใ่กจ็คบใงใใใOKใงใใ
ใฏใใกใใใจ่กจ็คบใงใใฆใพใใญใใใผใธใฎ้ท็งปใๅ้กใชใใงใใ
ไปฅไธPWAใใชใใฉใคใณๅใใใฆใฟใพใใใๅบๆบๅคๆดใพใง็ญใใฎใงๆฉๆฅใซๅฏพๅฟใใฆใใ ใใใญQiitaใใใใใชใใฎใใจใงใใ
ใ่ฟฝ่จใQiitaใใชใใฉใคใณ่กจ็คบใซๅฏพๅฟใใพใใใๆ้ฃใใใใใพใใ








Comments
ๅคงๅคๅๅผทใซใชใใพใใ
ๅไฝ็ขบ่ชใฎ็ฏใง
ใจใชใฃใฆใใพใใใ
ใใใงใขใใชใ้ใใฆใๅ้กใชใ่กจ็คบใงใใใOKใงใใ
ใฎ้้ใใงใใ๏ผ
็งใฎใในใงใใๅ ็จๆดๆฐใใใใพใใใ
ใๆๆใใใใจใใใใใพใm(_ _)m
Let's comment your feelings that are more than good