Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

39
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PWAใ‚’่ถ…็ฐกๅ˜ใซใ‚ชใƒ•ใƒฉใ‚คใƒณ่กจ็คบใซๅฏพๅฟœใ—ใ‚ˆใ†ใ€PWAใฎๅŸบๆบ–ๅค‰ๆ›ดใ€‘

Last updated at Posted at 2021-03-07

ใ“ใ‚“ใซใกใฏใ€‚็ช็„ถใงใ™ใŒPWAใฎใ‚ชใƒ•ใƒฉใ‚คใƒณ่กจ็คบๅฏพๅฟœใŒๅฟ…้ ˆใซใชใ‚Šใพใ™ใ€‚
โ†’ๅฏพๅฟœๅฟ…้ ˆใฏๆต็Ÿณใซๆ—ฉใ™ใŽใ‚‹ใจใ„ใ†ใ“ใจใงๆ’คๅ›žใ—ไธ€ๆ™‚่ฆ‹้€ใ‚‰ใ‚ŒใŸใใ†ใงใ™ใ€‚

Chromeใฎใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆใซใ‚ˆใ‚ŠWebใ‚ขใƒ—ใƒชใ‚’PWAใจใ—ใฆใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใ‚‹ใ‹ใฉใ†ใ‹ใฎๅŸบๆบ–ใŒ่ฆ‹็›ดใ•ใ‚Œใพใ™ใ€‚

Googleใ‹ใ‚‰ใฎ็™บ่กจ

  • Chrome 89 ไปฅ้™ใ€PWAใŒใ‚ชใƒ•ใƒฉใ‚คใƒณๆ™‚ใซๆœ‰ๅŠนใชๅฟœ็ญ”ใ‚’่ฟ”ใ•ใชใ„ๅ ดๅˆใ€้–‹็™บ่€…ใƒ„ใƒผใƒซใฎใ‚ณใƒณใ‚ฝใƒผใƒซใซ่ญฆๅ‘ŠใŒ่กจ็คบใ•ใ‚Œใ‚‹ใ€‚
  • **Chrome 93(ไปŠๅนดๅพŒๅŠไปฅ้™ใƒชใƒชใƒผใ‚นไบˆๅฎš)**ไปฅ้™ใ€ใ‚ชใƒ•ใƒฉใ‚คใƒณใง้ฉๅˆ‡ใซๅ‹•ไฝœใ—ใชใ„Webใ‚ขใƒ—ใƒชใฏPWAใจใ—ใฆใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใชใใชใ‚‹ใ€‚

ๅ‡บๅ…ธ๏ผšใ€ŒGoogle Chrome 89ใ€ใŒๅ…ฌ้–‹ ๏ฝžใ‚ผใƒญใƒ‡ใ‚ค่„†ๅผฑๆ€ง1ไปถใ‚’ๅซใ‚€47ไปถใฎๅ•้กŒใ‚’ไฟฎๆญฃ

ใคใพใ‚Šใ‚ชใƒ•ใƒฉใ‚คใƒณใงใ‚‚ไฝฟใˆใ‚‹ใ‚ˆใ†ใซใ—ใฆใญใ€‚ใฃใฆใ“ใจใงใ™ใญใ€‚
็พ็Šถใ€ใ‚ชใƒ•ใƒฉใ‚คใƒณใซๅฏพๅฟœใ—ใฆใ„ใ‚‹PWAใ‚ตใ‚คใƒˆใฏใ‚ใพใ‚Šใชใ„ๆ„Ÿใ˜ใชใฎใงๆ—ฉๆ€ฅใซๅฏพๅฟœใ‚’ใ™ในใใงใ—ใ‚‡ใ†ใญใ€‚
ๅ› ใฟใซใ‚ชใƒ•ใƒฉใ‚คใƒณ่กจ็คบใซๅฏพๅฟœใ—ใฆใ„ใชใ„ใจไปฅไธ‹ใฎ่กจ็คบใŒๅ‡บใพใ™ใ€‚๏ผˆใ‚‚ใกใ‚ใ‚“ๅˆใ‚ใฆใ˜ใ‚ƒใชใ„ใงใ™๏ผ‰
Screenshot_20210307_144710 (1).jpg

ใ“ใฎๅ•้กŒใ‚’ๅ›ž้ฟใ™ใ‚‹ใซใฏ่‡ณใฃใฆ็ฐกๅ˜ใงใ€**ใ‚ชใƒ•ใƒฉใ‚คใƒณ็”จใฎใƒšใƒผใ‚ธใ‚’็”จๆ„ใ™ใ‚‹ใ ใ‘ใงใ„ใ„ใ‚“ใงใ™ใ€‚**ใพใๅฝ“ใŸใ‚Šๅ‰ใงใ™ใŒใ€‚
ใชใฎใงไปŠๅ›žใฏHTML+JSใงใ‚ชใƒ•ใƒฉใ‚คใƒณๅฏพๅฟœใ•ใ›ใ‚‹้››ๅฝขใ‚’ไฝœใ‚Šใพใ™ใ€‚

ๅ‚่€ƒ๏ผšPWAใงPUSH้€š็ŸฅๆฉŸ่ƒฝใ‚’ๅฎŸ่ฃ…ใ€‚

ๅฎŸ่ฃ…

ๆณจๆ„

PWAใฏSSLๅฏพๅฟœใŒๅฟ…้ ˆใงใ™ใ€‚ใ”ๆณจๆ„ใใ ใ•ใ„ใ€‚๏ผˆไธ€ๅฟœlocalhostใงใฏ้žSSLใงใ‚‚ๅ‹•ใใพใ™๏ผ‰

