ブログをHexoからGatsbyに移行した

  1. 🏷️
  2. プログラミング
  3. Gatsby
  4. Gatsby Theme
  5. SSG
Gatsbyで作ったブログのスクリーンショット

ついにHexoからGatsbyにSSGを切り替えた。 なんとGatsby Themeも自作❗ マジで大変だったけど、それに見合うメリットがあったと思う。

技術的な詳細は Qiita に投げるとして、ここでは概要を説明する。

HexoのときとGatsbyのときとで見た目比較

どこが変わったのか新旧比較しようのコーナー😎

トップページ。 (この画像比較スライダーも語りたい。後述。)
Gatsbyで作ったブログのスクリーンショット メインページ
Hexoで作ったブログのスクリーンショット メインページ

Gatsbyのほうが全体的に文字がでかい。 ダークテーマに変更したのでイケてるよね。 あと、私のアイコンが右に出てるのも承認欲求モンスター的にはgood。

タグページ(カードレイアウト)はこんな感じ。
Gatsbyで作ったブログのスクリーンショット カードレイアウト
Hexoで作ったブログのスクリーンショット カードレイアウト

これも良くなったよね❗ Hexoのときは縦長画像と横長画像を並べたときに段組みがガタガタだったけど、 Gatsbyでスマートに収まってる。 カード数も2列に絞ったので、写真が見やすい。

Gatsbyの良い点その1: 画像の表示が早い

Gatsby最大のメリットだよね。 画像の表示が早い。

HexoのときはPC向けにもスマホ向けにも同じ1枚の画像を配信してた。 ただ、当然、PCとスマホだと解像度が違うわけで、 PC向けの高解像度な画像はスマホにはオーバースペック...。 スマホで見てる人にとっては、無駄に重い画像になっちゃって、ページの表示が遅くなってた。

これを解決するには、スマホ向けとPC向けの2種類の画像を用意する必要がある。 だけど、これがまぁめんどくさいわけw 手動でやるのは地獄。

Gatsbyはこれを自動でやってくれるんだな〜。 私はLightroomでJPEGを吐いて、あとはGatsbyにおまかせ。楽ちん○ん。 (ついでにHexoでやってたWebP変換スクリプトの実行も不要になった。)

例えば、今の設定だと↓の解像度の画像を自動生成するのね。

  • 480px
  • 1024px
  • 1920px
  • オリジナル(1920pxを超える場合のみ)

私のiPhone 12 ProのViewportの横幅が390pxでしょ。 だから最小の480pxの画像をDLすれば済むわけ (あ、実際には、Retinaディスプレイだから倍の780pxかも...)。

Hexoのときは1600pxの画像しかなかったので、だいぶ効率化してると思う。

Gatsbyの良い点その2: ReactとTailwind CSSで書ける

嬉しい。 HexoのときはEJSで書く必要があったんだけど、あれがやっぱ慣れなかった。 あと、生のCSSも闇なのでなるべくいじりたくない。

ダイヤグラム生成くん はReactで書いてたので、技術的にも慣れてるのは大きなメリット。

Reactといっても、かなりライトに使える。 一般的なReactアプリでいじる useEffect() とかは一切使わない(使ってもいいけど)。

それよりかは、再利用可能なWebコンポーネントとして利用する側面が強い。 Tailwind CSSでスタイルも一緒に記述しちゃって、箱をどんどん作っていくイメージ。 Webページ全体は箱の組み合わせで作る。

Gatsbyの悪い点その1: サイトのファイルサイズがでかい

画像の表示が早い のと表裏一体なんだけど、サイトのファイルサイズがでかい。 スマホ向けやPC向けに複数解像度の画像を生成するので、その分重くなる。 今の設定で計測したら↓。

  • Hexo: 約800MB
  • Gatsby: 約2GB

2倍以上違う。 ただ、これはもうちょっと改善できるかも。 現状はLightroomが長編2048pxで画像を生成してて、Gatsbyの解像度の刻みが480px, 1024px, 1920px。 1920pxと2048pxが近すぎて、意味がなくなってるんだよね。 これを2048pxに一本化できれば、1.8GBくらいにはなるんじゃないかなあ。

