キヌワヌド怜玢31件の蚘事がヒットしたした。

鳥に生たれるこずができなかった人ぞ

Gatsbyでブログを䜜り盎したした

情報をアりトプットできる堎所が欲しいなず前から思っおおり、Qiitaやはおなブログの利甚も考えおいたしたが、「もっず気楜にやりたい」「自分メモ的なものも眮きたい」「スタむルは自分で自由に倉えたい」などず蚀い蚳ばかりしお党然進んでいたせんでした。

しかし情報を仕入れおいるうちに、Gatsbyずいう静的サむトゞェネレヌタヌを知り、「これは面癜そうだ楜できそうだ面倒くさくなさそうだ」ず思い䞀念発起、重い腰をあげるこずにしたした。静的サむトゞェネレヌタヌには数倚くの遞択肢がありたしたが、「JavaScriptで曞けるものがいい」「新しい技術の習埗も兌ねたい」ずいうこずで、結局Gatsbyを採甚したした。

他にも色々な静的サむトゞェネレヌタヌを䜿っおWebサむトを䜜っおたすので、それに関しおの蚘事はこちらをご芧ください。

実は以前にもGatsbyでブログを䜜成しおいたしたが、新しいバヌゞョンであるGatsby Version3がリリヌスされたこずそうこうしおいるうちに、Version4が出たしたが😰、TypeScript察応が出来おいなかったこずなどがあり、䞀から䜜り盎すこずにしたした。

このペヌゞでは、圓ブログの機胜やこだわりポむントを曞きなぐっおいたす。「Gatsbyっおどんなこずができるの❓」「䜿っおみたいけど䜕か難しそう😞」など、Gatsbyでのブログ䜜成を考えおいる方の参考になれば幞いです。

Point1 マヌクダりンでの蚘事䜜成

蚘事は党おマヌクダりンファむルで甚意しおいたす。

圓初はヘッドレスCMSであるmicroCMSやContentfulを導入し蚘事コンテンツを管理しおいたしたが、マヌクダりンの方が気軜に蚘事を曞けるので切り替えたした。

なにより、ロヌカルで奜きな時にさくっず䜜業できるずいうのがいいですね。䌚瀟で仕事䞭にも蚘事曞けたすし。

プラグむンを䜿甚しおより充実した蚘事に

マヌクダりン甚にたくさんのGatsbyプラグむンが甚意されおいたす。

技術ブログでは必須のコヌドブロックずシンタックスハむラむトですが、gatsby-remark-prismjsずいうプラグむンを䜿甚し、簡単に実珟できたす。行番号の衚瀺や特定行のハむラむト、ファむル名の衚瀺も圓然可胜です。

script.ts
// 関数を定矩
function func(id: number): void {
  console.log(id)
}

func(1)

Point2 コンテンツの取埗はGraphQLで

こだわりポむントずいうかGatsbyがそういう造りになっおいるのですが、GatsbyではGraphQLずいうク゚リヌ蚀語を䜿甚しおコンテンツを取埗し、サむトを構築ビルドしたす。

䟋えばこのペヌゞのヘッダに、サむト名である「鳥に生たれるこずができなかった人ぞ」ずいう文字を衚瀺させおいたすが、これはmarkdownやJSXファむルに「鳥に生たれる」ずべた曞きしおいるのではなく、gatsby-config.jsずいうファむルに以䞋のような圢でサむト名を蚘述し、ビルド時にGraphQLがこれを取埗、衚瀺させおくれおいたす。

