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など