Slide 1

Slide 1 text

GatsbyJS HandsOn モダンウェブサイトの開発ハンズオン 2018.01.08 Supporterz Colab

Slide 2

Slide 2 text

#spzcolab GatsbyJS HandsOn 事前準備 • Node.jsのインストール • GitHubの登録 • CodeSandboxの登録 • Netlifyの登録

Slide 3

Slide 3 text

TypeScript, React, Gatsby, Ruby on Rails エンジニアの登壇を応援する会 write-blog-every-week, JS Ninja Gatsby, Gridsome, Nuxt etc. お仕事 コミュニティ OSS mottox2 @ ؿٔ٦ٓٝأ8FCؒٝآص، ⾃⼰紹介

Slide 4

Slide 4 text

Gatsby製のブログで書いています mottox2.com

Slide 5

Slide 5 text

Contributions to Gatsby

Slide 6

Slide 6 text

技術書典への参加

Slide 7

Slide 7 text

#spzcolab GatsbyJS HandsOn 普段、どういった分野を担当していますか? 質問 フロントエンド、バックエンド、インフラ、モバイルアプリ等

Slide 8

Slide 8 text

#spzcolab GatsbyJS HandsOn 1⼈で参加者全員をサポートするのは難しいです。 出来た⼈は近くの⼈のサポートをお願いします。 お願い

Slide 9

Slide 9 text

#spzcolab GatsbyJS HandsOn ベストプレイヤー賞、あります。 イベント中に良い質問やツイートをした参加者1⼈にプレゼント。 判断基準は⾃分の独断と偏⾒です。質問する際には名前をアピールしてください。

Slide 10

Slide 10 text

#spzcolab GatsbyJS HandsOn 今⽇の流れ • Gatsbyの説明 5分 • Reactのおさらい 10分 • Gatsby⼊⾨ 20分 • GitHub APIを使ったサイト作成デモ 10分 • 覚えておいて欲しいこと 5分 解説 解説 解説

Slide 11

Slide 11 text

#spzcolab GatsbyJS HandsOn 1 Gatsbyとは?

Slide 12

Slide 12 text

#spzcolab GatsbyJS HandsOn Gatsbyとは? • Build blazing fast, modern, beautiful, secure apps and websites with React. • あるいはBlazing fast modern site generator for React • Reactでモダンなウェブサイトやアプリケーションが作れるフレームワーク。 • 静的サイトジェネレーターの⼀種とされているが、Gatsby公式ではsite generatorではあ るがstatic site generatorとは⾔っていない。 • Next.jsやNuxt.jsと同列にアプリケーションフレームワークと捉えるといいかも。本番環 境にサーバーが必要としないという点が違い。

Slide 13

Slide 13 text

#spzcolab GatsbyJS HandsOn Gatsbyのやってくれること • サイトのデータソースを収集。

Slide 14

Slide 14 text

#spzcolab GatsbyJS HandsOn Gatsbyのやってくれること • Datastoreからデータを受け取りReactに⼊れて静的ファイルを⽣成 • これをデプロイすればサイトを公開できる。

Slide 15

Slide 15 text

#spzcolab GatsbyJS HandsOn Gatsbyのやってくれること • HTMLをそのまま表⽰した後、JSを読み込む。 • JSが実⾏されるとSPAとして動作する。

Slide 16

Slide 16 text

#spzcolab GatsbyJS HandsOn 何がモダンなのか? • SPA開発で成熟したReact.js, Node.jsの資産が利⽤できる。 • バックエンドとフロントエンドが分離する前提になる。 • 近年重要性が⾼くなっている⾼速なサイトが作れる。 • Webアプリケーションを作るようにWebサイトが作れる。

Slide 17

Slide 17 text

#spzcolab GatsbyJS HandsOn Gatsbyが利⽤されているサイト • https://reactjs.org • https://gatsbyjs.org • https://airbnb.io • https://mottox2.com

Slide 18

Slide 18 text

#spzcolab GatsbyJS HandsOn Reactのおさらい 2

Slide 19

Slide 19 text

#spzcolab GatsbyJS HandsOn プロジェクトの作成 • https://codesandbox.io/ にアクセス、会員登録して「New Sandbox」をクリック。 「React」を選択しましょう。

Slide 20

Slide 20 text

#spzcolab GatsbyJS HandsOn プロジェクトの作成 • 正しい操作をするとこの画⾯が表⽰されます。エディタでコードを修正すると右ペインの プレビューに反映されます。 プラグインの追加はここから

Slide 21

