0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gatsby.js備忘録(参考動画: Net Ninja)

Posted at

概要

いい感じの動画Tutorialがあったので、勉強したことをまとめる。

動画リンク

Githubレポ

1

Gatsby.jsは

  • SSG
  • React & GraphQL

あとはSSGのメリットとか概要の説明

2

公式ページのstarter集

gatsby のインストール

npm install -g gatsby-cli

gatsby projectの開始

gatsby new ${ディレクトリ名} ${インストールするGithubレポジトリ等}

フォルダ

reactっぽい

  • node_modules/
  • src/pages/
  • static

3

route の話とか

gatsbyサイトの開発

gatsby develop

で起動

VSCodeのスニペット

ES7 React/Redux/GraphQL/React-Native snippets
rfc

4

Linkコンポーネントを作っていた

5

Layoutコンポーネントを作っていた

export default function Layout({ children }) {
    return (
        <div className="layout">
            <Navbar />
            <div className="content">
                { children }
            </div>
            <footer>
                <p>Copyright 2025</p>
            </footer>
        </div>
    )        
}

6

styleの追加

styleディレクトリ

global css

  • global.css
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;700&display=swap');

* {
  margin: 0;
  padding: 0;
  text-decoration: none;
  font-family: "Montserrat";
  color: white;
}
html, body {
  min-height: 100%;
}
body {
  background: radial-gradient(at top left, rgba(146,43,225,1) 0%, rgba(43,9,107,1) 100%);
  background-repeat: no-repeat;
}
p {
  margin: 16px auto;
  line-height: 1.5em;
}

/* layout & nav */
.layout {
  max-width: 1200px;
  margin: 0 auto;
}
nav {
  display: grid;
  grid-template-columns: 1fr 1fr;
  margin: 40px auto;
}
nav .links {
  display: inline-block;
  text-align: right;
}
nav a {
  display: inline-block;
  margin-left: 20px;
  font-weight: 400;
  padding-bottom: 8px;
  border-bottom: 3px solid transparent;
}
nav a:hover {
  border-color: white;
}
footer p{
  text-align: center;
  color: #bbb;
  margin: 40px auto;
}

個別のcss

cssの定義

  • {module-name}.module.css

使い方

import styles from '../styles/{module-name}.module.css'

<div className={styles.property} />

7

staticファイル
(最適化されない)

8

graphQL

GraphiQLのアクセスのしかた

9

metadataの定義

gatsby-config.jsを編集

module.exports = {
    siteMetadata: {
        ...
    }
}

graphQL

query MyQuery {
    site {
        siteMetadata {
            copyright
            description
            title
        }
    }
}

jsファイルの中での使い方(ページクエリ)

import { graphql } = 'gatsby.js'

export const query = graphql`
(graphql content)
`

自動的にpropにgraphQLの結果が渡される

10

graphQL (usatic query)

const data = useStaticQuery(graphql`
(graphql content)
`)

以下の点に注意

  • クエリ変数が使えない
  • ファイルの頭文字大文字にしないとエラーが出る
  • コンポーネント内ではuseStaticQueryは一度しか使えない

11

gatsby.jsのdata source plugin

gatsby-config.js

module.exports = {
    plugins: [
        {
            resolve: `gatsby-source-filesystem`,
            options: {
                // The unique name for each instance
                name: `pages`,
                // Path to the directory
                path: `${__dirname}/src/pages/`,
            },
        },
    ],
}

gatsby-config.jsを変更したら、再度gatsby develop

12

gatsby-transformer-remarkを使う
markdownをhtmlに変換してくれる

13

query MyQuery {
    allMarkdownRemark {
        nodes {
            frontmatter {
                slug
                stack
                title
            }
            id
        }
    }
}

reactで配列が出てきたら要素のタグにidを指定する

14

graphqlでソートする
タイトルのアルファベットでソートする例

query MyQuery {
    allMarkdownRemark(sort: {fields: frontmatter__title, order: ASC}) {
        nodes {
            frontmatter {
                slug
                stack
                title
            }
            id
        }
    }
}

15

graphqlにおいて複数のクエリをやるには単に並列すれば良い

query MyQuery {
    allMarkdownRemark(sort: {fields: frontmatter__title, order: ASC}) {
        nodes {
            frontmatter {
                slug
                stack
                title
            }
            id
        }
    }
    site {
        siteMetadata{
            contact
        }
    }
}

別名をつける

query MyQuery {
    projects: allMarkdownRemark(sort: {fields: frontmatter__title, order: ASC}) {
        nodes {
            frontmatter {
                slug
                stack
                title
            }
            id
        }
    }
    contact: site {
        siteMetadata{
            contact
        }
    }
}

16

画像の処理

npm install gatsby-image # イメージコンポーネントへのアクセス
npm install gatsby-transformer-sharp gatsby-plugin-sharp # graphQLで処理する

image fulidはレスポンシブ画像となる
...name のようにすることで複数のものをまとめられる

query MyQuery {
    file(relativePath: {eq: "banner.png"}) {
        childImageSharp {
            fulid {
                ...GatsbyImageSharpFluid
            }
        }
    }
}

17

graphQLにおいてrelative pathはfile nodeになる...?
そしてそのnodeのchildImageSharpを利用して画像を表示できる

<Img fuild={project.frontmatter.thumb.childImageSharp.fluid} />

18

テンプレートファイルの作成

19

ページの生成

gatsby-node.js

exports.createPages = async({ graphql, actions}) => {
    const { data } = await graphql(`
        query Projects {
            allMarkdownRemark {
                nodes {
                    frontmatter {
                        slug
                    }
                }
            }
        }
    `)

    data.allMarkdownRemark.nodes.forEach(node => {
        actions.createPage({
            path: '/projects/' + node.frontmatter.slug,
            component: path.resolve('./src/templates/project-details.js'),
            context: { slug: node.frontmatter.slug }
        })
    })
}

20

graphQL変数

export const query = graphql`
    query Project Page($slug: String) {
        markdownRemark(frontmatter: {slug: {eq: $slug}}) {
            ......
        }
    }
`

21, 22

デプロイ等

まとめ

gatsby.jsのおおよその仕組みが理解できた。
特にGraphQLに詳しくなった

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?