<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PWA | ばすにっきTips</title>
	<atom:link href="https://takabus.com/tips/tag/pwa/feed/" rel="self" type="application/rss+xml" />
	<link>https://takabus.com/tips</link>
	<description>プログラミングやサーバー、日々のTipsをメモしています。</description>
	<lastBuildDate>Fri, 25 Feb 2022 04:59:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://takabus.com/tips/wp-content/uploads/2022/12/cropped-tips-1-32x32.png</url>
	<title>PWA | ばすにっきTips</title>
	<link>https://takabus.com/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Nuxt.js】@nuxt/pwaでサクッとPWA対応しよう！</title>
		<link>https://takabus.com/tips/1067/</link>
					<comments>https://takabus.com/tips/1067/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 25 Feb 2022 04:59:20 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[PWA]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1067</guid>

					<description><![CDATA[Nuxt.jsの公式モジュールnuxt/pwaを使って、サクッとPWA（Progressive Web Application）に対応させる方法を紹介します。]]></description>
										<content:encoded><![CDATA[
<p><span class="marker-under"><strong>Nuxt.jsのモジュール<span class="bold-red">@nuxt/pwa</span></strong></span>を使って、サクッとPWA（Progressive Web Application）に対応させる方法を紹介します。</p>




<a rel="noopener" href="https://pwa.nuxtjs.org/" title="Introduction" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://pwa.nuxtjs.org/preview.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Introduction</div><div class="blogcard-snippet external-blogcard-snippet">Supercharge Nuxt with a heavily tested, updated and stable PWA solution</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://pwa.nuxtjs.org" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pwa.nuxtjs.org</div></div></div></div></a>



<h2 class="wp-block-heading" id="nuxt-pwaをインストール">@nuxt/pwaをインストール</h2>



<p>まず、<strong>@nuxt/pwa</strong>をインストールします。</p>



<pre class="wp-block-code"><code>npm i --save-dev @nuxtjs/pwa</code></pre>



<p>nuxt.config.jsのbuildModulesに<strong>@nuxt/pwa</strong>を追加し、有効にします。</p>



<pre class="wp-block-code"><code>export default {
...
  // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
<strong>  buildModules: &#91;
    '@nuxtjs/pwa',
  ],</strong>
...</code></pre>



<p>あとはホスティングするだけです。https対応のサーバーで公開すると、PWAとしてインストールできるようになります。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="423" height="250" src="https://takabus.com/tips/wp-content/uploads/2022/02/image-16.png" alt="PWAのインストールを促す画面" class="wp-image-1068" srcset="https://takabus.com/tips/wp-content/uploads/2022/02/image-16.png 423w, https://takabus.com/tips/wp-content/uploads/2022/02/image-16-300x177.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></figure>



<h2 class="wp-block-heading" id="マニフェストをカスタマイズするには">マニフェストをカスタマイズするには？</h2>



<p>PWAのアプリ名などをカスタマイズしたいときは、nuxt.config.jsにpwaを追加します。</p>



<pre class="wp-block-code"><code>  // PWA module configuration: https://go.nuxtjs.dev/pwa
  pwa: {
    manifest: {
      ...
    },
  },</code></pre>



<p>設定できるマニフェストの項目は@nuxt/pwaのドキュメントで公開されています。</p>




<a rel="noopener" href="https://pwa.nuxtjs.org/manifest" title="Manifest Module" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://pwa.nuxtjs.org/preview.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Manifest Module</div><div class="blogcard-snippet external-blogcard-snippet">Manifest adds Web App Manifest with no pain</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://pwa.nuxtjs.org" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pwa.nuxtjs.org</div></div></div></div></a>



<p>アプリの名前や言語については最低限カスタマイズしておくことをおすすめします。</p>



<pre class="wp-block-code"><code>  // PWA module configuration: https://go.nuxtjs.dev/pwa
  pwa: {
    manifest: {
      lang: 'ja',
      name: "バスずかん|仙台を中心としたバスの図鑑",
      short_name: "バスずかん"
    },
  },</code></pre>



<p>スマホやタブレットで表示されるアプリ名はshort_nameで設定します。nameはPCにインストールしたときに表示される名前です。</p>



<p>実際にリリースする場合はもっと細かくカスタマイズすることになります。</p>



<h2 class="wp-block-heading" id="まとめ">まとめ</h2>



<p>とてもかんたんですよね♪</p>



<p>当記事ではPWA対応させる最低限の方法を紹介しました。ドキュメントには数多くのオプションが掲載されていますので、一度目を通してみることをおすすめします。</p>




<a rel="noopener" href="https://pwa.nuxtjs.org/" title="Introduction" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://pwa.nuxtjs.org/preview.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Introduction</div><div class="blogcard-snippet external-blogcard-snippet">Supercharge Nuxt with a heavily tested, updated and stable PWA solution</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://pwa.nuxtjs.org" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pwa.nuxtjs.org</div></div></div></div></a>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1067/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【PWA】ランタイムキャッシュを実装するには？動かないときにチェックするところは？</title>
		<link>https://takabus.com/tips/350/</link>
					<comments>https://takabus.com/tips/350/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Thu, 07 Oct 2021 07:43:58 +0000</pubDate>
				<category><![CDATA[Vue.js]]></category>
		<category><![CDATA[PWA]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=350</guid>

					<description><![CDATA[PWAでのランタイムキャッシュに関することをまとめておきます。実装方法から動かないときの対処法までメモしておきます。]]></description>
										<content:encoded><![CDATA[
<p>PWAでのランタイムキャッシュに関することをまとめておきます。</p>



<h2 class="wp-block-heading">ランタイムキャッシュとは？</h2>



<p><span class="marker-under"><strong>動的にアクセスされたリソースをキャッシュさせること</strong></span>をいいます。</p>



<p>例えば、APIで取得したjsonを保存しておき、オフラインでも見れるようにするといったことができます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="442" height="265" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-18.png" alt="chrome devtool" class="wp-image-351" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-18.png 442w, https://takabus.com/tips/wp-content/uploads/2021/10/image-18-300x180.png 300w" sizes="(max-width: 442px) 100vw, 442px" /><figcaption>キャッシュを参照させることで、パケットやローディングタイムを削減できます。</figcaption></figure>



<h2 class="wp-block-heading">@vue/cli-plugin-pwaならかんたんに実装できる！</h2>



<p>Vueで作成したプロジェクトであれば、<strong><span class="bold-red">@vue/cli-plugin-pwa</span></strong>というパッケージを追加することで、かんたんにランタイムキャッシュを実装できます。</p>




<a rel="noopener" href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa" title="vue-cli/packages/@vue/cli-plugin-pwa at dev · vuejs/vue-cli" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/845c070c378d4899a47ff9b5acdff764eff713805489e3216abf72a48ad3bfcd/vuejs/vue-cli" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">vue-cli/packages/@vue/cli-plugin-pwa at dev · vuejs/vue-cli</div><div class="blogcard-snippet external-blogcard-snippet">🛠️ webpack-based tooling for Vue.js Development. Contribute to vuejs/vue-cli development by creating an account on GitHu...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>通常はservice-workerを手動で実装する必要がありますが、このパッケージを入れてしまえばイチコロです！</p>



<h2 class="wp-block-heading">手順</h2>



<p>さっそくランタイムキャッシュを実装する手順を紹介。</p>



<h3 class="wp-block-heading">@vue/cli-plugin-pwaをインストール </h3>



<p>npmなどで @vue/cli-plugin-pwaをインストールします。</p>



<pre class="wp-block-code"><code>npm install "@vue/cli-plugin-pwa"</code></pre>



<p>PWA対応だけではなく、プレキャッシュやランタイムキャッシュ（APIキャッシュ）も容易に実装できます。</p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p><span class="bold"><span class="fz-22px"><span class="marker-under">プレキャッシュは自動的に有効になる</span></span></span></p>



<p>@vue/cli-plugin-pwaをインストールすれば、自動的にプレキャッシュは有効になります。</p>



<p>jsやcss、画像ファイルなどのアセットは、初回アクセス時に自動的にキャッシュされるようになります。</p>
</div>



<h3 class="wp-block-heading">ランタイムキャッシュを有効にする</h3>



<p>この記事の本題であるランタイムキャッシュ。</p>



<p>@vue/cli-plugin-pwaなら、vue.config.jsに以下を追加するだけでOKです。</p>



<pre class="wp-block-code"><code>module.exports = {
pwa: {
    name: 'PWAアプリケーション名',
    themeColor: 'テーマカラー(#aabbccなどで指定する)',
    manifestOptions: {

        background_color: "#adcdff"
    },
    workboxPluginMode: 'GenerateSW',
   <strong> workboxOptions: {
        runtimeCaching: &#91;{
            // キャッシュするファイルのURLを正規表現で指定する
            urlPattern: new RegExp( "https://hoge.com/.*"),
            handler: 'CacheFirst',
        }]
    }</strong>
},
}</code></pre>



<h3 class="wp-block-heading">ビルドする</h3>



<p>npm run buildを実行し、ビルドします。</p>



<p>すると、service-worker.jsが自動的に作成され、ランタイムキャッシュが有効になります。</p>



<p>あとはサーバーにアップすれば、キャッシュが動作するようになります。</p>



<h2 class="wp-block-heading">動かないときのチェックポイント</h2>



<p>ここまで実装方法を記してみましたが、うまくいかないときのチェックポイントをまとめておきます。</p>



<h3 class="wp-block-heading">チェック① service-worker.jsにランタイムキャッシュの部分が出力されているか？</h3>



<p>まずはここをチェックしましょう。</p>



<p>buildすると、distフォルダにservice-worker.jsというファイルが出力されます。これにランタイムキャッシュの部分が正しく出力されているか確認します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="915" height="734" src="https://takabus.com/tips/wp-content/uploads/2021/10/image-19.png" alt="" class="wp-image-353" srcset="https://takabus.com/tips/wp-content/uploads/2021/10/image-19.png 915w, https://takabus.com/tips/wp-content/uploads/2021/10/image-19-300x241.png 300w, https://takabus.com/tips/wp-content/uploads/2021/10/image-19-768x616.png 768w" sizes="(max-width: 915px) 100vw, 915px" /><figcaption>registerRouteという記載があれば、正しく出力されています。</figcaption></figure>



<p>出力されていない場合は、vue.config.jsを確認し、記述があっているか確認してください。</p>



<h3 class="wp-block-heading">チェック② URLパターンがあっているか？</h3>



<p>問題なくランタイムキャッシュさせるコードが出力されている場合は、内容があっているか確認します。urlPatternが正しいかチェックします。</p>



<pre class="wp-block-code"><code>urlPattern: new RegExp("https://korekore.com/hoge/.*")</code></pre>



<p>urlPatternにはRegExpを使うことができます。</p>



<ul><li>HTTPSであること</li><li>ホストは自由に指定できる（PWAをホストするサーバーとは別のホストでも動作します）</li><li>Javascriptの正規表現で指定すること</li></ul>



<h2 class="wp-block-heading">チェック③ ホスティング環境が対応しているか？</h2>



<p>ホスティング環境にも制限があります。</p>



<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul><li>httpsに完全対応していること</li><li>完全な証明書でホストされていること（自己署名証明書では動作しない）</li><li>なので、テスト環境ではうまく動作しないことがある</li><li>サーバーのトップディレクトリに配置すること（設定のいかんによってはサブディレクトリでも可能だが、通常はトップディレクトリに配置する必要あり）</li><li>ポートは自由（1200や8080でホストしてもOK。ただしHTTPSに対応していること）</li><li></li></ul>
</div>



<p>いろいろと制限があるので、ひとつひとつ確認していく必要があります。</p>



<h2 class="wp-block-heading">axiosでは動かない？→動きます</h2>



<p>axiosでは動かず、fetchをつかってAPIにアクセスしなければならないという話がありますが、これは違います。</p>



<p>axiosでもまったく問題なくキャッシュされます。特殊な仕込みは不要です。</p>



<h2 class="wp-block-heading">参考</h2>



<p>ページにたどり着きにくいので、参考になるドキュメントもメモしておきます。</p>



<p>PWAに関するconfig</p>




<a rel="noopener" href="https://developers.google.com/web/tools/workbox/modules/workbox-webpack-plugin#full_generatesw_config" title="Workbox  |  Chrome for Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fdevelopers.google.com%2Fweb%2Ftools%2Fworkbox%2Fmodules%2Fworkbox-webpack-plugin%23full_generatesw_config?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Workbox  |  Chrome for Developers</div><div class="blogcard-snippet external-blogcard-snippet">Build progressive web apps (PWAs) with Workbox - the Service Worker library from the Chrome team</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://developer.chrome.com/docs/workbox" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developer.chrome.com</div></div></div></div></a>



<p>ランタイムキャッシュに関するオプション</p>




<a rel="noopener" href="https://developers.google.com/web/tools/workbox/reference-docs/latest/module-workbox-build#.RuntimeCachingEntry" title="Modules  |  Chrome for Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fdevelopers.google.com%2Fweb%2Ftools%2Fworkbox%2Freference-docs%2Flatest%2Fmodule-workbox-build%23.RuntimeCachingEntry?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Modules  |  Chrome for Developers</div><div class="blogcard-snippet external-blogcard-snippet">Dig deeper into specific Workbox modules.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://developer.chrome.com/docs/workbox/modules" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developer.chrome.com</div></div></div></div></a>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/350/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