Slide 21 text

#spzcolab GatsbyJS HandsOn • このApp関数が基本的なコンポーネント。こういったコンポーネントを組み合わせてウェ ブサイトやアプリケーションをつくっていく。 コンポーネント import React from "react"; import ReactDOM from "react-dom"; import "./styles.css"; const App = () => { return (

Hello CodeSandbox

Start editing to see some magic happen!

); }; const rootElement = document.getElementById("root"); ReactDOM.render(, rootElement); src/index.js

Slide 22

Slide 22 text

#spzcolab GatsbyJS HandsOn • 関数の返り値はJSXという記法で書くことが多い。 •
= React.createElement(“div”, { className: “App”}) のように 変換されている。 • HTMLとの差分 • return直下には単⼀要素のみ。 • 閉じタグが常に必要。 • classではなくclassNameにする必要がある。 • {}で囲んだ部分はJSとして評価されます。 JSX

Slide 23

Slide 23 text

#spzcolab GatsbyJS HandsOn コンポーネント 新しいコンポーネントを作る import React from "react"; import ReactDOM from "react-dom"; import Hello from "./Hello"; import "./styles.css"; const App = () => { return (

Hello CodeSandbox

Start editing to see some magic happen!

); }; const rootElement = document.getElementById("root"); ReactDOM.render(, rootElement); import React from "react"; const Hello = props => { return

Hello {props.name}

; }; export default Hello; src/index.js src/Hello.js

Slide 24

Slide 24 text

#spzcolab GatsbyJS HandsOn スタイル • いろいろな⽅法がありますが、Gatsby公式でも採⽤されているemotionというライブラ リを推奨しています。 • ⽇本の企業においてはstyled-componentsを採⽤している会社も多いです。 • が、時間の関係上、今⽇は省略。 • https://emotion.sh/docs/install

Slide 25

Slide 25 text

#spzcolab GatsbyJS HandsOn デプロイ • Netlifyを利⽤してデプロイします。 • GitHubにあるリポジトリと紐付けるだけです。 • デモします。

Slide 26

Slide 26 text

#spzcolab GatsbyJS HandsOn Gatsby⼊⾨ 3

Slide 27

Slide 27 text

#spzcolab GatsbyJS HandsOn プロジェクトの作成 • CodeSandboxの⼈はNew Sandboxで「Gatsby」を選択。 • ローカル開発の⼈ • npx gatsby new gatsby-hands-on を実⾏しましょう。 • cd gatsby-hands-on; npm run develop

Slide 28

Slide 28 text

#spzcolab GatsbyJS HandsOn ディレクトリ構成 • gatsby-config.js • サイトやプラグインの設定を⾏う • gatsby-node.js • Gatsbyの動作を変更するファイル • gatsby-browser.js • Browser上の動作を変更するファイル • gatsby-ssr.js • SSR時の動作を変更するファイル

Slide 29

Slide 29 text

#spzcolab GatsbyJS HandsOn ルーティング • Gatsby上でのルーティングはsrc/pages以下のファイルに従って設定される。 src/pages/ index.js => / about.js => /sample about/profile.js => /about/profile ※ 動的なページ⽣成は後述します。 例

Slide 30

Slide 30 text

#spzcolab GatsbyJS HandsOn データ層 • Gatsbyで扱うデータを保存しておく層 • Viewやgatsby-node.jsからGraphQLを通して呼べる • gatsby-node.jsやSource Pluginを利⽤してデータを⼊れる。 • すべてのデータがGraphQLという統⼀された呼び出し⽅が出来て嬉しい。

Slide 31

Slide 31 text

#spzcolab GatsbyJS HandsOn プラグイン • 主にgatsby-node.js, gatsby-browser.js, gatsby-ssr.jsを含んだnpmパッケージ。 • npm installに加えてgatsby-config.jsに記述して利⽤する。 module.exports = { siteMetadata: { title: `Gatsby Default Starter`, description: `Site description`, author: `@gatsbyjs`, }, plugins: [ { resolve: "gatsby-plugin-xxxx", options: { option1: "sample option" }, }, ], } gatsby-config.js プラグインの名前と オプションを⼊⼒する

Slide 32

Slide 32 text

#spzcolab GatsbyJS HandsOn ソースプラグインの利⽤ • プラグインの中でもGatsbyで利⽤できるソースデータを作成するプラグインをSource Pluginと呼ぶ。命名も gatsby-source-xxxxx となっている。 • Gatsbyに限りませんが、ライブラリを利⽤するときはREADME.mdを読みましょう。 ソースプラグインとは? ※ データを加⼯するTransformer Pluginというものも存在しますが、今⽇は扱いません。