さらに、記事本文中の画像でJPEGも生成してるんだけど、これも止めればもっと軽くなるはず。 pluginの設定上、必ずJPEGを生成しちゃうんだけど、オフにできないか 作者に相談中

Gatsbyの悪い点その2: ビルドが遅い

  • 刻み: 480px, 1024px, 1920px
  • 形式: JPEG, WebP

の設定でクリーンビルドしたら30mくらい。

これも画像生成が多いせいだと思う。 テキストだけだったら、Hexoより早いか、どっこいどっこいぐらいじゃないかな。

解像度の刻みをデフォルトの5段階にして、 さらにAVIFの生成もしようとしたことあったけど、3h待ってもビルドが終わらなかったw

画像が多いブログを作る場合は、可能な限りWEBPだけに絞って、 刻みも必要最低限に絞ったほうが良いね。

Gatsbyの悪い点その3: ちょっと複雑なことしようとするとすぐ闇

多分、Gatsbyを始めた人は gatsby-starter-blog とかを参考に始めると思うんだけど、 これ本当に参考レベルのものなんだよね。

致命的なのはページネーションがないんだよね。 記事が80個あったら、80個が全部1ページに並ぶの。実用に耐えない...。

あと、結局GraphQLの型定義からは逃げられないのも闇。 例えば、記事のURLを決める slug のフィールドをFrontmatterで指定したりするとき、 型定義がないと、 slug のある記事が1つもなかったらエラーになっちゃう。 これは、存在するフィールドについては型を自動で推測してくれるからで、ないもんは推測してくれない。無理。

エラー回避のためにすべてのフィールドを持った記事を作っておくってのもナンセンス...。 なので、型定義するかって話になるんだけど、これがやたら闇なんだよなあ...。

このへんcreateFieldExtension() あたりが闇。 Nodeのフィールドは2種類あって、単純にデータを取得できるものと、 resolver を介さないと取得できないものがある。 後者のフィールドを利用したフィールドを作る場合、これもやはり resolver が必要になる。 resolver の定義には createFieldExtension() が必要で、 これは引数が4つも5つもある...。

書いててクラクラしてきた。ともかく、シンプルじゃないよ。

gatsby-transformer-remark が作ってくれるフィールドは resolver を介するものだらけなので、 これを使ってブログを書く人は↑のクラクラする話を理解しないといけないのね。はぁ。

まぁ、なんとか理解したのでこのブログがあるんだけど、学習コストは高いよね〜。

あとがき

Gatsbyは手放しに勧めれたもんではない。 世の中でよく使われているだけはあって、柔軟で自由度の高いツールだと思う。 が、ブログに使うとなると自由度が高すぎて闇の部分を見つめなくてはならない。

今は Astro とかが流行りなのかな❓ Gatsbyの闇を見つめてるときに浮気しそうになったけど、耐えた。 今度の引っ越しタイミングでもまだ流行ってたら使ってみよう。

もっとも、あと数年もしたらRust製のツールが流行ってるだろうなあ。 もっというと、WebサイトそのものがAIに取って代わられるかも。

Bio
Bio icon

tenpaMk2

🇯🇵インドアクソオタク。

