tag:crieit.net,2005:https://crieit.net/tags/FirebaseHosting/feed 「FirebaseHosting」の記事 - Crieit Crieitでタグ「FirebaseHosting」に投稿された最近の記事 2020-01-07T21:31:01+09:00 https://crieit.net/tags/FirebaseHosting/feed tag:crieit.net,2005:PublicArticle/15666 2020-01-07T21:31:01+09:00 2020-01-07T21:31:01+09:00 https://crieit.net/posts/SPA-Nuxt-Firebase-Hosting-Netlify SPAなNuxtアプリをFirebase HostingからNetlifyに移行してみた <p>Netlifyがいいと聞いて、Firebase Hostingから移行してみたときの備忘録。</p> <p>NetfilyのプレレンダリングがあるのでOGP芸が楽。<br /> 昔、<a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/08/07/150000">こんな記事</a>を書いたけど、Functionsで頑張らなくてもよくなった。</p> <p>使ってみてよかったので、移行したときにやったことをまとめてみる。</p> <h2 id="移行するときにやったこと"><a href="#%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">移行するときにやったこと</a></h2> <h4 id="nuxt.config.tsなどの変更"><a href="#nuxt.config.ts%E3%81%AA%E3%81%A9%E3%81%AE%E5%A4%89%E6%9B%B4">nuxt.config.tsなどの変更</a></h4> <h5 id="1. Nuxtなどの公式サイトを見て設定"><a href="#1.+Nuxt%E3%81%AA%E3%81%A9%E3%81%AE%E5%85%AC%E5%BC%8F%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E8%A6%8B%E3%81%A6%E8%A8%AD%E5%AE%9A">1. Nuxtなどの公式サイトを見て設定</a></h5> <p>Firebase Hostingで設定したのとかぶっているところもあり、nuxt.config.tsは変更なし。</p> <p>参考: <a target="_blank" rel="nofollow noopener" href="https://ja.nuxtjs.org/faq/netlify-deployment/">Netlify へデプロイするには? - NuxtJS</a></p> <h5 id="2. _redirectsファイルの作成"><a href="#2.+_redirects%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">2. _redirectsファイルの作成</a></h5> <p>Netlifyでは、index.html以外は404になるので、<br /> SPAの場合は<code>static/_redirecs</code>というファイルを作成して、<br /> 以下の内容を記載しておく。</p> <pre><code>/* /index.html 200 </code></pre> <p>参考] <a target="_blank" rel="nofollow noopener" href="https://docs.netlify.com/routing/redirects/rewrites-proxies/#history-pushstate-and-single-page-apps">Rewrites and proxies | Netlify Docs</a></p> <h5 id="3. Netlify側の設定"><a href="#3.+Netlify%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A">3. Netlify側の設定</a></h5> <p>あとは、Netlifyにアクセスして、 「<a target="_blank" rel="nofollow noopener" href="https://ja.nuxtjs.org/faq/netlify-deployment/#spa-%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E5%A0%B4%E5%90%88">SPA モードで生成されたサイトの場合</a>」にも書いてあるとおりの内容をNetlifyの設定に入力すればOK。</p> <p>迷わなければ、5分くらいでできて、masterにpushと更新される(<em>´ω`</em>)</p> <h4 id="プレレンダリング"><a href="#%E3%83%97%E3%83%AC%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0">プレレンダリング</a></h4> <p>ベータ版だけど、Netlifyでプレレンダリングしてくれる機能がある。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/08/07/150000">この記事</a>に書いてある感じで、<br /> 「FunctionsでheadだけのHTMLを生成→リダイレクト」<br /> としていたのが不要になる感じ。</p> <h5 id="Netlifyの画面で設定"><a href="#Netlify%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%A7%E8%A8%AD%E5%AE%9A">Netlifyの画面で設定</a></h5> <p>設定は簡単で、Netlify上で設定画面で有効化すればOK。<br /> 参考: <a target="_blank" rel="nofollow noopener" href="https://docs.netlify.com/site-deploys/post-processing/prerendering/#set-up-prerendering">Prerendering | Netlify Docs</a></p> <h5 id="その他の修正点"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E4%BF%AE%E6%AD%A3%E7%82%B9">その他の修正点</a></h5> <p>あとは、以下の修正。</p> <ol> <li>OPGのためにrouterでリダイレクトしていた設定を削除</li> <li>各ページでメタ情報を適切になるように変更</li> </ol> <p>また、上で書いたとおり、<code>static/_redirecs</code>で</p> <pre><code>/* /index.html 200 </code></pre> <p><strong>これを設定しておかないとボットがアクセスしたときに404になってOGPがでない</strong>。。</p> <p>(これに気づかずかなりハマった。。)</p> <h5 id="小ネタ: プレレンダリングの結果を確認する"><a href="#%E5%B0%8F%E3%83%8D%E3%82%BF%3A+%E3%83%97%E3%83%AC%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">小ネタ: プレレンダリングの結果を確認する</a></h5> <p>プレレンダリングするかどうかは、UAを見て判断しているらしく、</p> <ul> <li>UAを指定してすると、プレレンダリングされた結果を確認でき、</li> <li>UAを指定してないと、プレレンダリングなしの結果になる</li> </ul> <p>curlだとこんな感じで、<code>-A twitterbot</code>を指定するとよい。</p> <pre><code class="shell">$ curl -A twitterbot https://example.com/hoge/fuga -o fuga.html </code></pre> <p>参考: <a target="_blank" rel="nofollow noopener" href="https://community.netlify.com/t/common-issue-understanding-and-debugging-prerendering/150">[Common Issue] Understanding and debugging prerendering</a></p> <p>毎回、<a target="_blank" rel="nofollow noopener" href="https://cards-dev.twitter.com/validator">Twitter Card Validator</a>で確認するのはめんどくさいので、この方法だと便利。</p> <h3 id="ページが存在しないURLの対応"><a href="#%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%AA%E3%81%84URL%E3%81%AE%E5%AF%BE%E5%BF%9C">ページが存在しないURLの対応</a></h3> <p>積読ハウマッチでは、少し特殊なことをしていて、<br /> 一部のURLはheadだけのHTMLしか存在しないページがいくつかある。</p> <p>なので、その部分を修正していく。方法としては以下の感じ。</p> <ol> <li>nuxt.config.tsでrouterに、クエリパラメタ付きでリダイレクトを追加する <ul> <li><a target="_blank" rel="nofollow noopener" href="https://router.vuejs.org/ja/guide/essentials/redirect-and-alias.html">リダイレクトとエイリアス | Vue Router</a></li> </ul></li> <li><code>asyncData()</code>でクエリパラメタを受け取り、<code>created()</code>で削除 <ul> <li><code>this.$router.push({ query: {} });</code></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.kimullaa.com/entry/2018/01/27/183743">Vuejs vue-router クエリパラメータの一部だけを取り除く - SIerだけど技術やりたいブログ</a></li> </ul></li> </ol> <h4 id="動的なサイトマップの対応"><a href="#%E5%8B%95%E7%9A%84%E3%81%AA%E3%82%B5%E3%82%A4%E3%83%88%E3%83%9E%E3%83%83%E3%83%97%E3%81%AE%E5%AF%BE%E5%BF%9C">動的なサイトマップの対応</a></h4> <p>書籍やユーザのページなどは日々増えていくので、<br /> サイトマップも動的に生成するようにしている。</p> <p>Hostingの場合はFunctionsを呼び出せたけれど、<br /> Netlifyに移行すると、それができないので対応が必要。</p> <p><strong>netlifyの_redirectsを使って直接Functionsへリダイレクトする方法で対応した</strong>。</p> <p>こんな感じで各URLを該当のFunctionsにリダイレクトさせておく。</p> <pre><code>/sitemap https://us-central1-<project-id>.cloudfunctions.net/sitemap /* /index.html 200 </code></pre> <h5 id="sitemap-moduleだとダメだった..."><a href="#sitemap-module%E3%81%A0%E3%81%A8%E3%83%80%E3%83%A1%E3%81%A0%E3%81%A3%E3%81%9F...">sitemap-moduleだとダメだった...</a></h5> <p>sitemap-moduleで動的なページの対応方法も乗っているが、<br /> SPAなのでgenerateされてしまう...</p> <ul> <li>参考 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/nuxt-community/sitemap-module#readme">nuxt-community/sitemap-module: Sitemap Module for Nuxt.js</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/bucchi49/items/d271c4010a3f6c900926">Nuxt.jsで静的ファイル生成時にサイトマップも自動生成する方法 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/cortyuming/items/b4640b371e4ceb37ae47">Nuxt.js + Firestore で動的サイトマップ - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sauzar18/items/2ea958043eb6758c4f83">Nuxt.jsでサイトマップを動的に設定する方法 - Qiita</a></li> </ul></li> </ul> <h4 id="カスタムドメインの設定"><a href="#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A">カスタムドメインの設定</a></h4> <p>Netlifyの設定画面に従い、カスタムドメインを設定していく。</p> <p>ALIASを設定するようにいわれるが、<br /> お名前ドットコムはALIASを設定できないらしいので、<br /> NetlifyのDNSを使う形で対応</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/hitochan777/items/7acce5b4398af7f4c358">参考にした記事</a>でも書いてあるとおり、<br /> Aレコードでもできるが、CDNを活用できないらしいので同様の対応</p> <p>あとは、設定画面にも書いてあるとおり、<br /> <code>*.netlify.com</code>から設定したドメインへリダイレクトを追加しておく。</p> <pre><code>[https://tsundoku.netlify.com/*](https://tsundoku.netlify.com/*) https://tsundoku.site/:splat 301! /sitemap https://us-central1-<project-id>.cloudfunctions.net/sitemap /* /index.html 200 </code></pre> <p>これでリダイレクトされるようになるので、あとはDNSの反映を待てばOK!</p> <p>以上!!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p> <h1 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h1> <ul> <li><a href="https://crieit.net/posts/Netlify-404">Netlifyを使ってたらルートパス以外が404になった話とその解決方法 - Crieit</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.netlify.com/routing/redirects/rewrites-proxies/#limitations">Rewrites and proxies | Netlify Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://prerender.io/documentation/best-practices">Prerender - Dynamic Rendering for JavaScript Website SEO</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://community.netlify.com/t/common-issue-understanding-and-debugging-prerendering/150">[Common Issue] Understanding and debugging prerendering - Support / Common Issues - Netlify Community</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/NaokiIshimura/items/64e060ccc244e38d0c15#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A">【Netlify】カスタムドメインを設定する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/don-bu-rakko/items/8eb30c7e9a3f9531ba16">Netlifyにお名前.comで取得した独自ドメインを設定する - Qiita</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/15488 2019-10-17T19:20:16+09:00 2019-10-17T19:20:16+09:00 https://crieit.net/posts/Nuxt-js-SPA-Firebase-Web Nuxt.js(SPA)+FirebaseなWebサービスで強制的に更新する(リビジョンアップ対策) <p>SPAはとてもすてきだけど、Hostingにアップロードしてもすぐに更新されない。。<br /> たとえば、メンテナンス画面に変更しても、キャッシュが残っててメンテナンスモードにならないとか。。</p> <p>この<a target="_blank" rel="nofollow noopener" href="https://qiita.com/okkuyama/items/484fdd868b17d8c960a9#%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B">記事</a>をみると、Reactで強制的にリビジョンアップする方法が載っていたので、<br /> Nuxt.jsでもできないかやってみたときの備忘録。</p> <h2 id="ざっくりとした流れ"><a href="#%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%A8%E3%81%97%E3%81%9F%E6%B5%81%E3%82%8C">ざっくりとした流れ</a></h2> <p>流れとしては、こんな感じ。</p> <ol> <li>staticディレクトリにJSONファイルでバージョン番号を用意</li> <li>環境変数にリビジョン番号を保持するように設定</li> <li>JSONファイルと環境変数のバージョン番号が異なっていたら、強制リロードする</li> </ol> <p>用意するJSONファイルはこんな感じ</p> <pre><code class="json">{"version":1} </code></pre> <h2 id="やりかた"><a href="#%E3%82%84%E3%82%8A%E3%81%8B%E3%81%9F">やりかた</a></h2> <p>バージョンチェックするタイミングや更新の契機はいろいろあるけど、<br /> ページ遷移時にチェックするよう、middlewareで対応。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/okkuyama/items/484fdd868b17d8c960a9#%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B">参考記事</a>)にあるような、ダイアログを出すパターンもある。</p> <h3 id="バージョンをチェックするmiddlewareを用意"><a href="#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8Bmiddleware%E3%82%92%E7%94%A8%E6%84%8F">バージョンをチェックするmiddlewareを用意</a></h3> <p><code>middleware/checkUpdate.ts</code>として、バージョンをチェックするミドルウェアを追加する。</p> <pre><code class="typescript">import axios from "axios"; export default async function() { try { // revision.jsonファイルから最新のバージョンを取得 const res = await axios.get("/version.json"); const data = res.data; const latestVersion = data.version; // 環境変数から現在のバージョンを取得 const curVersion = !!process.env.VERSION ? Number(process.env.VERSION) : 0; // 最新バージョンよりも古かったら、強制的にリロードする if (curVersion < latestVersion) location.reload(true); } catch(error) { console.error(error); // エラーのときはなにもしない } } </code></pre> <p><code>location.reload(true)</code>を使うとキャッシュを無視して、強制的にリロードするらしい<br /> ・参考: <a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/en-US/docs/Web/API/Location/reload">Location.reload() - Web APIs | MDN</a></p> <h3 id="nuxt.config.tsの設定"><a href="#nuxt.config.ts%E3%81%AE%E8%A8%AD%E5%AE%9A">nuxt.config.tsの設定</a></h3> <p>middlewareを使うようにするのとあわせて、</p> <ol> <li>環境変数(<code>VERSION</code>)の設定したり、</li> <li>JSONファイル(<code>version.json</code>)を生成する</li> </ol> <pre><code class="typescript">import fs from "fs"; import NuxtConfiguration from "@nuxt/config"; // バージョン番号を設定 const VERSION = 1; // revision.jsonをstatic配下に生成 fs.writeFileSync("static/version.json", JSON.stringify({ version: VERSION })); const config: NuxtConfiguration = { env: { VERSION: VERSION // 環境変数にバージョンを設定 }, router: { middleware: ["checkUpdate"] // バージョンチェックのmiddlewareを設定 } } </code></pre> <h3>firebase.jsonで<code>version.json</code>をキャッシュしないように</h3> <p>そのままだと、<code>version.json</code>自体もキャッシュされてしまうので、<br /> あまり意味がない感じになる。。</p> <p>なので、firebase.jsonでversion.jsonをキャッシュしないように設定</p> <pre><code class="json">{ "hosting": { "public": "public", "ignore": ["firebase.json", "**/node_modules/**", "**/README.md"], "headers": [ { "source": "/version.json", "headers": [ { "key": "Cache-Control", "value": "private, no-store, no-cache, must-revalidate" } ] } ] }, } </code></pre> <p>以上!!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p> <h1 id="参考にしたサイトさま"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%81%95%E3%81%BE">参考にしたサイトさま</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://codeday.me/jp/qa/20190305/329882.html">javascript – シングルページアプリケーション(SPA)ページを強制的に更新する方法 - コードログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/okkuyama/items/484fdd868b17d8c960a9#%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%92%E5%90%AB%E3%82%93%E3%81%A0%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B">【React.js】SPAでのリビジョンアップ対策 - Qiita</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど