Gatsbyってなに？大きく「G」って書いたカラフルなやつしかわからんかったから調べてみるわ。【環境構築まで】

これまで聞いたけ触れたことなかったGatsbyについて触れてみました。

:::note info
【こんな人にオススメ！】
・Gatsbyについて知りたい人
・これからGatsbyを使ってみようとしている人
:::

## Gatsbyってなに？
React向けの静的サイトジェネレーターです。
テンプレートを使って開発するのが一般できで、Gatsby.jsがHTML、CSS、JavaScriptを静的なファイルを生成してくれます。

:::note info
【静的サイトジェネレーター】
`SSG = Static Site Generator`でHTML、CSS、JavaScriptによる静的なサイトを生成するツールのこと
:::

静的サイトジェネレーターはそのほかにもたくさんあります。

https://jamstack.org/generators/

Filterで「JavaScript」で絞り込むとGitHubのスター順にJavaScript制のジェネレーターが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/2f7ed258-811d-b76a-2699-2cbd4d3e0ac6.png)

Next.js、Gatsby、NuxtがTOP3、4〜7位にDocusaurus、Hexo、GitBook、Astroが並びます。
私は初めて聞いたものばかりでしたが、GitBookはドキュメントなどで使えそう…とフワッと思いました。

https://jamstack.org/generators/docusaurus/

https://jamstack.org/generators/hexo/

https://jamstack.org/generators/gitbook/

https://jamstack.org/generators/astro/


## とりあえずGatsbyを始めてみる
gatsbyコマンド叩けるようになるためにインストールします。
```
sudo npm install -g gatsby-cli
```
インストールが終了したのでhelpコマンドを叩いて利用できるか試してみます。
```
gatsby --help
```
インストールはできてそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/ef044e33-625a-08b2-4851-3b47b8c1abad.png)

次に公式のDOcsを参考にプロジェクトを作成します。

https://www.gatsbyjs.com/docs/

```
gatsby init
```
会話形式で設定していきます。
```
// サイトの名前を決めます
What would you like to call your site?

// 生成するディレクトリー名を決めます
What would you like to name the folder where your site will be created?

// typeScriptかJavaScriptかを選択する
Will you be using JavaScript or TypeScript?
  JavaScript
❯ TypeScript

// CMSを利用するかを選択
Will you be using a CMS?
❯ No (or I'll add it later)
  Contentful
  DatoCMS
  Netlify CMS
  Sanity
  Shopify
  WordPress

// スタイルのシステムを選択　（Emotion選択したかった…）
? Would you like to install a styling system?
❯ No (or I'll add it later)
  Emotion
  PostCSS
  Sass
  styled-components
  Theme UI
  vanilla-extract

// プラグインどうするか（複数選択、エンターで選択）
 Would you like to install additional features with other plugins?
(Multiple choice) Use arrow keys to move, spacebar to select, and confirm with an enter on "Done"
 ◯ Add the Google gtag script for e.g. Google Analytics
 ◉ Add responsive images
 ◉ Add an automatic sitemap
 ◉ Generate a manifest file
 ◯ Add Markdown and MDX support
 ◯ Add Markdown support (without MDX)
❯ Done
```

initの後にエラーが出たので`npm audit fix --force`とか実行して調整します。
`npm run develop`で環境を立ち上げます。
どうやらできたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/c0b241d3-6a2e-2e33-2314-fd7dbdb56969.png)

## ファイル構成
Reactベースで開発されているのでファイル構成はだいたい同じだと感じました。

生成した後のpackage.jsonの記述です。
```json
{
  "name": "gatsby",
  "version": "1.0.0",
  "private": true,
  "description": "gatsby",
  "keywords": [
    "gatsby"
  ],
  "scripts": {
    "develop": "gatsby develop",
    "start": "gatsby develop",
    "build": "gatsby build",
    "serve": "gatsby serve",
    "clean": "gatsby clean",
    "typecheck": "tsc --noEmit"
  },
  "dependencies": {
    "gatsby": "^5.3.3",
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@types/node": "^18.11.10",
    "@types/react": "^18.0.26",
    "@types/react-dom": "^18.0.9",
    "typescript": "^4.9.3"
  }
}
```
ルートディレクトリに`src`フォルダがありその中のpagesに表示されているTOPページのコードがあります。
変更はリアルタイムに反映されますので画面のリロードは必要はありません。

### 新しいページを作ってみる
新しいページを作れば勝手にルーティングしてくれます。
profile.tsxを作成して表示してみたいと思います。

pagesの下にprofile.tsxを作成します。
```
import * as React from 'react';
import type { HeadFC, PageProps } from 'gatsby';

const Profile: React.FC<PageProps> = () => {
  return <div>My Profile</div>;
};

export default Profile;

export const Head: HeadFC = () => <title>My Profile</title>;
```
現時点でPropsなどは渡していませんが、雛形かと思うのでとりあえずこれでページへアクセスしてみます。

`http://localhost:8000/profile/`にアクセスすると下記のように表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/12c81dcd-3dd7-fb57-0821-fd4689a83ef7.png)

簡単なサイトならすぐに作れます！

## まとめ
インストールのところで少し手間取りましたが、開発環境を構築するのがめちゃくちゃ簡単です。
表示に関してもさまざまなテンプレートが用意されているので、ちょっと見えるものが作りたい！だけなら非常に便利だというのが所感です。

デプロイしたい！ってことであればGatsbyが用意してくれているクラウドがあるのでそちらを利用するのが良いと思います！

https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting/deploying-to-gatsby-cloud/