<?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>Nuxt.js | ばすにっきTips</title>
	<atom:link href="https://takabus.com/tips/category/nuxt-js/feed/" rel="self" type="application/rss+xml" />
	<link>https://takabus.com/tips</link>
	<description>プログラミングやサーバー、日々のTipsをメモしています。</description>
	<lastBuildDate>Sat, 06 Jan 2024 01:02:38 +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>Nuxt.js | ばすにっきTips</title>
	<link>https://takabus.com/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</title>
		<link>https://takabus.com/tips/1826/</link>
					<comments>https://takabus.com/tips/1826/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 10 Sep 2022 11:34:58 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1826</guid>

					<description><![CDATA[GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。]]></description>
										<content:encoded><![CDATA[
<p>GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。</p>



<figure class="wp-block-video"><video autoplay loop src="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4"></video></figure>




<a rel="noopener" href="https://github.com/takabus/laravel-sanctum-nuxt-auth-sample" title="GitHub - takabus/laravel-sanctum-nuxt-auth-sample: SPA authorization sample with Laravel Sanctum and NuxtJS official auth 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://opengraph.githubassets.com/d21366e94ddb9f79d969d63bd8ecae850a3bc73cdaa684917fbbf24396fecd49/takabus/laravel-sanctum-nuxt-auth-sample" 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">GitHub - takabus/laravel-sanctum-nuxt-auth-sample: SPA authorization sample with Laravel Sanctum and NuxtJS official auth module.</div><div class="blogcard-snippet external-blogcard-snippet">SPA authorization sample with Laravel Sanctum and NuxtJS official auth module. - takabus/laravel-sanctum-nuxt-auth-sampl...</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://github.com/takabus/laravel-sanctum-nuxt-auth-sample" 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>Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/940/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけ簡単に実装する方法を紹介していきます。第1回はLaravel Sanctumを使ったSPA認証対応のバックエンド構築の手順について紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.04.18</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1396/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.07.29</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading">クローンする</h2>



<p>まずはGitHubからクローンしてください。</p>



<pre class="wp-block-code"><code>git clone https://github.com/takabus/laravel-sanctum-nuxt-auth-sample.git</code></pre>



<h2 class="wp-block-heading">インストール（フロントエンド）</h2>



<p>必要なライブラリをインストールします。</p>



<p>frontディレクトリでコンソールを起動し、npm installを実行します。</p>



<pre class="wp-block-code"><code>cd front
# フロントエンド（NuxtJS）の依存ライブラリをインストール
npm install</code></pre>



<h2 class="wp-block-heading">インストール（バックエンド）</h2>



<p>backディレクトリに移動し、composer installを実行します。</p>



<pre class="wp-block-code"><code>cd back
# バックエンド（Laravel）の依存ライブラリをインストール
composer install</code></pre>



<p>.env.exampleファイルをコピーして、.envファイルを作成します。</p>



<pre class="wp-block-code"><code>cp .env.example .env</code></pre>



<p>.env.exampleにはLaravel Sanctumの動作に必要な変数やテストユーザーを含むSQLiteデータベースへの接続設定が含まれています。詳しくはコメントをご確認ください。</p>



<p>APP_KEYを生成します。</p>



<pre class="wp-block-code"><code>php artisan key:generate</code></pre>



<p>以上でセットアップは完了です。</p>



<h2 class="wp-block-heading">さわってみよう</h2>



<p>Windowsの場合はstart.batを実行すると、バック・フロントエンドの開発サーバーが起動します。</p>



<p>ブラウザでフロントエンドの開発サーバー（http://localhost:3000/）にアクセスすると、SPA認証をお試しいただけます。</p>



<p>あらかじめテストユーザー（ID：t@localhost パスワード：password）を登録してありますので、ログインしてみてください。</p>



<figure class="wp-block-video"><video autoplay loop src="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4"></video></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1826/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://takabus.com/tips/wp-content/uploads/2022/09/CLIP_20220911_192226.mp4" length="522806" type="video/mp4" />

			</item>
		<item>
		<title>【NuxtJS】一発で開発環境を起動するバッチファイル（Windows用）</title>
		<link>https://takabus.com/tips/1773/</link>
					<comments>https://takabus.com/tips/1773/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Wed, 07 Sep 2022 09:54:10 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1773</guid>

					<description><![CDATA[バッチファイルを実行すると、 開発サーバーの起動 Chromeで開発サーバーにアクセスする VS Codeの起動 まで全部やってくれるようにする。 ソースコード NuxtJSのディレクトリに配置する NuxtJSプロジェ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>バッチファイルを実行すると、</p>



<ul><li>開発サーバーの起動</li><li>Chromeで開発サーバーにアクセスする</li><li>VS Codeの起動</li></ul>



<p>まで全部やってくれるようにする。</p>



<h2 class="wp-block-heading">ソースコード</h2>



<pre class="wp-block-code"><code>;NPMを実行
start npm run dev 
;Chromeを開く
start chrome http://localhost:3000/
;VS Codeを開く
start code</code></pre>



<h2 class="wp-block-heading">NuxtJSのディレクトリに配置する</h2>



<p>NuxtJSプロジェクトのディレクトリに上記コードをbatファイルとして配置する。</p>



<p>自分は<code>start.bat</code>などにしている。</p>



<p>あとは作成したバッチファイルをダブルクリックするだけで、開発環境が立ち上がってくれる。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1773/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NuxtJSでBootstrapのアイコンを使うには？</title>
		<link>https://takabus.com/tips/1736/</link>
					<comments>https://takabus.com/tips/1736/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 04 Sep 2022 07:58:36 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1736</guid>

					<description><![CDATA[NuxtJSでBootstrapのアイコンを使えるようにする手順を紹介します。]]></description>
										<content:encoded><![CDATA[
<p>NuxtJSでBootstrapのアイコンを使えるようにする手順を紹介します。</p>



<h2 class="wp-block-heading">Bootstrap Iconsを使えるようにしよう</h2>



<p>まずはBootstrap Iconsを使えるようにしていきます。</p>



<p>はじめにBootstrap Iconsをインストールします。</p>



<pre class="wp-block-code"><code>npm i bootstrap-icons</code></pre>



<p>つづいて、すべてのページでアイコンを利用できるようにするためのプラグインを作成します。</p>



<p>NuxtJSプロジェクトのトップに<code>plugins</code>ディレクトリを作成し、<code>bootstrap-vue-icon.js</code>というファイルを作成します。</p>



<p>作成した<code>bootstrap-vue-icon.js</code>に以下のコードを追加します。</p>



<pre class="wp-block-code"><code>import Vue from 'vue'
import { BootstrapVue, BootstrapVueIcons } from 'bootstrap-vue'
Vue.use(BootstrapVue)
Vue.use(BootstrapVueIcons)</code></pre>



<p><code>nuxt.config.js</code>を開き、作成したプラグインを読み込むようにします。</p>



<pre class="wp-block-code"><code>  plugins: &#91;
    <strong>'@plugins/bootstrap-vue-icon.js'</strong>
  ],</code></pre>



<p>これですべてのページでBootstrapVueのアイコンが利用できるようになります。</p>



<h2 class="wp-block-heading">アイコンを利用する</h2>



<p>BootstrapVueを利用している場合は、b-icon-につづけてアイコンの名前を指定したタグを配置すると、アイコンを表示することができます。</p>



<p>例えばemoji-smileというアイコンを利用したい場合は、<code>&lt;b-icon-emoji-smile /&gt;</code>とすればOKです。</p>



<pre class="wp-block-code"><code><code>&lt;b-icon-emoji-smile&gt;<span style="background-color: inherit; font-size: inherit;">&lt;/</span><span style="background-color: inherit; font-size: inherit;">b-icon-emoji-smile</span><span style="background-color: inherit; font-size: inherit;">&gt;</span></code></code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="93" height="77" src="https://takabus.com/tips/wp-content/uploads/2022/09/image-13.png" alt="" class="wp-image-1738"/></figure>



<p>もしくはb-iconで指定することもできます。</p>



<pre class="wp-block-code"><code>&lt;b-icon icon="<span style="background-color: inherit; font-size: inherit;">emoji-smile</span>"&gt;&lt;/b-icon&gt;</code></pre>




<a rel="noopener" href="https://icons.getbootstrap.com/icons/emoji-smile/" title="Emoji smile" 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://icons.getbootstrap.com/assets/img/bootstrap-icons-social.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">Emoji smile</div><div class="blogcard-snippet external-blogcard-snippet">Official open source SVG icon library for Bootstrap</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://icons.getbootstrap.com/icons/emoji-smile/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">icons.getbootstrap.com</div></div></div></div></a>



<p>利用できるアイコンはBootstrap Iconsのホームページから調べることができます。</p>




<a rel="noopener" href="https://icons.getbootstrap.com/" title="Bootstrap Icons" 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://icons.getbootstrap.com/assets/img/bootstrap-icons-social.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">Bootstrap Icons</div><div class="blogcard-snippet external-blogcard-snippet">Official open source SVG icon library for Bootstrap</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://icons.getbootstrap.com/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">icons.getbootstrap.com</div></div></div></div></a>



<h2 class="wp-block-heading">アイコンのサイズを変えるには？</h2>



<p>アイコンのサイズはstyleでフォントサイズを変更すると変えることができます。</p>



<pre class="wp-block-code"><code>&lt;b-icon-emoji-smile style="font-size:1.5rem"&gt;&lt;/b-icon-emoji-smile&gt;</code></pre>



<p>同様に色を変えるにはcolorを変更すればOK。文字列の装飾と同じ要領でスタイリングできます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1736/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【NuxtJS】「Can&#8217;t resolve &#8216;sass-loader&#8217;」エラーの解決法</title>
		<link>https://takabus.com/tips/1726/</link>
					<comments>https://takabus.com/tips/1726/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 04 Sep 2022 06:26:32 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1726</guid>

					<description><![CDATA[NuxtJSでSCSSなどを使おうとすると、エラーが発生することがあります。対処法をメモしておきます。]]></description>
										<content:encoded><![CDATA[
<p>NuxtJSでSCSSなどを使おうとすると、以下のようなエラーが発生することがあります。</p>



<pre class="wp-block-code"><code>Can't resolve 'sass-loader' in ...</code></pre>



<p>これはSCSSに対応したプリプロセッサがインストールされていないためです。</p>



<h2 class="wp-block-heading">解決法</h2>



<p>次のコマンドを実行し、sass-loaderをインストールすると解決できます。（NuxtJS Ver.2の場合）</p>



<pre class="wp-block-code"><code>npm install --save-dev pug pug-plain-loader
npm install --save-dev sass sass-loader@10</code></pre>



<p>詳細はNuxtJSの公式サイトに記載されていますので、確認してみるとよいでしょう。</p>




<a rel="noopener" href="https://nuxtjs.org/docs/features/configuration/#pre-processors" title="Configuration" 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://v2.nuxt.com/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">Configuration</div><div class="blogcard-snippet external-blogcard-snippet">By default, Nuxt is configured to cover most use cases. This default configuration can be overwritten with the nuxt.conf...</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://nuxtjs.org/docs/features/configuration/#pre-processors" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">nuxtjs.org</div></div></div></div></a>



<p>sass-loader<span style="text-decoration: underline;">@10</span>と必ずバージョンを指定する必要があります。これにて無事エラーが解決しました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1726/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Nuxt.js】コンソールにエラーが！Nuxt.jsのデバッグのしかた</title>
		<link>https://takabus.com/tips/816/</link>
					<comments>https://takabus.com/tips/816/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 04 Sep 2022 02:46:14 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=816</guid>

					<description><![CDATA[Nuxt.jsでコンソールにエラーが表示されるときのデバッグのしかたをメモしておきます。]]></description>
										<content:encoded><![CDATA[
<p><span class="marker-under"><strong>Nuxt.jsでコンソールにエラーが表示されるときのデバッグのしかた</strong></span>をメモしておきます。（ちょっと雑な記事です。参考程度にどうぞ。）</p>



<h2 class="wp-block-heading">ある日のトラブル</h2>



<p>ある日、Nuxt.jsで制作したサイトで下位のページからトップページに遷移しようとすると、ページが表示されなくなるというトラブルに悩まされました。</p>



<p>このときコンソールには次のようなエラーが。</p>



<pre class="wp-block-code"><code>Cannot read properties of null (reading 'destroy')</code></pre>



<pre class="wp-block-code"><code>Cannot read properties of undefined (reading '_isDestroyed')</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="557" height="330" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-17.png" alt="" class="wp-image-817" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-17.png 557w, https://takabus.com/tips/wp-content/uploads/2022/01/image-17-300x178.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></figure>



<p>どうやってデバッグしていくのでしょうか。</p>



<h2 class="wp-block-heading">まずは指摘されたリンクをクリック！</h2>



<p>まず<span class="red"><span class="marker-under"><strong>エラーが起こっている関数名</strong></span></span><span class="marker-under"><strong>に注目しましょう。</strong></span></p>



<p>ここではdestroyという単語が目に入ります。エラーを見るにdestoryイベントに問題があるようです。</p>



<p>しかし、destroyイベントは自分が書いたソースコード内では使用しておらず、なぜ発生しているのかがわりませんでした。</p>



<p>こういうときは、<span class="bold-red"><span class="marker-under"><span class="fz-20px">とにかくコンソールに表示されているリンクをクリック</span></span></span>するようにします。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="557" height="330" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-18.png" alt="" class="wp-image-818" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-18.png 557w, https://takabus.com/tips/wp-content/uploads/2022/01/image-18-300x178.png 300w" sizes="(max-width: 557px) 100vw, 557px" /></figure>



<p>リンクをクリックすると、DevToolがSourceタブに切り替わり、エラーが発生している箇所がハイライトされます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="789" height="553" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-19.png" alt="" class="wp-image-819" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-19.png 789w, https://takabus.com/tips/wp-content/uploads/2022/01/image-19-300x210.png 300w, https://takabus.com/tips/wp-content/uploads/2022/01/image-19-768x538.png 768w" sizes="(max-width: 789px) 100vw, 789px" /></figure>



<p>ソースがminimumizeされていて見づらい場合は、ソースコードの左下にある｛｝をクリックしましょう。コードがフォーマットされ、見やすくなります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="235" height="139" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-23.png" alt="" class="wp-image-823"/></figure>



<p>コンソールに表示されているリンクをクリックしていき、原因を探します。これを繰り返していくと、いずれ根本的な原因となっている部分にたどり着きます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="626" height="312" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-20.png" alt="" class="wp-image-820" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-20.png 626w, https://takabus.com/tips/wp-content/uploads/2022/01/image-20-300x150.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></figure>



<p><span class="bold-red"><span class="fz-20px">怪しいワードが出てきました。</span></span></p>



<p>splideというのはこのサイトで使用していたモジュール「Splide.js」のことでしょう<strong>。<span class="marker-under"><span class="red">使用しているプラグインやモジュールの名前を頭に浮かべながら、コードを読み解いていくのがコツです。</span></span></strong></p>



<p>Splide.jsで何らかのエラーが起こっていることが推察されます。</p>



<p>あとはSplide.jsとエラー内容をあわせてGoogle検索してみます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="925" height="761" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-21.png" alt="" class="wp-image-821" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-21.png 925w, https://takabus.com/tips/wp-content/uploads/2022/01/image-21-300x247.png 300w, https://takabus.com/tips/wp-content/uploads/2022/01/image-21-768x632.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></figure>



<p>原因と思われるSplide.jsのAPIドキュメントを見てみると、destoryという設定が用意されています。試しにfalseに設定してみました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="621" height="258" src="https://takabus.com/tips/wp-content/uploads/2022/01/image-22.png" alt="" class="wp-image-822" srcset="https://takabus.com/tips/wp-content/uploads/2022/01/image-22.png 621w, https://takabus.com/tips/wp-content/uploads/2022/01/image-22-300x125.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></figure>



<p>すると、エラーが解消！無事バグを修正することができました。</p>



<h2 class="wp-block-heading">わかりにくいエラーこそ着実につぶそう</h2>



<p>Nuxt.jsはSSRなどの複雑なしくみのため、エラーが発生しても原因がわかりにくいことが多いです。</p>



<p>DevToolのコンソールに表示されているエラーリンクをひとつひとつたどっていくのが、結局は一番早いことが多いため、紹介してみました。経験的にはプラグインやモジュールによるエラーが多いので、Nuxt自体のバグを疑う前に自分で追加したモジュールまわりを疑ってみるといいでしょう。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/816/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</title>
		<link>https://takabus.com/tips/1396/</link>
					<comments>https://takabus.com/tips/1396/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 29 Jul 2022 04:36:21 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1396</guid>

					<description><![CDATA[Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。]]></description>
										<content:encoded><![CDATA[
<p>前回はLaravel Sanctumをインストールし、バックエンド側のAPI認証を実装しました。第2回ではnuxt/authを使用し、NuxtJSで構築したフロントエンドにログイン機能を実装していきます。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-prev">

<a href="https://takabus.com/tips/940/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけ簡単に実装する方法を紹介していきます。第1回はLaravel Sanctumを使ったSPA認証対応のバックエンド構築の手順について紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.04.18</div></div></div></div></a>
</div>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-pickup block-box has-border-color has-green-border-color">
<ul id="block-14c748bc-4402-4f8d-b7d3-ade67c6657b5"><li>第1回 バックエンド（Laravel Sanctum）編 <a href="https://takabus.com/tips/940/">https://takabus.com/tips/940/</a></li><li>第2回 フロントエンド（nuxt/auth）編 <a href="https://takabus.com/tips/1396/">https://takabus.com/tips/1396/</a>（←今回）</li></ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>GitHubにサンプルを公開していますので、ぜひご活用ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1826/" title="【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.09.10</div></div></div></div></a>
</div></figure>



<p>Laravel SanctumとNuxt/AuthによるSPA認証を体験いただくことができます。</p>



<p>(2022/9/11追記)</p>
</div></div>



<h2 class="wp-block-heading">nuxt/authのインストール</h2>



<p>まずは、nuxt.jsプロジェクトにnuxt/authをインストールしましょう。</p>



<pre class="wp-block-code"><code>npm install --save-exact @nuxtjs/auth-next</code></pre>



<p>nuxt/authは、Nuxt.jsのプロジェクトに認証に関する処理をかんたんに実装することができるモジュールです。第1回で構築したLaravel Sanctumだけではなく、OAuthやLaravel JWT、Laravel Passportなどのさまざまな認証バックエンドと連携させることができます。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-comment block-box">
<p>既存のNuxt.jsプロジェクトに認証機能を追加したい場合は、上記コマンドでnuxt/authをインストールします。まだプロジェクトを作成していない場合は、次のコマンドでNuxtプロジェクトを作成してからインストールしましょう。</p>



<pre class="wp-block-code"><code>npm init nuxt-app &lt;project-name&gt;</code></pre>



<p>いくつかオプションを問われますが、わからないときはすべてNoneを選択しておけば問題ありません。</p>
</div>



<p>APIとの通信に使用するため、nuxt/axiosもインストールしておきましょう。</p>



<pre class="wp-block-code"><code>npm install @nuxtjs/axios</code></pre>



<p>nuxt.config.jsを編集し、nuxt/authとnuxt/axiosをモジュールに追加します。</p>



<pre class="wp-block-code"><code>{
  modules: &#91;
<strong>    '@nuxtjs/axios',
    '@nuxtjs/auth-next'</strong>
  ],
  <strong>auth: {

  }</strong>
}</code></pre>



<p>ついでにauthセクションも追加しておきました。あとで使います。</p>



<h2 class="wp-block-heading">nuxt/authのセットアップ</h2>



<p>次に、nuxt/authのセットアップを行っていきます。Laravel Sanctumで構築したバックエンドにログインし、保護されたルートにアクセスできるようにしていきます。</p>



<h3 class="wp-block-heading">ストラテジー（strategy）を作成する</h3>



<p>nuxt/authでは、認証に関わる設定を<strong>ストラテジー(strategy)</strong>として設定していきます。</p>



<p>ストラテジーは同時に複数定義することができます。例えば、APIサーバーのほか、OAuthを用いた連携ログインも可能にするなど、複数のログイン方法を用意することも可能となっています。</p>



<p>ここではシンプルに第1回で構築したバックエンド（Laravel Sanctum）にログインするためのストラテジーだけを作成していきます。</p>



<p>nuxt.config.jsのauthセクションにstrategiesというセクションを追加し、任意の名前のストラテジーを作成します。</p>



<pre class="wp-block-code"><code>    auth: {
       <strong> strategies: {</strong>
           <strong> laravelApi: {
                provider: 'laravel/sanctum',
            },</strong>
       <strong> }</strong>
    },</code></pre>



<p>ここでは、<em>&#8220;laravelApi&#8221;</em>という名前のストラテジーを作成し、プロバイダーにLaravel Sanctumを指定しました。</p>



<h3 class="wp-block-heading">エンドポイントを設定しよう</h3>



<p>バックエンドのベースURLと認証に関わるルートを設定していきます。</p>



<pre class="wp-block-code"><code>    auth: {
        redirect: {
            login: '/auth/login',
        },
        strategies: {
            laravelApi: {
<strong>                provider: 'laravel/sanctum',</strong>
                <strong>url: 'http://localhost:8000',</strong>
<strong>                // endpoints: {
                //   login: { url: '/api/login', method: 'post' },
                //   logout: { url: '/api/logout', method: 'post' },
                //   user: { url: '/api/user', method: 'get' }
                // }</strong>
            },
        }
    },</code></pre>



<p>urlにバックエンドのURLを指定します。ここではLaravelのローカルサーバー(http://localhost:8000)を指定しています。</p>



<p>また、endpointsにログイン・ログアウト・ユーザー情報を取得するためのAPIへのパスを指定しておきます。デフォルトでは以下のように設定されています。</p>



<figure class="wp-block-table"><table><tbody><tr><td>login</td><td>/login</td></tr><tr><td>logout</td><td>/logout</td></tr><tr><td>user</td><td>/user</td></tr></tbody></table></figure>



<p>今回は、第1回でroutes/web.phpに上記と同じルートを指定しておいたため、endpointsに関する設定は不要です。デフォルトと異なるルートを設定している場合は、endpointsにパスを指定することにより、任意のエンドポイントを使用できます。</p>



<h3 class="wp-block-heading">リダイレクトの設定</h3>



<p>次に、<strong>リダイレクト</strong>に関わる設定を行います。</p>



<p>nuxt/authを導入すると、認証が必要なページへのアクセスを制限することができます。ログインされていない状態で認証が必要なページへアクセスされた場合、自動的にログインページへリダイレクトさせることができます。</p>



<p>リダイレクト先には任意のページを指定することができます。nuxt.config.jsから設定していきます。</p>



<pre class="wp-block-code"><code>auth: {
<strong>    redirect: {
        login: '/auth/login',
    },</strong>
    strategies: {
        laravelApi: {
            provider: 'laravel/sanctum',
            url: 'http://localhost:8000',

    }
}, </code></pre>



<p>authセクションにログインページのパスを指定します。上のサンプルでは、ログインページがpages/auth/login.vueにあるものとして設定してみました。</p>



<p>そして、routerにauthミドルウェアを適用します。</p>



<pre class="wp-block-code"><code>router: {
     mode: "hash",
     base: process.env.BASE_URL,
    <strong> middleware: &#91;'auth']</strong>
},</code></pre>



<p>routerのミドルウェアへの登録を忘れると、リダイレクトが動作しませんので要注意です。なお、開発環境で一時的にリダイレクトさせないようにしたいときは、ミドルウェアから外してやればOKです。</p>



<h3 class="wp-block-heading">axiosからAPIへアクセスできるようにする</h3>



<p>以上で認証に関するセットアップのほとんどが完了です。ログインやログアウトはすでに可能な状態になっています。</p>



<p>しかし、まだこの状態ではバックエンドのAPIにアクセスすることはできません。ログインが済んでいたとしても、axiosからsanctumでガードされたAPIにアクセスしようとすると、401 Unauthorizedエラーが発生してしまいます。</p>



<p><strong>これはnuxt/authでログインし取得できたCSRFトークンやクッキーなどの資格情報が、axiosからのリクエストに含まれていないことが原因です。</strong></p>



<p>axiosにはcredentialsというオプションがあり、これを有効にすることで資格情報をリクエストと一緒にサーバーへ送ることができます。nuxt.config.jsからオプションを適切に設定することで、正常にAPIへアクセスできるようになります。</p>



<pre class="wp-block-code"><code>axios: {
    baseURL: 'http://localhost:8000',
    <strong>credentials: true</strong>
},</code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>credentialsを有効にすると、CSRFトークンの取得・更新処理も自動的に行なってくれるようになります。明示的にトークンの更新を行う必要もなくなるので、大変便利なオプションです。</p>
</div></div>



<p>オプションを設定したら、npmの開発サーバーを再起動しておきましょう。</p>



<pre class="wp-block-code"><code>Ctrl+C
$ npm run dev</code></pre>



<h2 class="wp-block-heading">ログインページをつくって、いざログイン！</h2>



<p>さあ、これで準備は万端です。いよいよ実際にログインしてみましょう。</p>



<p>pagesディレクトリにログインページ(pages/auth/login.vue)を作成します。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
    &lt;input type="text" v-model="id" placeholder="id"&gt;
    &lt;input type="password" v-model="password" placeholder="パスワード"&gt;
    &lt;button @click="login"&gt;ログイン&lt;/button&gt;
&lt;/template&gt;

&lt;script&gt;
    export default {
        auth: false,
        data() {
            return {
                id: null,
                password: null
            }
        },
        methods: {
            login() {
                try {
                    // ログインする
                    const response = await this.$auth
                        .loginWith("laravelApi", {
                            data: {
                                id: this.id,
                                password: this.password
                            }
                        })
                        .then(() =&gt; {
                            // ログインに成功したら、/にページ遷移
                            window.alert("ログインしました");
                            this.$router.push("/");
                        });
                    console.log(response);
                } catch (error) {
                    // ログインに失敗したら、コンソールに出力する
                    window.alert("ログイン失敗");
                    console.log(error);
                }
            }
        }
    }
&lt;/script&gt;</code></pre>



<p>作成したページはこんな感じです。IDとパスワードを入力し、[ログイン]ボタンをクリックすると、nuxt/authによりログインが施行されるようにしました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="457" height="113" src="https://takabus.com/tips/wp-content/uploads/2022/07/image.png" alt="" class="wp-image-1430" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/image.png 457w, https://takabus.com/tips/wp-content/uploads/2022/07/image-300x74.png 300w" sizes="(max-width: 457px) 100vw, 457px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここではわかりやすくするため、最低限の処理を実装しています。実際の案件では、バリデーションなども適切に実装するようにしましょう。</p>
</div></div>



<div class="wp-block-cocoon-blocks-micro-balloon-2 micro-balloon micro-top mc-circle micro-copy has-background has-amber-background-color"><span class="micro-balloon-content micro-content">解説</span></div>



<p>ログインを施行するには、<code>$auth.loginWith</code>メソッドを使います。</p>



<pre class="wp-block-code"><code>// ログインする
const response = await <strong>this.$auth
    .loginWith("laravelApi", {
        data: {
            id: this.id,
            password: this.password
        }
    })</strong>
    .then(() =&gt; {
        // ログインに成功したら、/にページ遷移
        window.alert("ログインしました");
        this.$router.push("/");
    });
</code></pre>



<p>第1引数にストラテジー名(ここでは<em>laravelApi</em>)、第2引数にログインに使用するIDとパスワードを指定します。ログインボタンがクリックされたら実行されるよう、[ログイン]ボタンにclickイベントを設定しておきます。ログインに失敗した場合はcatchで受けて、”ログイン失敗”というアラートを表示させています。</p>



<p>ちなみに<code>auth:false</code>という部分は、ログインしていなくてもページを表示できるようにするためのものです。デフォルトでは各ページに<code>auth:true</code>が設定されており、ログインしないとページの表示がされないようになっています。当然ながら、ログインページはログインしていない状態で表示される必要があるため、<code>auth:false</code>を指定しています。</p>



<pre class="wp-block-code"><code>&lt;script&gt;
    export default {
        <strong>auth: false,</strong></code></pre>



<p>ログイン後は/に遷移するようにしていますので、ログイン後に表示されるページ（pages/index.vue）も作成しておきましょう。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
    &lt;h1&gt;ログインしました♪&lt;/h1&gt;
&lt;/template&gt;</code></pre>



<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="320" height="88" src="https://takabus.com/tips/wp-content/uploads/2022/07/image-1.png" alt="" class="wp-image-1431" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/image-1.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/image-1-300x83.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></figure>



<p>ページを作成したら、さっそくログインしてみてください。うまくいきましたか？</p>



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



<p>いかがでしたでしょうか。</p>



<p>SPA認証を実装しようとすると、本来はCSRFトークンの更新からクッキーに資格情報をセットしたりなど、複雑な処理を実装していく必要がありますが、Laravel Sanctumとnuxt/authを組み合わせると、かんたんにSPA認証を実装することができます。</p>



<p>参考になれば幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1396/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nuxt.jsのローディングバーを非表示にするには？ページ・リクエストごとに設定するには？</title>
		<link>https://takabus.com/tips/1419/</link>
					<comments>https://takabus.com/tips/1419/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Tue, 19 Jul 2022 04:55:07 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1419</guid>

					<description><![CDATA[Nuxt.jsおよびnuxt/axiosを使用している環境で、特定のページもしくは特定のリクエストのみプログレスバーを非表示にする方法を紹介します。]]></description>
										<content:encoded><![CDATA[
<p>Nuxt.jsおよびnuxt/axiosを使用している環境で、特定のページもしくは特定のリクエストのみプログレスバーを非表示にする方法を紹介します。</p>



<h2 class="wp-block-heading">すべてのページで非表示にするには？</h2>



<p>すべてのページでローディングバーを非表示にするには、nuxt.config.jsでloadingオプションをfalseにします。</p>



<pre class="wp-block-code"><code>export default {
    <strong>loading:false</strong>
}</code></pre>



<p>これだけでローディングバーは表示されなくなります。</p>



<h2 class="wp-block-heading">特定のページだけバーを非表示にするには？</h2>



<p>では、<strong>特定のページだけローディングバーを表示させたくないとき</strong>は、どのようにするのでしょうか。</p>



<p>実はまったく方法は変わりません。<strong>非表示にしたいページのexport default内に<code>loading:false</code>を指定するだけです。</strong></p>



<pre class="wp-block-code"><code>&lt;template>
  
&lt;/template>

&lt;script>
export default {
     <strong>loading:false</strong>
}
&lt;/script></code></pre>



<p><code>loading:false</code>が指定されているページのみ、ローディングバーが表示されなくなります。</p>



<h2 class="wp-block-heading">特定のリクエストだけバーを非表示にする</h2>



<p>さらに<strong>特定のリクエストだけバーを非表示にさせる</strong>には、どうすればよいのでしょうか。</p>



<p>例えば、<em>/api/main</em>へのアクセス時はプログレスバーを表示したいが、<em>/api/sub</em>に対するアクセスではバーを表示させなくてよいというケースです。</p>



<p>こういったときは、nuxt/axiosのprogressオプションを活用します。</p>



<pre class="wp-block-code"><code>this.$axios.$get('/api/sub', <strong>{ progress: false }</strong>)</code></pre>



<p>バーを表示させたくないaxiosのオプションに<code>progress:false</code>を指定します。すると、そのリクエストだけローディングバーが表示されなくなります。</p>



<p>バックグラウンドで定期的にデータを取得させる場合など、いちいちバーを表示させる必要がないときに使える手法です。</p>



<h2 class="wp-block-heading">ドキュメント</h2>



<p>Nuxt/jsのローディングバーに関しては、ほかにもさまざまなオプションが用意されており、バーの色や太さもかんたんに変更することができます。</p>




<a rel="noopener" href="https://nuxtjs.org/docs/features/loading/" title="Loading" 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://v2.nuxt.com/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">Loading</div><div class="blogcard-snippet external-blogcard-snippet">Out of the box, Nuxt gives you its own loading progress bar component that&#039;s shown between routes. You can customize it,...</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://nuxtjs.org/docs/features/loading/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">nuxtjs.org</div></div></div></div></a>



<p>公式ドキュメントにまとめられていますので、確認してみることをおすすめします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1419/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第1回 バックエンド編）</title>
		<link>https://takabus.com/tips/940/</link>
					<comments>https://takabus.com/tips/940/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Mon, 18 Apr 2022 11:22:30 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Nuxt.js]]></category>
		<category><![CDATA[Laravel Sanctum]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=940</guid>

					<description><![CDATA[Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。]]></description>
										<content:encoded><![CDATA[
<p><strong><span class="marker-under"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-orange-color">Laravel</mark> とフロントエンドフレームワーク「<span class="bold-green">Nuxt.js</span>」を使い、<span class="bold-red">SPA認証</span>（<span class="bold-red">ログイン機能</span>）をできるだけかんたんに実装する方法を紹介していきます。</span></strong></p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-pickup block-box has-border-color has-green-border-color">
<ul id="block-14c748bc-4402-4f8d-b7d3-ade67c6657b5"><li>第1回 バックエンド（Laravel Sanctum）編 <a href="https://takabus.com/tips/940/">https://takabus.com/tips/940/</a></li><li>第2回 フロントエンド（nuxt/auth）編 <a href="https://takabus.com/tips/1396/">https://takabus.com/tips/1396/</a></li></ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>GitHubにサンプルを公開しました。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1826/" title="【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【nuxt/authｘLaravel SanctumでSPA認証】サンプルを公開しました</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubにNuxtJS（nuxt/auth）とLaravel Sanctumのサンプルプロジェクトを公開しました。Laravel Sanctumとnuxt/authによるSPA認証をすぐに体験できます。Laravel SanctumとNuxtJSによるSPA認証については、以前チュートリアル記事をアップしていますので、ご活用ください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.09.10</div></div></div></div></a>
</div></figure>



<p>Laravel SanctumとNuxt/AuthによるSPA認証を体験いただくことができます。</p>



<p>(2022/9/11追記)</p>
</div></div>



<p>全2回の連載とし、第1回はSPA認証に対応したバックエンドをLaravelで構築する方法について紹介していきます。Laravelでは認証システムを簡単に実装できるライブラリが豊富に用意されており、専門的な知識が十分ではなくても、SPA認証が実装できるようになっています。そこで当記事では、SPA認証におすすめのライブラリ「<span class="red">Laravel Sanctum</span>」の紹介から、実際に実装する手順について解説していきたいと思います。</p>



<p>第2回では、フロントエンドフレーム「Nuxt.js」にログイン機能を実装していきます。Nuxt.js公式の認証モジュール「nuxt/auth」を活用し、<strong>認証に関する難しいコーディングはほぼゼロ</strong>でログイン機能を実装していく方法を紹介していきます。</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-deep-orange-border-color"><div class="label-box-label block-box-label box-label fab-pencil"><span class="label-box-label-text block-box-label-text box-label-text">私の開発環境はコレ！</span></div><div class="label-box-content block-box-content box-content">
<ul><li>PHP 8.0.3（7.4でも問題ありません！）</li><li>Laravel Framework 8.81.0（当記事の内容は<span class="red">Laravel 6・7</span>でも対応しています）</li><li>Nuxt.js 2</li></ul>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>LaravelとNuxt.jsのプロジェクトは、完全に分離して開発されたものとして解説していきます。</p>



<p>なお、LaravelとNuxt.jsを組み合わせた際のSPA認証としては、今回紹介する以外にもたくさんの方法があります。当記事では、LaravelとNuxt.jsに用意されているライブラリをフル活用し、できる限りシンプルに実装する方法を取り上げています。</p>
</div></div>



<h2 class="wp-block-heading" id="まずはspa認証の全体像をチェック">まずはSPA認証の全体像をチェック！</h2>



<p>はじめにSPA認証がどのような流れで行われるかについて、確認しておきましょう。</p>



<div class="wp-block-cocoon-blocks-micro-balloon-2 micro-balloon micro-top mc-circle micro-copy has-background has-green-background-color"><span class="micro-balloon-content micro-content"><span class="micro-balloon-icon micro-icon fab-pencil"></span>SPA認証の処理の流れ</span></div>



<ol><li><strong>【フロントエンド】CSRFトークンを要求</strong></li><li><strong>【バックエンド】CSRFトークンを返し、ブラウザのクッキーにセット<br>【フロントエンド】ログインAPIへメールアドレスとパスワードをPOST</strong></li><li><strong>【バックエンド】認証（正しいパスワードか確認する）し、フロントエンドへ結果を返す</strong></li><li><strong>【フロントエンド】認証に成功したら、ログイン済みページへ遷移する</strong></li></ol>



<p>まず、第一にCSRFトークンの取得が必要となります。</p>



<p>CSRF（Cross-site Request Forgery）トークンというのは、正規のページからアクセスが行われていることを証明するための値のことです。いわば合言葉のようなもので、フロントエンドは必ずCSRFトークンを事前に取得しておき、APIへアクセスするときはCSRFトークンも一緒に渡す必要があります。CSRFトークンが渡されていないときはアクセスを拒否することで、不正なアクセスを防ぐことができます。</p>



<p>おそらくSPA認証を構築するうえで多くの人が躓くのは、CSRFにかかわる部分です。実際にはLaravel Sanctumとnuxt/authを使うことで、よしなに処理してくれるのですが、SPA認証におけるCSRFトークンの仕組みについては、事前にしっかり理解しておいたほうが後々（とくにフロントエンドを実装する第2回で）楽になります。Google検索してあらかじめイメージを掴んでおくことをおすすめします。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1115/" title="CSRFトークンってなんの意味があるの？意外と知らないAPI通信におけるCSRFの仕組み" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/03/CSRFトークンってなに.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">CSRFトークンってなんの意味があるの？意外と知らないAPI通信におけるCSRFの仕組み</div><div class="blogcard-snippet internal-blogcard-snippet">SPAやAPI通信におけるCSRFトークンの仕組みについて解説！トークンだけでどうして守れるのか？</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.03.02</div></div></div></div></a>
</div></figure>



<p>CSRFトークンがうまく取得できれば、あとは通常のログインと同様です。定義しておいたログイン用のルートにメールアドレスやパスワードをPOSTすることで認証できます。</p>



<h2 class="wp-block-heading" id="spa認証ならlaravel-sanctam">SPA認証の面倒な処理は<span class="bold-red">Laravel Sanctum</span>におまかせ！</h2>



<p>SPA認証を実装するには、CSRFトークンの発行や正規のフロントエンドかどうかの判定など、やらなくてはならない処理がたくさん出てきます。それらすべてを自前で実装することも可能ですが、バグの混入のおそれがありますし、セキュリティの観点からも推奨されません。</p>



<p><strong><span class="marker-under">そこで、今回は<span class="bold-red">Laravel Sanctum</span>というライブラリを導入していきます。</span></strong></p>




<a rel="noopener" href="https://laravel.com/docs/9.x/sanctum" title="Laravel Sanctum - Laravel 9.x - The PHP Framework For Web Artisans" 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://laravel.com/images/og/laravel-docs.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">Laravel Sanctum - Laravel 9.x - The PHP Framework For Web Artisans</div><div class="blogcard-snippet external-blogcard-snippet">Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...</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://laravel.com/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">laravel.com</div></div></div></div></a>



<p>Laravel Sanctumは<strong>①SPA認証 ②トークン認証 ③モバイルアプリの認証</strong>を可能とすることに特化したライブラリです。Laravel Sanctumを導入することで、CSRFトークンに関する処理など、SPA認証に特有の処理を自前でコーディングすることなく実装することができます。第2回でフロントエンドに導入する「<strong><span class="bold-red">nuxt/auth</span></strong>」などのモジュールとの相性もとても良いため、単にSPAフロントエンドと連携させたいのであれば、もっともおすすめされるライブラリとなります。</p>



<p>Laravelの公式ドキュメントにも、SPA認証にはLaravel Sanctumが推奨される旨が記載されています。</p>



<blockquote class="wp-block-quote"><p>&nbsp;if you are attempting to authenticate a single-page application, mobile application, or issue API tokens, you should use&nbsp;<a href="https://laravel.com/docs/8.x/sanctum">Laravel Sanctum</a>.&nbsp;</p><cite>https://laravel.com/docs/8.x/passport#passport-or-sanctum</cite></blockquote>



<p>もちろん、ほかのライブラリにもSPA認証を実装できるものはありますが、各ライブラリの比較をしていると到底説明しきれない量になってしまうため、ここでは詳細に踏み込むことは避けておきましょう。とりあえず、<span class="bold-red"><span class="marker-under">シンプルにSPA認証を実装するならLaravel Sanctum</span></span>という認識で問題ありません。</p>



<p>今回はSPA認証ができればOKということで、Laravel Sanctumを導入してAPIからのログインを実装してみたいと思います。</p>



<h2 class="wp-block-heading" id="laravel-sanctumをインストール">Laravel Sanctumをインストール</h2>



<p>まずは<strong><span class="red">Laravel Sanctum</span></strong>をインストールしましょう。</p>



<p>ただし、Laravel 8ではプロジェクトを作成した時点で、すでにLaravel Sanctumがインストールされていますので、この手順は不要です。Laravel SanctumはLaravel 6から使用できます。<span class="marker-under"><strong>Laravel 6～7を使用している方は以下の手順でインストールしましょう。</strong></span></p>



<p>Composerで<strong><span class="bold-red"><span class="marker-under">Laravel Sanctum</span></span></strong>をインストールします。</p>



<pre class="wp-block-code"><code><strong>composer require laravel/sanctum</strong>
Using version ^2.14 for laravel/sanctum
Package manifest generated successfully.
77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
&gt; @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag &#91;laravel-assets].
Publishing complete.</code></pre>



<p>Laravel Sanctumのインストールができたら、Sanctumの利用に必要なファイルを生成するコマンドを実行します。</p>



<pre class="wp-block-code"><code><strong>php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"</strong>
Copied Directory &#91;\vendor\laravel\sanctum\database\migrations] To &#91;\database\migrations]
Publishing complete.</code></pre>



<h2 class="wp-block-heading" id="laravel-sanctumをミドルウェアに追加する">Laravel Sanctumをミドルウェアに追加する</h2>



<p>次に、ミドルウェアにLaravel Sanctumを登録して、Laravel Sanctumを有効にします。</p>



<p>app\Http\Kernel.phpを開き、<span class="marker-under"><strong><span class="red">$middlewareGroups</span>の<span class="red">api</span>にLaravel Sanctumのクラス（\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class）を追加します。</strong></span></p>



<pre class="wp-block-code"><code>・・・中略・・・   
 protected $middlewareGroups = &#91;
        'web' =&gt; &#91;
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' =&gt; &#91;
            <strong>\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,</strong>
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
</code></pre>



<p>Laravel SanctumがもともとインストールされているLaravel 8では、該当の行がコメントアウトされています。この場合はコメントを外せばOKです。</p>



<h2 class="wp-block-heading" id="アクセスを許可するドメインを設定する">アクセスを許可するドメインを設定する</h2>



<p><span class="marker-under"><strong>次にLaravel Sanctumへのアクセスを許可するドメインを指定します。</strong></span></p>



<p>Laravel Sanctumの機能を利用するには、フロントエンドのドメインを設定する必要があります。アクセス元となるフロントエンドのドメインを指定することで、外部からSanctumへの不正なアクセスを防ぐようになっています。</p>



<p>設定はconfig/sanctum.phpから行いますが、<strong>デフォルトでは.envファイルで環境変数として設定することができる</strong>ようになっています。</p>



<p>.envファイルに<strong><span class="marker-under"><span class="red">SANCTUM_STATEFUL_DOMAINS</span></span></strong>キーを追記して、フロントエンドのドメイン（ポート番号含む）を指定します。</p>



<pre class="wp-block-code"><code>SANCTUM_STATEFUL_DOMAINS=localhost:3000</code></pre>



<p>ここではNuxt.jsの開発環境（http://lcoalhost:3000）からアクセスできるように設定しておきました。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>localhost:3000はconfig/sanctum.phpであらかじめ許可設定がなされているため、本当は設定する必要はありませんが、本番環境に移行したときに設定を忘れないよう、あえて明示的に設定しています。</p>
</div></div>



<h2 class="wp-block-heading" id="corsを有効にする">CORSを有効にする</h2>



<p>クロスオリジンになる場合は、Laravelで<strong><span class="bold-red">CORS</span></strong>を有効にしておきます。</p>



<p>クロスオリジンとは、バックエンドとフロントエンドのオリジン（アドレス）が異なる状態のことをいいます。この場合はCORSを明示的に有効にしておかないと、セキュリティ対策のためアクセスが拒否されてしまいます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ローカル環境でもFQDNが異なればクロスオリジンとなります。</p>



<p>例えば、http://localhost:3000でNuxt.jsの開発をしつつ、http://localhost:8080で動作させたLaravelの開発サーバーにアクセスした場合、http://localhost:3000からhttp://localhost:8080へのアクセスが生じることになります。この場合も両者のオリジンは異なるため、CORSの有効化が必要です。</p>
</div></div>



<p>CORSを有効にするには<code>config\cors.php</code>を編集し、<strong><span class="marker-under">supports_credentials</span></strong>をtrueにします。</p>



<pre class="wp-block-code"><code>&lt;?php

return &#91;
    <strong>'paths' => &#91;<span class="red">'*'</span>, 'sanctum/csrf-cookie']</strong>,
    'allowed_methods' => &#91;'*'],
   <strong> 'allowed_origins' => &#91;<span class="red">'*'</span>],</strong>
    'allowed_origins_patterns' => &#91;],
    'allowed_headers' => &#91;'*'],
    'exposed_headers' => &#91;],
    'max_age' => 0,
   <strong> 'supports_credentials' => <span class="red">true</span>,
</strong>
];
</code></pre>



<p>このとき、特定のオリジンからのアクセスのみ許可したい場合は、＊の代わりに許可したいオリジンをallowed_originsに設定しておきましょう。</p>



<pre class="wp-block-code"><code>'allowed_origins' =&gt; &#91;<strong>'http://localhost:3000'</strong>],</code></pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>指定する値は<strong>オリジン</strong>なので<strong><span class="marker-under">FQDN（httpからポート番号まで）</span></strong>を指定します。ホスト名だけではダメ！</p>
</div>



<p>ただし、テスト環境ではひとまず＊にしておくことをおすすめします。正常にログインできることを確認してから制限を厳しくしていくほうが、無用なトラブルを避けることができます。</p>



<h2 class="wp-block-heading" id="セッション-クッキーを許可するドメインを設定する">セッション・クッキーを許可するドメインを設定する</h2>



<p>クロスドメインになっている場合は、セッション・クッキーを許可するドメインも設定する必要があります。</p>



<p>クロスドメインとは、バックエンドとフロントエンドのドメインが異なることをいいます。例えば、Laravelがhoge.com、フロントエンド（Nuxt.jsなど）がfuga.comでホスティングされているような状況です。クロスドメインではバックエンドからブラウザのクッキーを設定することができず、セッションも張ることができなくなります。許可するドメインをしっかり設定しておきましょう。</p>



<p>config/session.phpから設定しますが、.envからも設定できるようになっているので、.envから設定しましょう。</p>



<pre class="wp-block-code"><code>SESSION_DOMAIN=localhost</code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man-150x150.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>セッションクッキードメインを設定することで、クロスドメインになっていてもLaravel側からクライアントにクッキーを設定できるようになります。後で出てくるX-CSRF-TOKENを使用する上で必要となるため、ここで設定を行っておきます。</p>



<p>なお、<strong><span class="marker-under">クロスドメインになっていない場合、当手順は省略できます。</span></strong></p>
</div></div>



<h2 class="wp-block-heading" id="laravel-fortifyのインストール">ログインコントローラーの実装</h2>



<p>これにてLaravel Sanctumのセットアップは完了です。SPAフロントエンドとの認証用の通信はできるようになりました。</p>



<p>次に<strong><span class="marker-under">認証</span><span class="marker-under">用の</span><span class="marker-under">コントローラー</span></strong>を作成していきましょう。</p>



<p>Artisanコマンドを実行し、新たに認証用のコントローラー「AuthController」を作成します。</p>



<pre class="wp-block-code"><code>php artisan make:controller AuthController </code></pre>



<p>ログインとログアウトができるように実装していきます。通常の認証と同様に、Laravel標準の認証ファサード<code>Illuminate\Support\Facades\Auth</code>を使って実装することができます。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    /**
     * ログイン
     *
     * @param  mixed $request
     * @return void
     */
    public function login(Request $request)
    {
        if (Auth::attempt($request-&gt;only(&#91;"email", "password"]))) {
            // レスポンスを返す
            return response()-&gt;json(&#91;'message' =&gt; 'success'], 200);
        } else {
            // エラーレスポンスを返す
            return response()-&gt;json(&#91;'message' =&gt; 'failed'], 401);
        }
    }

    /**
     * ログアウト
     *
     * @param  mixed $request
     * @return void
     */
    public function logout(Request $request)
    {
        // ログアウトする
        Auth::logout();
        // レスポンスを返す
        return response()-&gt;json(&#91;'message' =&gt; 'Logged out'], 200);
    }</code></pre>



<p>もちろんAuthファサードのほかのメソッドも使えます。Auth::checkでログイン中か判定したり、Auth::id()でログイン中のユーザーのIDを取得したりすることもできます。Laravel Sanctumを導入していても、通常の認証とまったく同じです。</p>



<p><code>routes/web.api</code>でルートを設定します。</p>



<pre class="wp-block-code"><code>&lt;?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


// SPA認証
Route::post('/login', 'AuthController@login');
Route::post('/logout', 'AuthController@logout');</code></pre>



<p>nuxt/authからはここで定義したルートにログイン・ログアウトのアクセスを行うようにします。</p>



<p>api.phpに記載しても構わないとは思いますが、その場合はエンドポイントが<strong>/api/</strong>login,logoutになることに注意しましょう。</p>



<h2 class="wp-block-heading">ルートをLaravel Sanctumで保護する</h2>



<p>Laravel Sanctumでガードしたいルートに<strong>auth:sanctumミドルウェア</strong>を適用します。</p>



<pre class="wp-block-code"><code>// routes/api.php
Route::group(&#91;'middleware' =&gt; &#91;'auth:sanctum']], function () {

    Route::get('/user', function (Request $request) {
        return $request-&gt;user();
    });</code></pre>



<p>Route::groupで適用したいルートをまるごと囲ってしまうと安心です。</p>



<h2 class="wp-block-heading" id="テストユーザーの作成-マイグレーション">テストユーザーの作成・マイグレーション</h2>



<p>最後にテストユーザーを作成しておきましょう。</p>



<p>シーダーとは、マイグレーション時に自動的にレコードを作成する機能のことです。あらかじめシーダーを作成しておくと、テストデータなどをマイグレーション時に作成することができます。</p>



<p><code>database\seeders\DatabaseSeeder.php</code>を編集し、テストユーザーを作成するシーダーを定義します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')-&gt;insert(&#91;
            'name' =&gt; 't',
            'email' =&gt; 't@localhost',
            'password' =&gt; bcrypt('password'),
        ]);
    }
}
</code></pre>



<p>マイグレーション時に&#8211;seedオプションをつけると上のプログラムが実行され、自動的にユーザーが作成されるようになります。</p>



<p>マイグレーションを実行し、必要なテーブルを作成します。</p>



<pre class="wp-block-code"><code><strong>php artisan migrate:fresh --seed </strong>
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (26.50ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (21.52ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (32.99ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (42.32ms)
Database seeding completed successfully.</code></pre>



<p><strong><span class="bold-red">テーブルが作成されたら、バックエンドは完成です！長かった～</span></strong></p>



<p>なお、データベースへの接続設定については、あらかじめマイグレーション前に行っておいてください。MySQLなどのセットアップがお済みでない方はSQLiteをデータベースとして利用することができます。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-reference">

<a rel="noopener" href="https://reffect.co.jp/laravel/laravel_sqlite" title="LaravelでSQLiteデータベースを使ってみよう | アールエフェクト" 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://reffect.co.jp/wp-content/uploads/2018/12/Laravel_cat.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">LaravelでSQLiteデータベースを使ってみよう | アールエフェクト</div><div class="blogcard-snippet external-blogcard-snippet">SQLiteを利用すると簡単にデータベースを作成することができます。Laravelでアプリケーションを作成するためには、データベースを構築する必要があります。Laravelの初期設定ではmysqlデータベースが前提になっています。テストなど...</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://reffect.co.jp/laravel/laravel_sqlite" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">reffect.co.jp</div></div></div></div></a>
</div>



<p>ちなみにアクセストークン関係のテーブルもマイグレーションされていますが、SPA認証の場合は不要となります。マイグレーションファイルを削除しても構いませんが、後からトークン認証も実装するかもしれないため、一応残しておきました。</p>



<p>以上でバックエンドの準備は完了です。ローカルサーバーを起動して、フロントエンドからのアクセスを待機させておきましょう。</p>



<pre class="wp-block-code"><code>php artisan serve</code></pre>



<h2 class="wp-block-heading" id="nuxt-jsのセットアップ">Nuxt.jsのセットアップ</h2>



<p>次にNuxt.jsによるフロントエンドを作成していきます。<a href="https://takabus.com/tips/1396/" target="_blank">第2回「フロントエンド編」</a>につづきます。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1396/" title="Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/07/laravelsanctum-nuxt-spa.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Laravelとnuxt/authでSPA認証！ログイン機能を実装しよう！（第2回 フロントエンド編）</div><div class="blogcard-snippet internal-blogcard-snippet">Laravel とフロントエンドフレームワーク「Nuxt.js」を使い、SPA認証（ログイン機能）をできるだけかんたんに実装する方法を紹介していきます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.07.29</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/940/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Nuxt】SSRでも一部クライアントサイドでデータを取得したいとき</title>
		<link>https://takabus.com/tips/1060/</link>
					<comments>https://takabus.com/tips/1060/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 25 Feb 2022 05:12:41 +0000</pubDate>
				<category><![CDATA[Nuxt.js]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1060</guid>

					<description><![CDATA[SSRやSSGとクライアントサイドレンダリングを共存させる方法について紹介します。]]></description>
										<content:encoded><![CDATA[
<p>「Nuxt.js データ取得」と検索すると、ほとんどがSSR（サーバーサイドレンダリング）でデータを取得する方法がヒットします。</p>



<p>しかし、<strong><span class="marker-under">SSRの恩恵を受けながらも、一部のデータについてはクライアントサイドでデータを取得したいという場合もあるでしょう。</span></strong>例えば、記事内容はサーバーサイドで生成したいが、関連サイトの新着情報やニュースといったタイムリーなデータはクライアントサイドで取得したいといったケースです。</p>



<p>当記事では、SSRやSSGとクライアントサイドレンダリングを共存させる方法について紹介していきます。</p>



<h2 class="wp-block-heading" id="サーバーサイドレンダリングはasyncdata-クライアントサイドはmountedとdataを使う">サーバーサイドレンダリングはasyncData、クライアントサイドはmountedとdataを使う！</h2>



<p>解決方法はシンプル。<span class="bold-red"><span class="marker-under">mountedとdataを使いましょう！</span></span></p>



<p><span class="marker-under"><strong>そもそもNuxt.jsだからといって必ずasyncDataを使うというわけではありません。</strong></span>思い込みに注意しましょう。asyncDataとmounted・dataの棲み分けは以下のとおりです。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>おもな違い</th><th>asyncData</th><th>mounted・data</th></tr></thead><tbody><tr><td>実行される場所</td><td>サーバー<br>（SPAモードのみクライアント）</td><td>クライアント（ブラウザ上）</td></tr><tr><td>特徴</td><td>・Nuxt.jsのみ存在するイベントサイクル<br>・headタグや記事の内容など、サーバー側で静的なHTMLを生成したい部分に使う。<br>・{{}}に差し込まれた後のHTMLがクライアントに返される</td><td>・ブラウザで表示されるときに実行される。<br>・{{}}に部分への差し込みはブラウザで行われる</td></tr></tbody></table></figure>



<p>asyncDataとmounted・dataは、実行される場所が異なります。<span class="marker-under-red"><strong>asyncDataに書いた処理はサーバーサイド</strong></span>で、<span class="marker-under-blue"><strong>mountedで定義した処理はクライアントサイド</strong></span>で実行されますので、サイトの一部だけクライアントサイドで処理したいような場合は、mountedでデータを取得するようにしてやればOKです。</p>



<p>もちろん、asyncDataとmounted・dataは併用することができます。記事の内容はasyncDataで取得するようにしておき、関連サイトのフィードはmountedで取得するようにしておけば、記事の内容はSSRで生成され、フィードについてはクライアントサイドでレンダリングさせることができます。</p>



<h2 class="wp-block-heading" id="サンプルコード">サンプルコード</h2>



<p>asyncDataとdata・mountedを共存させたサンプルを掲載しておきます。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
  &lt;div&gt;
    &lt;ul&gt;
      &lt;!-- こちらはサーバー側でレンダリングされる --&gt;
      &lt;li v-for="post in posts" :key="post.id"&gt;{{post.title}}&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
      &lt;!-- こっちはクライアント側でレンダリングされる --&gt;
      &lt;li v-for="item in news" :key="item.id"&gt;{{item.title}}&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
export default {
  async asyncData(context) {
    // サーバーサイドでデータを取得する
    let posts = await context.$axios.$get("/api/posts");
    // データを返す
    return { posts };
  },
  data() {
    return {
      news: null
    };
  },
  async mounted() {
    // クライアントサイドでデータを取得する
    await this.$axios.get("/api/news").then(res =&gt; {
      this.news = res.data;
    });
  }
};
&lt;/script&gt;</code></pre>



<p>asyncDataには/api/postsから、mountedには/api/newsからデータを取得するコードを書いています。</p>



<p>これを実行すると、postsはサーバーサイドでデータの取得からレンダリングまで行われますが、newsについてはクライアントサイドでデータの取得・レンダリングが行われます。SSRやSSGでホスティングした場合、postsはコンテンツがHTMLに書き出されますが、newsはHTMLには書き出されず、ブラウザでデータの取得から動的な描画が行われるようになります。</p>



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



<p>いかがでしたか。</p>



<p>とくにSSGで静的サイトを生成しているとき、関連サイトの新着情報などもサーバーサイドでレンダリングしてしまうと、ジェネレートするまでページに反映されなくなってしまいます。SEO上クライアントサイドレンダリングでも特に問題がなく、リアルタイム性が重要となる部分については、これまで通りmountedでデータを取得し、クライアントサイドでレンダリングするようにしましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1060/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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 loading="lazy" 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>
	</channel>
</rss>
