Gatsby チュートリアル (ステップ 2, 3)

チュートリアルを試す

前回のつづき

ステップ2

ステップ2にはスタイルの当て方が書かれている。

2種類の当て方があって、一つは gatsby-browser.js というファイルで CSS ファイルを import する方法。 この CSS はサイト全体に適応される。

gatsby-browser.js
1import "./styles/global.css"

もう一つはコンポーネント単位で CSS を適応する方法。 この方法に関して更に2つの手法が紹介されていて、それぞれ下記のようになっている。

  • CSS Module という方法

    • ****.module.css というファイルに CSS を記載し、それをコンポーネントファイルで import して、要素の className props に紐付ける

      componentA.module.css
      1.my-paragraph {
      2 background-color: red;
      3}
      componentA.js
      1import React from "react"
      2import * as styles from "./componentA.module.css"
      3
      4const ComponentA = () => {
      5 return (
      6 <p className={styles.myParagraph}>test</p>
      7 )
      8}
      9export default ComponentA
  • CSS-in-JS という方法

    • EmotionStyled Components のようなライブラリを使って、 js ファイルの中に CSS を書き、それをコンポーネントに適応する

      css-in-js.js
      1import React from "react"
      2import styled from "styled-components"
      3
      4const MyP = styled.p`
      5 background-color: red;
      6`
      7
      8const ComponentA = () => {
      9 return (
      10 <MyP>test</MyP>
      11 )
      12}
      13export default ComponentA

ちなみにコンポーネントに直接 import "hogehoge.css" としてスタイル適応することも可能だが、例えば h1 タグとかに対するスタイルをクラス名も指定せずに記述してしまうとサイト全体に影響がでるため注意。

それを回避するためには className を指定して、クラスに対してスタイルを当てる。だがそれをするのであれば CSS Module の方法を取るのがおすすめ。クラス名も勝手に BEM みたいにしてくれるので、もしも意図しない別のコンポーネントとたまたまクラス名が衝突していてもスタイルが干渉するリスクがかなり減らせる。

所管

js 内に CSS を記載するよりファイルを分けておきたい性分なので基本的には CSS Module を採用している。だが、チュートリアルを通して触ることになる Emotion や、上に例を記載した Styled Components も、とても小さいコンポーネントであればそこまで悪い選択肢ではないと思った。

あと正直に書くと、この記事を書いているつい今 CSS Module の重要性を再認識し、サイトを CSS Module に準拠させた(笑)。実は上記で良くないよと書いたように import "hogehoge.css" とだけコンポーネントに書いておき、各タグに className props で指定したクラスにスタイルを適応していた。アウトプットの重要性を再認識させられる。。

ステップ3

ステップ3では layout コンポーネントを作って、 コンポーネントをネスト構造化する方法が記載されている。

たとえばサイトではヘッダやフッタは全ページ固定というケースが多いかと思うが、こういったものを layout の方に記載しておき、ページ内コンテンツはページごとにコンポーネントを切り替えるといったか感じ。

layout.js
1import React from "react"
2import Header from "header"
3import Footer from "footer"
4
5const Layout = ({children}) => {
6 return (
7 <>
8 <Header />
9 <main>{children}</main>
10 <Footer />
11 </>
12 )
13}
14export default Layout
sample-page-1.js
1import React from "react"
2import Layout from "layout"
3
4const Page1 = () => {
5 return (
6 <Layout>
7 {/* sample-page-1 のコンテンツ */}
8 </Layout>
9 )
10}
11export default Page1
sample-page-2.js
1import React from "react"
2import Layout from "layout"
3
4const Page2 = () => {
5 return (
6 <Layout>
7 {/* sample-page-2 のコンテンツ */}
8 </Layout>
9 )
10}
11export default Page2

所管

この手のパターンはシンプルだがとても強力で汎用性も高いため、 js, React, Gatsby に限らずあらゆる場面でこういうパターンに遭遇する。

あと、このステップ3を写経すると出来上がるページのデザインがシンプルで好き。本サイトでもそういう無駄と飾り気の無い感じを狙っているが、フォントなのか文字サイズなのか配置なのか。。。まだまだ洗練されていない印象を持っている。

まぁしかしそういった箇所も好きなだけカスタマイズしていけるので、焦らずちょっとずつ無駄を削いでいければと思う。

© 2021 K.S.K. All rights reserved., Built with Gatsby