チュートリアルを試す
前回のつづきステップ2
ステップ2にはスタイルの当て方が書かれている。
2種類の当て方があって、一つは gatsby-browser.js というファイルで CSS ファイルを import する方法。
この CSS はサイト全体に適応される。
1import "./styles/global.css"
もう一つはコンポーネント単位で CSS を適応する方法。 この方法に関して更に2つの手法が紹介されていて、それぞれ下記のようになっている。
CSS Module という方法
****.module.cssというファイルに CSS を記載し、それをコンポーネントファイルで import して、要素のclassNameprops に紐付けるcomponentA.module.css1.my-paragraph {2 background-color: red;3}componentA.js1import React from "react"2import * as styles from "./componentA.module.css"34const ComponentA = () => {5 return (6 <p className={styles.myParagraph}>test</p>7 )8}9export default ComponentA
CSS-in-JS という方法
EmotionやStyled Componentsのようなライブラリを使って、 js ファイルの中に CSS を書き、それをコンポーネントに適応するcss-in-js.js1import React from "react"2import styled from "styled-components"34const MyP = styled.p`5 background-color: red;6`78const 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 の方に記載しておき、ページ内コンテンツはページごとにコンポーネントを切り替えるといったか感じ。
1import React from "react"2import Header from "header"3import Footer from "footer"45const Layout = ({children}) => {6 return (7 <>8 <Header />9 <main>{children}</main>10 <Footer />11 </>12 )13}14export default Layout
1import React from "react"2import Layout from "layout"34const Page1 = () => {5 return (6 <Layout>7 {/* sample-page-1 のコンテンツ */}8 </Layout>9 )10}11export default Page1
1import React from "react"2import Layout from "layout"34const Page2 = () => {5 return (6 <Layout>7 {/* sample-page-2 のコンテンツ */}8 </Layout>9 )10}11export default Page2
所管
この手のパターンはシンプルだがとても強力で汎用性も高いため、 js, React, Gatsby に限らずあらゆる場面でこういうパターンに遭遇する。
あと、このステップ3を写経すると出来上がるページのデザインがシンプルで好き。本サイトでもそういう無駄と飾り気の無い感じを狙っているが、フォントなのか文字サイズなのか配置なのか。。。まだまだ洗練されていない印象を持っている。
まぁしかしそういった箇所も好きなだけカスタマイズしていけるので、焦らずちょっとずつ無駄を削いでいければと思う。