GatsbyJSでCSS Modulesを使ってみよう

01 19, 2019

GatsbyJSでCSS Modulesを使ってみよう

Webサイトを作成していくとCSSファイルがどんどん肥大化していきます。 そこで、部品ごとにCSSを分割してあてて管理するやり方がいくつかあります。

  • CSS Modules
  • CSS in JS
    といった書き方があります。しかし、JSファイルにCSSに直接書き込むCSS in JSは今回は説明しません。(CSSだけで管理する方が個人的にはやりやすいと今は考えています。) /components/header/index.jsを改修していきます。
import { Link } from 'gatsby'
import PropTypes from 'prop-types'
import React from 'react'

const Header = ({ siteTitle }) => (
  <div
    style={{
      background: `rebeccapurple`,
      marginBottom: `1.45rem`,
    }}
  >
    <div
      style={{
        margin: `0 auto`,
        maxWidth: 960,
        padding: `1.45rem 1.0875rem`,
      }}
    >
      <h1 style={{ margin: 0 }}>
        <Link
          to="/"
          style={{
            color: `white`,
            textDecoration: `none`,
          }}
        >
          {siteTitle}
        </Link>
      </h1>
    </div>
  </div>
)

Header.propTypes = {
  siteTitle: PropTypes.string,
}

Header.defaultProps = {
  siteTitle: ``,
}

export default Header

このCSS全部消します。すると下記のようになります。

import { Link } from 'gatsby'
import PropTypes from 'prop-types'
import React from 'react'

const Header = ({ siteTitle }) => (
  <div>
    <div>
      <h1>
        <Link to="/">
          {siteTitle}
        </Link>
      </h1>
    </div>
  </div>
)

Header.propTypes = {
  siteTitle: PropTypes.string,
}

Header.defaultProps = {
  siteTitle: ``,
}

export default Header

これで確認するとこんな感じになると思います。 gatsbyjs Gatsby Default StarterとHi peopleは同じH1タグです。 続いて/components/header/header.module.cssを作成します。

.title {
 font-size: 1rem
}

ファイル名を.module.cssにすることでCSSはそこにだけ効きます。 続いて/components/header/header.jsを以下のように改変します。

import { Link } from 'gatsby'
import PropTypes from 'prop-types'
import React from 'react'
import styles from "./header.module.css"

const Header = ({ siteTitle }) => (
  <div>
    <div>
      <h1 className={styles.title}>
        <Link to="/">
          {siteTitle}
        </Link>
      </h1>
    </div>
  </div>
)

Header.propTypes = {
  siteTitle: PropTypes.string,
}

Header.defaultProps = {
  siteTitle: ``,
}

export default Header

import styles from "./header.module.css"でCSSを読み込んでいます。そして、

<h1 className={styles.title}>

と書いてCSSを当てています。 するとこうなります。 gatsby CSS Gatsby Default Starterだけが小さくなりましたね。 これだけではCSSのスコープが効いているかわかりません。 そこで/src/pages/index.jsの

<h1>Hi people</h1>

<h1 className="title">Hi people</h1>

にして確認してみましょう。 gatsby CSS 全く同じ状況ですね。
つまり、しっかりCSSスコープが効いていることがわかります。 これでposttitleとかcardtitleとか細かい名前ではなくコンポーネントに分けてしまえばtitleだけで開発してくことが可能になりました。

まとめ

サイトは大型化していくに従いCSSをどこに書いたかわからなくなることが多々あります。また、同じ名前を使いまわしてごちゃごちゃになることも多々あります。あらかじめ細かくCSSmoduleで開発することで効率よくデザインを進めていくことが可能になります。

お願い

頑張って勉強しながら書いています。間違いなどがあればご指摘いただけたらうれしいです。


コリ

コリといいます。奈良県でサラリーマンをしています。GatsbyJSでサイトを作るのが趣味です。