ๆง‹ๆˆ

html
โ”œ img
โ”‚ โ”” logo.png
โ”œ index.html
โ”” sw.js

manifest.json

PWAใจใ—ใฆ่ช่ญ˜ใ•ใ›ใ‚‹ใŸใ‚ใซใ„ใคใ‚‚ใฎmanifest.jsonใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ไปฅไธ‹ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใงใ™ใ€‚

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ใ‚’ๆ›ธใใพใ™ใ€‚

sw.js
// ใƒใƒผใ‚ธใƒงใƒณๅฎš็พฉ
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ใ‚’ๆ›ธใใพใ™ใ€‚ใใฎ้š›ใ€ใ•ใฃใๆ›ธใ„ใŸใ‚„ใคใ‚’่ชญใฟ่พผใพใ›ใพใ™ใ€‚
ไปฅไธ‹ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆ

index.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>

ใ“ใ‚ŒใงๅฎŸ่ฃ…ใฏ็ต‚ใ‚ใ‚Šใงใ™ใ€‚ใŸใ‚ใ—ใฆใฟใพใ—ใ‚‡ใ†ใ€‚

ๅ‹•ไฝœ็ขบ่ช

็”ป้ขไธ‹้ƒจใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚’ไฟƒใ™ใƒใƒƒใƒ—ใ‚ขใƒƒใƒ—ใŒ่กจ็คบใ•ใ‚Œใ‚‹ใฎใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใฟใพใ™ใ€‚
Screenshot_20210307_144842 (1).jpg
InkedScreenshot_20210307_144737 (1)_LI.jpg

ใ‚คใƒณใ‚นใƒˆใƒผใƒซใŒ็ต‚ใ‚ใ‚‹ใจ้€š็ŸฅใŒ่กจ็คบใ•ใ‚Œใพใ™ใฎใง้–‹ใ„ใฆ่กจ็คบใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚
InkedScreenshot_20210307_144751_LI.jpg

ใกใ‚ƒใ‚“ใจ่กจ็คบใŒใงใใŸใ‚‰่ฉฆใ—ใซๆฉŸๅ†…ใƒขใƒผใƒ‰ใซใ—ใพใ™
Screenshot_20210307_144819.jpg

ใ“ใ‚Œใงใ‚ขใƒ—ใƒชใ‚’้–‹ใ„ใฆใ‚‚ๅ•้กŒใชใ่กจ็คบใงใใŸใ‚‰OKใงใ™ใ€‚
Screenshot_20210307_144918.jpg
Screenshot_20210307_144943 (1).jpg

ใฏใ„ใกใ‚ƒใ‚“ใจ่กจ็คบใงใใฆใพใ™ใญใ€‚ใƒšใƒผใ‚ธใฎ้ท็งปใ‚‚ๅ•้กŒใชใ„ใงใ™ใ€‚
ไปฅไธŠPWAใ‚’ใ‚ชใƒ•ใƒฉใ‚คใƒณๅŒ–ใ•ใ›ใฆใฟใพใ—ใŸใ€‚ๅŸบๆบ–ๅค‰ๆ›ดใพใง็Ÿญใ„ใฎใงๆ—ฉๆ€ฅใซๅฏพๅฟœใ—ใฆใใ ใ•ใ„ใญQiitaใ•ใ‚“ใ€ใ‚ใชใŸใฎใ“ใจใงใ™ใ€‚
ใ€่ฟฝ่จ˜ใ€‘QiitaใŒใ‚ชใƒ•ใƒฉใ‚คใƒณ่กจ็คบใซๅฏพๅฟœใ—ใพใ—ใŸใ€‚ๆœ‰้›ฃใ†ใ”ใ–ใ„ใพใ™ใ€‚
Screenshot_20210522_124420.jpg

ๆ™ฎๆฎตใฏTwitterใ‚„ใƒ–ใƒญใ‚ฐใง่‰ฒใ€…ๆ›ธใ„ใฆใพใ™ใ€‚

39
35
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

@ichii731's pickup articles

ichii731

@ichii731(ๅธ‚ไบ•)

ๅŸบๆœฌzennใงๆŠ•็จฟใ—ใพใ™ใ€‚https://zenn.dev/ichii731

Today's trending articles

Linked from these articles

Comments

@kogaH(Kazuhiro Kogai)
(Edited)

ๅคงๅค‰ๅ‹‰ๅผทใซใชใ‚Šใพใ™ใ€‚

ๅ‹•ไฝœ็ขบ่ชใฎ็ฏ€ใง

ใ“ใ‚Œใงใ‚ขใƒ—ใƒชใ‚’้–‹ใ„ใฆใ‚‚ๅ•้กŒใชใ่กจ็คบใงใใชใ‹ใฃใŸใ‚‰OKใงใ™ใ€‚

ใจใชใฃใฆใ„ใพใ™ใŒใ€
ใ“ใ‚Œใงใ‚ขใƒ—ใƒชใ‚’้–‹ใ„ใฆใ‚‚ๅ•้กŒใชใ่กจ็คบใงใใŸใ‚‰OKใงใ™ใ€‚
ใฎ้–“้•ใ„ใงใ™ใ‹๏ผŸ

0

็งใฎใƒŸใ‚นใงใ™ใ€‚ๅ…ˆ็จ‹ๆ›ดๆ–ฐใ„ใŸใ—ใพใ—ใŸใ€‚
ใ”ๆŒ‡ๆ‘˜ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™m(_ _)m

0

Let's comment your feelings that are more than good

Being held Article posting campaign

39
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address