Tag cloud
  1. AI生成
  2. ALTER
  3. ANIPLEX
  4. Astro
  5. AZT8-45
  6. A列車で行こう
  7. Borderline Toybox
  8. BROCCOLI
  9. Building Gadgets MOD
  10. Chart.js
  11. cocoen-js
  12. Create MOD
  13. DDDy
  14. Excalibur.js
  15. Fate
  16. Fate/Apocrypha
  17. Fate/EXTELLA
  18. Fate/EXTRA CCC
  19. Fate/stay night
  20. FGO
  21. FLARE
  22. FREEing
  23. GameDev
  24. Gatsby
  25. Gatsby Theme
  26. Git
  27. Google Analytics
  28. Hexo
  29. Hexo時代の記事
  30. HOBBY STOCK
  31. hololive
  32. homebrew
  33. JavaScript
  34. KDcolle
  35. KDColle
  36. Kon'D
  37. Lightroom
  38. Mac
  39. Markdown
  40. Minecraft
  41. MVStudio
  42. NEKOPARA
  43. NEKOYOME
  44. Node.js
  45. npm
  46. NSFW
  47. Phat!
  48. PLUM
  49. plusone
  50. POP UP PARADE
  51. PSO
  52. quesQ
  53. RAW現像
  54. Re:ゼロから始める異世界生活
  55. React
  56. RSS
  57. SAO
  58. spiritale
  59. SSG
  60. Stable Diffusion
  61. Tailwind CSS
  62. Thermal MOD
  63. To LOVEる
  64. Tony
  65. Twitter
  66. TypeScript
  67. Vite
  68. VOCALOID
  69. VSCode
  70. WebP
  71. Wonderful Works
  72. zsh
  73. ご注文はうさぎですか?
  74. はじまるA列車
  75. はにかみ、彼女は恋をする
  76. ひげを剃る。そして女子高生を拾う。
  77. りゅうおうのおしごと
  78. アクアマリン
  79. アストルフォ
  80. アズキ
  81. アズールレーン
  82. アトリエシリーズ
  83. アリスグリント
  84. アルトリア オルタ
  85. イリヤスフィール・フォン・アインツベルン
  86. イージーエイト
  87. ウイング
  88. エリス・ボレアス・グレイラット
  89. エルドール
  90. オーキッドシード
  91. キャスター
  92. クドわふたー
  93. クロエ・フォン・アインツベルン
  94. グッドスマイルカンパニー
  95. グリザイア:ファントムトリガー
  96. ゲーム
  97. ココナツ
  98. コトブキヤ
  99. ゴールデンヘッドプラス
  100. サキちゃん
  101. ショコラ
  102. ジェネ
  103. ジャベリン
  104. ジャンヌ・ダルク
  105. ステファニー・ドーラ
  106. ストロンガー
  107. ソフィーのアトリエ
  108. ソードアート・オンライン
  109. ダイキ工業
  110. チノ
  111. チノちゃん
  112. チョコメロ
  113. ティアーユ・ルナティーク
  114. ディ・モールト ベネ
  115. デート・ア・ライブ
  116. ドール
  117. ドールグッズ紹介
  118. ナナ・アスタ・デビルーク
  119. ネコぱら
  120. ネロ・クラウディウス
  121. ノーゲーム・ノーライフ
  122. バニラ
  123. バニー
  124. フィギュア
  125. フィギュアレビュー
  126. ブログ
  127. プラスワン
  128. プラフタ
  129. プリズマ☆イリヤ
  130. プログラミング
  131. マシュ・キリエライト
  132. マックスファクトリー
  133. マヤ
  134. ミーア
  135. ミーシャ・ネクロン
  136. メグ
  137. メディコス・エンタテインメント
  138. モモ・ベリア・デビルーク
  139. モンスター娘のいる日常
  140. ユニオンクリエイティブ
  141. ライザのアトリエ
  142. ライザリン・シュタウト
  143. ラブライブ
  144. ララ・サタリン・デビルーク
  145. リューノス
  146. レム
  147. レーシング
  148. 五島潤
  149. 冴えない彼女の育てかた
  150. 初音ミク
  151. 加藤恵
  152. 喵屋
  153. 天使の3P!
  154. 巡音ルカ
  155. 時崎狂三
  156. 東京フィギュア
  157. 水澄華実
  158. 氷堂美智留
  159. 深見玲奈
  160. 渡辺曜
  161. 無職転生
  162. 玉藻の前
  163. 画像比較スライダー
  164. 白銀ノエル
  165. 百瀬くるみ
  166. 空銀子
  167. 結城明日奈
  168. 結城美柑
  169. 美咲詩絵
  170. 美遊・エーデルフェルト
  171. 能美クドリャフカ
  172. 花偶堂
  173. 荻原沙優
  174. 西連寺春菜
  175. 遠坂凛
  176. 雛鶴あい
  177. 霞ヶ丘詩羽
  178. 魔王学院の不適合者
  179. 黒咲芽亜