Slide 33

Slide 33 text

#spzcolab GatsbyJS HandsOn ソースプラグインの利⽤ • 今回は試しに gatsby-source-rss-feed を利⽤します。 • https://github.com/mottox2/gatsby-source-rss-feed • 1. gatsby-source-rss-feed をインストール。 • 2. README.mdに従ってgatsby-config.jsに記述を追加。 • 今回はurlに「https://mottox2.com/rss.xml」nameに「BlogPost」を設定します。 • 3. ここでgatsby developを再起動。 • CodeSandboxの⼈は「Server Controll Panel > Restart Sandbox」 プラグインを利⽤する

Slide 34

Slide 34 text

#spzcolab GatsbyJS HandsOn ソースプラグインの利⽤ • npm run developで/___graphqlのページを確認 • Gatsbyのデータ層で持っているデータを確認できる。 GraphiQLで確認 URL末尾に「___graphql」を追加 この欄にクエリを書く

Slide 35

Slide 35 text

#spzcolab GatsbyJS HandsOn この欄にクエリを書いて実⾏ 結果が表⽰される

Slide 36

Slide 36 text

#spzcolab GatsbyJS HandsOn • src/pages/index.jsを編集します。 • queryという定数にGraphQLを⼊⼒し
 exportします。 • props.dataの中にクエリの結果が⼊る。 Reactでデータを利⽤する αΠτ্ʹGraphQLͰಘͨ৘ใΛදࣔͰ͖Δ 1 import React from 'react' 2 import { Link, graphql } from 'gatsby' 3 import Layout from '../components/layout' 4 5 export default props => ( 6 7 {props.data.allFeedBlogPost.edges.map(edge => { 8 const post = edge.node 9 return ( 10

11 12 {post.title} 13 14

15 ) 16 })} 17 18 ) 20 export const query = graphql` 21 { 22 allFeedBlogPost { 23 edges { 24 node { 25 guid 26 title 27 } 28 } 29 } 30 } 31 `

Slide 37

Slide 37 text

#spzcolab GatsbyJS HandsOn 動的ページの⽣成 • gatsby-node.jsでソースプラグインで得た
 データを元に動的にページを⽣成する。 gatsby-node.js gatsby-config.js 1 const path = require('path') 2 3 exports.createPages = ({ graphql, actions }) => { 4 const { createPage } = actions 5 const post = path.resolve('./src/templates/post.js') 6 return graphql(` 7 { 8 allFeedBlogPost { 9 edges { 10 node { 11 guid 12 } 13 } 14 } 15 } 16 `).then(result => { 17 console.log(result.data.allFeedBlogPost.edges) 18 result.data.allFeedBlogPost.edges.forEach(post => { 19 createPage({ 20 path: `/stories/${post.guid}`, 21 component: post, 22 context: { 23 guid: post.guid 24 } 25 }) 26 }) 27 }) 28 }

Slide 38

Slide 38 text

#spzcolab GatsbyJS HandsOn 動的ページの⽣成 • src/templates内にpost.jsを作成 • gatsby-node.jsを利⽤しデータ層の
 データを元に動的にページを⽣成する。 • query内の$guidはcreatePageで渡された
 context内のguid テンプレートの作成 1 import React from 'react' 2 import { graphql } from 'gatsby' 3 4 export default props => { 5 const post = props.data.feedBlogPost 6 return ( 7
8

{post.title}

9
'), 12 }} 13 /> 14
15 ) 16 } 17 18 export const query = graphql` 19 query($guid: String!) { 20 feedBlogPost(guid: { eq: $guid }) { 21 title 22 content 23 } 24 } 25 ` src/templates/post.js

Slide 39

Slide 39 text

#spzcolab GatsbyJS HandsOn ビルド&デプロイ • `gatsby build`でpublish/以下に静的ファイルを⽣成してくれる。 • デプロイはNetlifyがおすすめ。 • ⾒せます。

Slide 40

Slide 40 text

#spzcolab GatsbyJS HandsOn 4 GitHub APIを利⽤したサイト作成

Slide 41

Slide 41 text

#spzcolab GatsbyJS HandsOn 何をつくるのか? • GitHubのIssueを作成すると、サイト上のコンテンツとしてデプロイされるサイト。 • なぜ作る? • GitHubはWebエンジニアならお⼿軽に使えるデータストア。 • 各⼈、この構成を元にデータストアを変えてほしい。 • デモ⾒せます。

