静的ファイルジェネレーターとは
静的ファイルジェネレーターとはプログラマブルに書いたソースを静的なHTMLファイルに書き出すツールです。
そしてGatsbyは単なる静的ファイルジェネレーターではなく、SSRやAMPなどのモダンな技術が最初から組み込まれています。
競合ツールとしては、同じJavaScript製としてはNuxt.jsや、Rubyで作られたJekyllなどがあります。
公式サイトに比較がまとめられてますので参考にしてください。
Gatsby vs JAMstack frameworks
インストール
npxでインストールできます。
ターミナルを起動して下記を実行します。
$ npx gatsby new hello-world https://github.com/gatsbyjs/gatsby-starter-hello-world
ディレクトリが作られたらcdで移動して開発をはじめましょう。
$ cd hello-world $ npm run develop
run develop
を実行するとブラウザでローカルホストにアクセスできるようになります。
http://localhost:8000
「Hello world!」と表示されたら成功です。
ページの編集
「Hello world!」と表示されましたが、このファイルがどこにあるかというとsrc/pages
ディレクトリのindex.js
ファイルです。
試しに次のように編集してみましょう。
src/pages/index.js
import React from 'react' export default () => <div>ハローワールド!</div>
保存するとブラウザの文字が「ハローワールド!」に切り替わりましたね。
ページの作成
今度は新しいページを作成してみましょう。
自己紹介ページを作成したいとします。
pages
ディレクトリに新しくabout.js
ファイルを作成して、下記のように編集します。
src/pages/about.js
import React from 'react' export default () => ( <div> <h1>About</h1> <p>自己紹介</p> <img src="https://source.unsplash.com/random/400x200" alt="" /> </div> )
about.js
というファイルで作成したので、下記でアクセスできます。
http://localhost:8000/about/
共通で使用するコンポーネント(ヘッダー)の作成
ヘッダーとかは各ページで共通で使用したいので別ファイルにしたいですよね。
src/components
ディレクトリを作成して、その中にheader.js
ファイルを作成します。
src/components/header.js
import React from 'react' export default () => <h1>テストサイト</h1>
index.js
に作成したheader.js
を配置してみます。
src/pages/index.js
import React from 'react' import Header from '../components/header' export default () => ( <div> <Header /> <h2>index</h2> <p>トップページ</p> </div> )
about.js
にも同じように配置してみてください。これでheader.js
を編集するだけですべてのページに反映することができるようになりました。
リンクの設定
作成した2つのページにリンクを設定して飛べるようにしましょう。
GatsbyにはLink
コンポーネントがあるので、aタグではなくこちらを使用してみます。
header.js
に記述することで全ページにリンクを設定できますね。
src/components/header.js
import React from 'react' import { Link } from 'gatsby' export default () => ( <header> <h1>テストサイト</h1> <ul> <li><Link to="/">Home </Link></li> <li><Link to="/about/">About</Link></li> </ul> </header> )
Link
コンポーネントを使用することで、カレントページのナビゲーションにaria-current
が付与されます。
<ul> <li><a aria-current="page" class="" href="/">Home </a></li> <li><a href="/about/">About</a></li> </ul>
たぶんその他にもいいことがあるのではないかと思います。
スタイルを付ける
このままだと何もスタイルされていないしょぼいページな感じなので、CSSを設定していい感じにしてみましょう。
src
ディレクトリにstyles
ディレクトリを新しく作成して、global.css
ファイルを作成します。
src/styles/global.css
html { background-color: #eee; }
全体的にスタイルを反映させたい場合はルートにgatsby-browser.js
というファイルを作ります。
gatsby-browser.js
import './src/styles/global.css'
このファイルでは作成したglobal.css
をインポートするだけです。
gatsby-browser.js
を新しく作成した場合は一度ローカルサーバーを再起動する必要があります。
ターミナルで、Ctrl + c
で停止して、再度$ npm run develop
を実行してください。
コンポーネント別のスタイルを設定する
普通のCSS構造の場合グローバルにしかスタイルの設定ができないから、めちゃくちゃ長いクラス名とかにしなくてはいけなかったりしますけど、Gatsby(React)の利点の一つとして、コンポーネント毎に完全に分けて設定できるので完結に書けるところにあります。
例えば、お知らせ一覧のようなコンポーネントを作るとします。
src/styles/news.module.css
.list { border: solid 1px #bbb; } .list th { padding-right: 30px; }
作成したCSSファイルをimportして、新しく作ったtableタグにclassName
で適応させます。
src/styles/news.module.css
import React from 'react' import Header from '../components/header' import snewsSyles from '../styles/news.module.css' export default () => ( <div> <Header /> <h2>index</h2> <p style={{ fontSize: 32, fontWeight: 'bold' }}>トップページ</p> <table className={snewsSyles.list}> <tr> <th>2019.10.10</th> <td>新しいお知らせ</td> </tr> <tr> <th>2019.10.10</th> <td>古いお知らせ</td> </tr> </table> </div> )
タグのクラス名はこんな感じに変換されてます。
<table class="news-module--list--3r0Os">
ビルドする
一度ここまでの状態で静的ファイルに書き出してみましょう。
$ npm run build
public
ディレクトリにHTMLファイルの他、色々ファイルが書き出されます。
ということで、Gatsbyの基本的な使い方がわかったことで以上になります。
これだけだとあまりGatsbyにする意味がないですが、マークダウンファイルを表示したりとか、バックエンドと連携させたりとかできるようなので、また機会がありましたらやってみたいと思います。
Get to know Gatsby building blocks