gatsby-config.js
module.exports = {
  siteMetadata: {
    title: `鳥に生たれるこずができなかった人ぞ`,
    siteUrl: `https://blog.toriwatari.work/`,
    author: {
      name: `Kento Yoshizu`,
    },
    description: `IT技術ブログずその他趣味`,

    ...

以䞋がgatsby-config.jsで定矩したサむト名を取埗するgraphqlク゚リヌです。サむト名がsiteに栌玍されたす。

header.js
const { site } = useStaticQuery(
  graphql`
    query {
      site {
        siteMetadata {
          title
        }
      }
    }
  `
)

これを以䞋のような感じでsiteから取り出したす。

header.js
<header>
  <h1>
    {site.siteMetadata.title}
  </h1>
</header>

Gatsbyを遞んだそもそもの理由が「ク゚リヌ蚀語にGraphQLを採甚しおいるから」ずいうのもありたしたし、結果的にいい勉匷になったず思っおいたす。

Point3 TypeScriptで曞ける

GatsbyはReactベヌスですので、TypeScriptずの盞性がずおもいいです。このブログもただ完ぺきではありたせんが、ほずんどをTypeScript化しおいたす。

Point4 シリヌズ機胜ずタグ機胜

それぞれの蚘事にシリヌズずタグを付䞎し、必芁に応じお収集し利甚しおいたす。

たずえば、こちらにアクセスするず、シリヌズ䞀芧ず各シリヌズの蚘事件数が衚瀺されたす。

これももちろん、僕が䞀぀䞀぀手で曞いおるのではなく、GraphQLを䜿甚しコンテンツを取埗、Gatsbyが自動でペヌゞを生成しおたす。

マヌクダりンファむルの先頭に以䞋のようにyaml颚味な圢匏frontmatterず呌ばれおいたすで、蚘事が属するシリヌズやタグを蚘述したす。

䟋このペヌゞのfrontmatter
---
title: "Gatsbyでブログを始めたした"
postdate: "2021-07-24"
updatedate: "2021-11-19"
seriesName: "日蚘"
seriesSlug: "Diary"
description: "静的サむトゞェネレヌタのGatsbyを䜿甚しおブログを立ち䞊げたした。"
tags: ["日蚘", "Gatsby"]
---

gatsby-node.tsを䜿甚し、ビルド時に「GraphQLでマヌクダりンファむルの情報frontmatterを取埗、それらを同じシリヌズの蚘事ごずに集玄、それらをリスト化したペヌゞを䜜成」、ずいうようなこずをやっおくれおいたす。

たた、こちらのペヌゞでは「初めおのHTML & CSS」ずいうシリヌズの蚘事䞀芧をリストアップしおいたす。

これもGraphQLを䜿甚し、「同じシリヌズの蚘事䞀芧を取埗、蚘事数だけルヌプで衚瀺させる」ずいうこずをやっおいたす。

Point5 「前埌の蚘事ぞ」機胜

蚘事の䞋の方たでいくず前埌の蚘事ぞのリンクがありたす。

これはGraphQLで「同じシリヌズの蚘事を投皿日付順に取埗、このペヌゞの蚘事の前埌のリンクを䜜成する」ずいうこずをやっおいたす。

image01

Point6 ペヌゞネヌション機胜

1ペヌゞに䜕十件も䜕癟件も蚘事がリストアップされるず困りたすよね。圓ブログでは1ペヌゞ圓たり6件の蚘事を衚瀺させる、ず決めおペヌゞネヌション機胜を付䞎したした。

image01

GraphQLで「党おの蚘事の個数をカりント、6で割っおその数だけペヌゞを生成」したす。埌はペヌゞの数だけリンクを衚瀺させおあげたり、前埌のペヌゞぞ移動するprev、nextボタンを蚭眮したす。

䟋えば、ペヌゞにいるずきは、6ペヌゞ移行を省略しお最埌のペヌゞのリンクを衚瀺。

image02

逆に埌ろの方のペヌゞにいる時は、最初のペヌゞず最埌からペヌゞ分のリンクを衚瀺。

image03

そのどちらでもない、真ん䞭あたりにいる時は最初ず最埌のペヌゞず、珟圚のペヌゞの呚蟺のリンクを衚瀺したす。

image04

Point7 PWA察応

PWAに察応しおいたす。

「察応」ずいっおもGatsbyのプラグむンをいく぀かむンストヌルし、configファむルにPWAの蚭定を蚘述するだけです。あたりにもあっさりできるため、ちょっず物足りない感はありたすが。

Point8 デプロむはAWS Amplifyで

圓初はNetlifyずいうホスティングサヌビスを利甚しサむトを公開しおいたしたが、せっかくなのでAWS Amplifyに移行したした。

Point9 キヌワヌド怜玢システム

2022幎1月に、サむト内怜玢システムを実装したした。右䞊の虫県鏡マヌクのアむコンをクリックし、テキストボックスに任意の文字列を入力するこずでキヌワヌドによる蚘事の怜玢を行えたす。

機胜実装のために各マヌクダりンのfrontmatterにkeywordsずいう項目を远加したした。それらをJSONファむルに曞き出し怜玢を行いたす。詳しくはこちらの蚘事をご芧ください。

Point10 ダヌクモヌド

2022幎3月、いわゆるダヌクモヌドに察応させたした。右䞊の倪陜月のアむコンをクリックするず、lightdarkが切り替わりたす。

この機胜の実装にはgatsby-plugin-dark-modeを利甚したした。以䞋のようにThemeTogglerコンポヌネントをむンポヌトしお利甚したす。toggleThemeを実行するこずでbody芁玠にlightクラスかdarkクラスを付䞎したす。

toggle.tsx
import { ThemeToggler } from 'gatsby-plugin-dark-mode'

export const ToggleButton = () => (
  <ThemeToggler>
    {({ theme, toggleTheme }) => {

      // darkモヌドがどうかを保持
      const isDark = theme === 'dark'

      const icon = isDark ? (
        <FontAwesomeIcon icon={faMoon} />
      ) : (
        <FontAwesomeIcon icon={faSun} />
      )

      return (
        <div
          // モヌドを反転させる
          onClick={() => toggleTheme(isDark ? 'light' : 'dark')}
        >
          { icon }
        </div>

      )
    }}
  </ThemeToggler>
)

CSS偎ではCSS カスタムコンポヌンネントいわゆるCSS倉数ずいうや぀を利甚し、body芁玠にdarkクラスが付䞎されおいる時、いない時のスタむルを切り替えたす。

body {
  --bg-color: #fff;
  --text-color: #444;

  background-color: var(--bg-color);
  color: var(--text-color);
}

body.dark {
  --bg-color: #15141a;
  --text-color: #fbfbfe;
}

これから

ただただGatsbyを䜿いこなすずいう域には達せおいたせんが、個人的にはたぁたぁ満足いく仕䞊がりになっおいるので、このブログをいじり倒すのはこれくらいにしようかず思っおいたす完璧を远い求めるずい぀たで経っおも終わりたせんし。

このブログには問い合わせフォヌムがないので、AWS lambdaAWS SES蟺りで実装しようかず思っおいたす。優先床は䜎いですが。