moyashidaisuke's diary

moyashidaisuke's diary

GatsbyJSのチュートリアルやってみた

2019-04-30 moyashidaisukeJavaScriptReactGatsbyjs

きっかけ

[https://www.jabba.cloud/20190113194504/:embed:cite]

ちょうどシンプルなWebサービスを作るお仕事があったので、ちょうど良さそうと思ったので試してみる事に。

何が良さそう?(やってみる前の印象)

GatsbyJS

他の静的サイトジェネレーター [https://www.staticgen.com/:title]

後発なので、採用されてる技術がモダンです。

私が使った事があるNuxt.jsも素晴らしいのですが、 GatsbyJSは静的サイトジェネレーターに特化していて、この用途に限定するのであれば機能も多く使いやすそうです。(Nuxt.jsはSSRとかもできる)

Reactベース

今だとほぼデファクトなので、色々便利。(雑) (個人的にはvue.jsの方が好きですが)

GraphQL

ローカルのリソースも基本GraphQLで取得する仕組みになっているそうです。 ということは、とりあえずデータをファイルで静的に持っておいて、将来的にはAWSのAppSync等のサービスとつないで拡張とかしやすそう。

aws-sampleでもサンプルコードを提供してくれていました。

[https://github.com/aws-samples/aws-appsync-gatsby-sample:embed:cite]

AppSync自体がシンプルにDynamoDBからの取得もできるし、ちょっと複雑な事をする場合はLambdaを書けばいけるので、シンプルなWebサービスなら全然いけるイケてるやつ。

Netify

[https://tech.qookie.jp/posts/info-netlify-static-web-deploy/:embed:cite]

静的ファイルを置くだけならS3やfirebaseという選択肢もあるのだけど、静的ファイルに特化していて超使いやすい印象。

個人で使うならCDN付きで無料というのはすごい。

さらに、SPA系で困るSEO対策なのだけど、Prerendering機能もあるのでSEO対策もそこそこやってくれそう。

本気でやるとSSRしないといけなくて、ホスト環境からどうしようかという話になってなかなか大変なのだけど、こんな簡単にできるなら素晴らしい話。

[https://www.netlify.com/docs/prerendering/:embed:cite]

[https://qiita.com/kiida/items/bfb7844312c0539d4928:embed:cite]

まとめ

将来的な拡張をある程度は見据えつつ、Webサービスを最速で構築し、コスト(人もお金も)をかけずに運用するならとても良い組み合わせに思われます。

やってみた

公式チュートリアル(雑な要約付き)

[https://www.gatsbyjs.org/tutorial/:embed:cite]

0. Set Up Your Development Environment

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial0:embed:cite]

環境設定です。

もろもろ指定通りにインストールして、コマンド叩けばOKです。英語ですが、コマンドについての細かい説明もあって(cd の説明から)すごく丁寧です。

私はローカルにglobalで入れたくないのでdockerを使いました。

developコマンドで開発用のサーバを立ち上げる際は、

gatsby develop -H 0.0.0.0

とする必要があります。(チュートリアルにも記載があります)

これは、↓と同じ理由ですが、ENVからデフォルト設定を取ってくる実装になっていないので毎回指定する必要があります。

[https://moyashidaisuke.hatenablog.com/entry/2019/01/04/223235:embed:cite]

実装はここ。PR出したら通るかなぁ、、

[https://github.com/gatsbyjs/gatsby/blob/a2f42ebc7d7510ceb70797ba25169960a20de9c4/packages/gatsby-cli/src/create-cli.js#L16:embed:cite]

prettier

チュートリアルではVSCodeがおすすめされていますが、私はJetBrainのIDE(今回はPHPStorm。PHP使わないけど)を使っているので、環境に合わせてprettierをセットアップしました。

docker上に入れるとIDEとの連携が面倒なのでローカルに入れちゃっています。

[https://prettier.io/docs/en/webstorm.html:embed:cite]

npm install --global 

prettierへのpathをマニュアルと変えています。 [femoji-idmoyashidaisuke:20190114144926p:plain]

1. Get to know Gatsby building blocks

公開したサイト

[http://unable-ocean.surge.sh/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial1:embed:cite]

JSX、component(ここまでReactの説明)と、surgeを使った公開まで。

surgeについてはこちらが詳しかったです。

[https://dotstud.io/blog/static-site-hosting-surge/#%E4%BB%96%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A8%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%A9%E3%81%86%E3%81%8B:embed:cite]

2. Introduction to Styling in Gatsby

公開したサイト

[http://untidy-balance.surge.sh/about-css-modules/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial2:embed:cite]

cssの組み込みの説明。css-modulesを使ってscoped css実現。

3. Creating nested layout components

公開したサイト

[http://obsequious-bean.surge.sh/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial3:embed:cite]

layoutの説明。nuxt.jsのlayoutと同じでした。

4. Data in Gatsby

公開したサイト

[http://six-detail.surge.sh/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial4:embed:cite]

GraphQLとりあえず使ってみる編。

GraphQLの利用は必須じゃない(小規模ならcreatePages APIをつかえばGraphQL無しでできる。全然OKとのこと)

ここに限らず、npmパッケージのインストールはチュートリアルのコマンドだと遅いので、yarn使ったほうが良さそうです。(gatsby newではyarn使ってるので特にinstallは不要のはず)

yarn add gatsby-plugin-typography typography react-typography typography-theme-kirkham gatsby-plugin-emotion @emotion/core

5. Source plugins

公開したサイト

[http://gusty-word.surge.sh/my-files/]

完了後のソース [https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial5:embed:cite]

4を発展させて、Source pluginsを使ってfilesystemからデータをGraphQLを使って取得し、画面に表示する。ブラウザでGraphQLを実行できるページ(___graphql)も。

GatsbyJSの真骨頂という感じ。

6. Transformer plugins

公開したサイト

[http://assorted-coast.surge.sh/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial6:embed:cite]

5をさらに発展させて、マークダウンで書いたファイルを読み込んで、GraphQLで扱う。Transformer plugins を使う事で、元ファイルがマークダウンでもGraphQLでいい感じにデータを扱えるようになる。

ブログの一覧ページを作るところまで。

7. Programmatically create pages from data

公開したサイト

[http://ordinary-able.surge.sh/]

完了後のソース

[https://github.com/daisuke-fukuda/gatsby-tutorial/tree/tutorial7:embed:cite]

6をさらに発展させて、各記事ページを作成する。 graqhQLを使う事で何でもできるんだけど、書くことがけっこう多いな、という印象。

ページの作成はここまで。

まとめ

全体的にReactとGraphQLをベースに使う事で、モダンにできてるな〜という印象です。できるものも、ユーザー体験として高速になるし。 プラグインも必要そうなものはかなり揃ってそう。

一方で非エンジニアにはまだまだ敷居が高そうで、wordpressの代わりにはほど遠い感じでした。(私はエンジニアなんでいいけど)

参考

[https://www.gatsbyjs.org/:embed:cite][https://mottox2.com/posts/272:embed:cite]

[https://shibe97.com/blog/gatsby-netlify-cms/:embed:cite]