Slide 42

Slide 42 text

#spzcolab GatsbyJS HandsOn ⼿順 • GitHubのAPI Tokenを取得 • gatsby-source-githubを利⽤する • GraphiQLでデータを確認 • ⼀覧ページの作成 • 詳細ページの作成 • Netlifyにデプロイ

Slide 43

Slide 43 text

#spzcolab GatsbyJS HandsOn GitHubのAPI Tokenを取得 • 1. https://github.com/settings/tokens にアクセス。 • 2. 「Generate new token」をクリックしてTokenの設定画⾯に遷移します。 • 3. Token descriptionに適当な説明(ex. supporterz)を⼊⼒し、「Generate Token」を クリック。Public RepositoryであればScopeの設定は不要です。 • 4. このTokenを後ほど利⽤するので保管しておいてください。

Slide 44

Slide 44 text

#spzcolab GatsbyJS HandsOn • 1. プロジェクトを作成します • CodeSandboxの⼈はNew Sandboxで「Gatsby」を選択。 • ローカル開発の⼈は npx gatsby new gatsby-github-blog を実⾏しましょう。 • 2. gatsby-source-graphqlをインストールします。 • GitHubはGraphQL形式のAPIを提供しています。このプラグインはGraphQLのAPIで得 られたデータをソースとして扱うためのプラグインです。 Gatsbyのプロジェクトを⽤意

Slide 45

Slide 45 text

#spzcolab GatsbyJS HandsOn gatsby-source-graphqlの導⼊ • gatsby-config.jsにプラグインの設定をします。次のコードを追記してください。

Slide 46

Slide 46 text

#spzcolab GatsbyJS HandsOn • npm run develop で開発環境を⽴ち上げてGraphiQLを起動 • GraphQLを⼊⼒してデータが帰ってくるか確認します。 • GitHub APIのクエリは https://developer.github.com/v4/explorer/ で確認できる。 GraphiQLでデータの確認 • 起動する際に環境変数を渡す • `GITHUB_TOKEN=[先程取得したToken] npm run develop`

Slide 47

Slide 47 text

#spzcolab GatsbyJS HandsOn ⼀覧ページの作成 • src/pages/index.jsを次のように編集
 します。 • queryという定数にGraphQLを⼊⼒し
 exportします。 • コンポーネントのprops.dataに
 データが渡されます。

Slide 48

Slide 48 text

#spzcolab GatsbyJS HandsOn 詳細ページの作成 • gatsby-node.jsで動的にページを⽣成するコードを書きます。 • ついでにsrc/templates/detail.jsも書きます。

Slide 49

Slide 49 text

#spzcolab GatsbyJS HandsOn デプロイ • 環境変数の設定に気をつける。 • Settings > Build & Deploy > Environment Variables から設定 • Build hooks の「Add build hook」でデプロイ⽤のURLを⽣成しておく。

Slide 50

Slide 50 text

#spzcolab GatsbyJS HandsOn GitHubのWebhook設定 • https://github.com/mottox2-sandbox/gatsby-github-blog/settings/hooks/new

Slide 51

Slide 51 text

#spzcolab GatsbyJS HandsOn 覚えておいて欲しいこと 5

Slide 52

Slide 52 text

#spzcolab GatsbyJS HandsOn Starter • Gatsbyに存在するテンプレートが収集されている。 • いいテンプレートを⾒つけたら `gatsby new project-name https://github.com/ gatsbyjs/gatsby-starter-blog` のようにGitHubのURLを引数に渡すと展開してくれる。 https://www.gatsbyjs.org/starters

Slide 53

Slide 53 text

#spzcolab GatsbyJS HandsOn Showcase • Gatsbyで作られたサイトが掲載されている。 • ⾃分のサイトを載せることもできるので、つくった⼈はSubmitしよう。 • はじめてのConributeに最適。 https://www.gatsbyjs.org/showcase

Slide 54

Slide 54 text

#spzcolab GatsbyJS HandsOn コードで迷ったら • 実際に動いているコードを参考にする。 • ⼤規模なサイト • gatsbyjs/gatsby/www: gatsbyjs.orgのソースコード • reactjs/reactjs.org: reactjs.orgのソースコード • ⽇本⼈ブログ(Gatsby情報を発信している) • mottox2/website: 弊ブログのソースコード • Takumon/blog: Takumonさんのブログ

Slide 55

Slide 55 text

#spzcolab GatsbyJS HandsOn