Lighthouseの点数が伸び悩むのでNuxtからGatsbyに変えてみた。点数も70点から92点に跳ね上がりました。
Lighthouse の点数が伸び悩むので Nuxt から Gatsby に変えてみました。点数も 70 点から 92 点に跳ね上がりました。詳しい手順は公式ページをみるとして Nuxt から Gatsby に移行に関連したものを中心に残しておきたいと思います。
まずは Gatsby 直後の Lighthouse の点数がこちらです。いきなりこの点数、Gatsby の効果は絶大だと感じました。
Gatsby
最初に Gatsby Starter Blog(https://www.gatsbyjs.com/starters/gatsbyjs/gatsby-starter-blog)に従いblogテンプレートからスタートです。
全体の構成みてみると Nuxt とそれほど全体の構成は変わらないかなと思いました。
Nuxt との違いはコンテンツを GraphQL から取り出すところとロジックと UI 部分が混ざっており Vue に慣れているとちょっと昔の Jquery 時代に戻ったような感じがしてしまうのは私だけでしょうか。
また画像ファイルの扱いがちょっと癖あるかなと思いました。これも慣れだと思います。全体の構成がわかったのでいよいよ Nuxt からの移植作業に取り掛かります。
コンテンツの移行
content の構成は記事ごとにフォルダを作りその中に index.md として作るようです。今回記事で使用する画像もそのフォルダに一緒にいれることにしました。また Nuxt の記事の日付は md ファイルの更新日を利用していましたが、gatsby ではフロントマターに date を設定しているようでした。調べるの面倒なので、サンプルに合わせて同じように日付をフロントマターに入れることにしました。合わせて heroImage 画面もフロントマターに今回設定することにしました。また prism の書き方も少し違うようなのでこれも合わせて変換していきます。
これを手作業で移動するのは難儀なので、以下のような簡単なスクリプトを作って移行することにしました。
Gatsby と plugin のインストール
今回、以下の plugin を入れることにしました。最初 gatsby-plugin-google-analytics を入れましたが、Google analystic V4 だとうまく行かなそうなので、手作業で Google が用意したスクリプトを追加しました。また prism のタイトルは gatsby-remark-prismjs-title を入れましたが気に食わなかったので、gatsby-remark-code-titles を利用することにしました。
あとは plugin に合わせて gatsby-config.js を修正すれば完了です。こちらは割愛します。あとは最初に作ったコンテンツを akiboi-blog/content/blog にコピーすれば OK です。scss ファイルはそのまま akiboi-blog/src/scss にコピーすれば OK です。scss ファイルを読めるように blog テンプレートを入れて作成されている layout.js に import してやれば OK です。
components の移行
テンプレートのソースを元に移植する方が早いと思います。vue で記載したものを return のところにスクリプトも一緒に入れるみたいな感じです。さほど難しいことはないと思います。動的ページは、gatsby-node.js 、templates そして componetns で実現します。ほとんど雛形がでできているのでこれに手を加える程度です。記事表示するサンプルを載せておきます。私の場合、gatsby-node.js はそのままサンプルのものを使い blog-posts.js は heroImage 属性を追加した程度でした。
フロントマターに heroImage で指定した画像を表示するようにしています。
HamburgerMenu も結局大した修正なしに移行することができました。最初は他サンプルとかみてましたが、なんでそんな複雑な処理するのだろうと悩んでしまいました。React ではステートフックがあるのでこれを利用して on、off がに合わせてメニューを開いたりできました。また class を追加する場合どうするのだろうと思ってましたが単純でした。on、off に合わせて is-active クラスを追加することができました。
scss ファイルは変更なしでいけました。
あと微調整で prism 関連で少し手直して完了です。以上で移行は完了です。コードはもう少し綺麗にしたい気持ちはありますが、一通りこれで完了です。
コード 比較
最後にコード数を比較したいと思います。イメージは gatsby が少ないような気がするのですけど。
Nuxt
No | Language | files | blank | comment | code |
---|
1 | Sass | 7 | 6 | 2 | 709 |
2 | Vuejs Component | 12 | 0 | 22 | 266 |
3 | TypeScript | 2 | 0 | 0 | 115 |
4 | SUM | 21 | 6 | 24 | 1090 |
Gatsby
No | Language | files | blank | comment | code |
---|
1 | Sass | 7 | 6 | 2 | 740 |
2 | JavaScript | 10 | 26 | 14 | 498 |
3 | TypeScript | 5 | 8 | 1 | 197 |
4 | SUM | 22 | 40 | 17 | 1435 |
結果は Gastsby が 345step も多くなりました。Saas は少し手直ししたので 31step はいいとして JavaScript が多いですね。ロジック自体は少ないと思いますが、GraphQL の部分が多いためかなと思います。今回は、テンプレートベースに移行しましたので、保守しやすいようにもう少しソースコードは見直したいと思います。
今回は、Nuxt を Gatsby に移行してみました。満足いくスコアを出せましたが、アプリ屋さんとしては全部 Typescript にしたいし、もう少し React と付き合いたいと思います。