NOT SO BADなブログ

ぼっちスタートアップが日々がんばっています

Riot.jsでSPAにしたらGoogleにインデックスされなくなったので、FirebaseのFunctionsでmetaタグだけレンダリングした話

FJUG#3でLTさせてもらってきました!

firebase-community.connpass.com

前回#2に続いての参加で、今回は思い切ってLT枠に突っ込ませてもらいました。 150人の前でのLTは初めてでしたが、緊張で死ぬかと思いました。

発表したスライドにちょっとした説明やその後の検証結果を追記して、ブログに残しておこうと思います。


LT内容

https://speakerdeck.com/tomomichi/ogpdui-ying-moukoreteiinsiyanaitesuka2018zan-ding-ban

3行で要約

  • Riot.js/Firebaseでサービスをリニューアルしたら、Googleにインデックスされなくなって困りました
  • SSRとか大変なのは避けたかったので、Functionsでmetaタグだけ差し替えたんだけどいいですよね?
  • それだけだとクロールされないので、Functionsで超お手軽にRSSフィードとsitemapを配信する方法も試してみましたよ。

一言でいうと、Functions最高ー。

背景的な話

このコンテンツは、こちらの記事の追記のような位置付けです。

blog.notsobad.jp

サイトリニューアルで出てきたSEO問題を、できるだけ楽して解決できないかとがんばった記録になっております。

エクスキューズ

これでいいんじゃないですかとか適当なこと言ってますが、会社でこんなことしてたら怒られるかもしれないので気をつけてください。

温度感としては、@Quramyさんが書いてくださってるのがほんとにその通りって感じじゃないかと。

スライドにも書いてますが、とはいえGoogleBotにちゃんと認識されてるならそもそもこんなことしたくなかったわけで。。

あくまでインデックスされなくて困ってて、でもSSRまでしたくなくて、っていうひとつの事例としてお楽しみください。 (パフォーマンス改善のためにSSR、とかって文脈ではない)

同じようなシチュエーションの人の助けになればうれしいです。


以下、やったこと3つをそれぞれ少しだけ追加説明していきます。

① Functionsでmetaタグだけレンダリング

要するに、SPAでエンドポイントになるindex.htmlをそのまま返すんじゃなくて、functionsをかませてmetaタグだけ書き換えてから返すという、SMR(Serverside Metatag Rendering)です。聞いたことないけど。

けっこう探しても事例がなくて不安だったんですが、Lambdaでやってるという話を聞くと安心感があります。

全体的に@Quramyさんのコメントに救われてる。。

このやり方で懸念になるのはFunctionsの使用量とパフォーマンスなわけですが、FunctionsのレスポンスはCDNにキャッシュできるというのが、意外と知られていなかったりしますよね(ぼくが知らなかっただけですがw)

Cloud Functions による動的コンテンツの配信  |  Firebase

CDNから返してくれればFunctionsはトリガーされずに済むので、アクセスが増えてもそこまで使用量は増えない、はず。

とはいえまだ実運用で大量のアクセスさばいて大丈夫でした、という経験があるわけではないので、ご利用は自己責任でお願いします。 blazeプランは料金上限を設定できないって、結構こわいですね。


② Functionsでお手軽RSSフィード配信

metaタグレンダリングでbotに認識されるようになりましたが、クロールしてもらえないと意味がありません。 というわけでRSSフィードとsitemapを極小労力で用意してみます。

まずはRSSフィードですが、これもFunctionsを使って、/feedにアクセスが来たらfirestoreから最新のデータを取ってXMLで返すようにしました。

簡単すぎて、node-rssが便利だったことくらいしか特に言うことがない。。

しかし猛烈にお手軽なので、とりあえずやっといて損はないんじゃないでしょうか。 これこそ更新は1日数回でいいと思うので、長めにキャッシュして節約したいところです。


③ スプレッドシートでお手軽sitemap配信

最後にsitemapの作成。たぶん過去最高に頭わるそうなsitemapのハックです。

f:id:o_tomomichi:20180403184508p:plain

ということは、スプレッドシートにURL一覧作ってCSV形式で公開すると、それがvalidなsitemapのURLになってしまうと。

さらに更新は、さっきのRSSのフィード更新をトリガーに、IFTTTでシートに自動追記。 ついにコードを1行も書くことすらなく、自動更新されるsitemapをお手軽に作ることができました。

sitemapの管理って地味にめんどくさいので、ミニマムでやるなら意外とおすすめです。 機会があればぜひ試してみてください。


まとめ

という感じでLTをしてきたのですが、調べて実装終えたのが発表ぎりぎりだったので、結果の検証までできてませんでした。

実装から数日経ってどうなったかというと、、

f:id:o_tomomichi:20180403185752p:plain

f:id:o_tomomichi:20180403185803p:plain

いい感じ。

もちろんfunctionsも無料枠で収まるペースです。よかったよかった。


(宣伝)

という感じでFirebaseはめちゃくちゃ便利なんですが、ちょっと管理画面が非力なのが不満だったりします。 MySQLのsequelPROみたいなやつがほしいなーと思った結果、とうとうGUI管理アプリを自分で作り始めてしまいました。

notsobad-jp.github.io

まだ完成度20%くらいで作りきれるかあやしいですが、プライベートβ版でユーザーテストにご協力いただける方募集中です。 (Macの方が早く案内できると思います)

手元でちょっとしたクエリ投げたり、一覧でデータ見たりしたいですよね。 クエリはまだできないんですけど。。

もし興味があれば、期待値を極限まで下げてぜひご登録ください。プライベートβはもちろん無料です。

おしまい。