Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GatsbyJS hands-on

mottox2
January 08, 2019

GatsbyJS hands-on

2019/01/08にサポーターズで行われた『Gatsbyで今風ウェブサイトの開発ハンズオン』のハンズオン資料です。

https://supporterzcolab.com/event/659/

mottox2

January 08, 2019
Tweet

More Decks by mottox2

Other Decks in Technology

Transcript

  1. TypeScript, React, Gatsby, Ruby on Rails エンジニアの登壇を応援する会 write-blog-every-week, JS Ninja

    Gatsby, Gridsome, Nuxt etc. お仕事 コミュニティ OSS mottox2 @ ؿٔ٦ٓٝأ8FCؒٝآص، ⾃⼰紹介
  2. #spzcolab GatsbyJS HandsOn 今⽇の流れ • Gatsbyの説明 5分 • Reactのおさらい 10分

    • Gatsby⼊⾨ 20分 • GitHub APIを使ったサイト作成デモ 10分 • 覚えておいて欲しいこと 5分 解説 解説 解説
  3. #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と同列にアプリケーションフレームワークと捉えるといいかも。本番環 境にサーバーが必要としないという点が違い。
  4. #spzcolab GatsbyJS HandsOn 何がモダンなのか? • SPA開発で成熟したReact.js, Node.jsの資産が利⽤できる。 • バックエンドとフロントエンドが分離する前提になる。 •

    近年重要性が⾼くなっている⾼速なサイトが作れる。 • Webアプリケーションを作るようにWebサイトが作れる。
  5. #spzcolab GatsbyJS HandsOn • このApp関数が基本的なコンポーネント。こういったコンポーネントを組み合わせてウェ ブサイトやアプリケーションをつくっていく。 コンポーネント import React from

    "react"; import ReactDOM from "react-dom"; import "./styles.css"; const App = () => { return ( <div className="App"> <h1>Hello CodeSandbox</h1> <h2>Start editing to see some magic happen!</h2> </div> ); }; const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement); src/index.js
  6. #spzcolab GatsbyJS HandsOn • 関数の返り値はJSXという記法で書くことが多い。 • <div className=“App"> = React.createElement(“div”,

    { className: “App”}) のように 変換されている。 • HTMLとの差分 • return直下には単⼀要素のみ。 • 閉じタグが常に必要。 • classではなくclassNameにする必要がある。 • {}で囲んだ部分はJSとして評価されます。 JSX
  7. #spzcolab GatsbyJS HandsOn コンポーネント 新しいコンポーネントを作る import React from "react"; import

    ReactDOM from "react-dom"; import Hello from "./Hello"; import "./styles.css"; const App = () => { return ( <div className="App"> <h1>Hello CodeSandbox</h1> <h2>Start editing to see some magic happen!</h2> <Hello name="Taro" /> <Hello name="Kumi" /> </div> ); }; const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement); import React from "react"; const Hello = props => { return <p>Hello {props.name}</p>; }; export default Hello; src/index.js src/Hello.js
  8. #spzcolab GatsbyJS HandsOn プロジェクトの作成 • CodeSandboxの⼈はNew Sandboxで「Gatsby」を選択。 • ローカル開発の⼈ •

    npx gatsby new gatsby-hands-on を実⾏しましょう。 • cd gatsby-hands-on; npm run develop
  9. #spzcolab GatsbyJS HandsOn ディレクトリ構成 • gatsby-config.js • サイトやプラグインの設定を⾏う • gatsby-node.js

    • Gatsbyの動作を変更するファイル • gatsby-browser.js • Browser上の動作を変更するファイル • gatsby-ssr.js • SSR時の動作を変更するファイル
  10. #spzcolab GatsbyJS HandsOn データ層 • Gatsbyで扱うデータを保存しておく層 • Viewやgatsby-node.jsからGraphQLを通して呼べる • gatsby-node.jsやSource

    Pluginを利⽤してデータを⼊れる。 • すべてのデータがGraphQLという統⼀された呼び出し⽅が出来て嬉しい。
  11. #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 プラグインの名前と オプションを⼊⼒する
  12. #spzcolab GatsbyJS HandsOn ソースプラグインの利⽤ • プラグインの中でもGatsbyで利⽤できるソースデータを作成するプラグインをSource Pluginと呼ぶ。命名も gatsby-source-xxxxx となっている。 •

    Gatsbyに限りませんが、ライブラリを利⽤するときはREADME.mdを読みましょう。 ソースプラグインとは? ※ データを加⼯するTransformer Pluginというものも存在しますが、今⽇は扱いません。
  13. #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」 プラグインを利⽤する
  14. #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 <Layout> 7 {props.data.allFeedBlogPost.edges.map(edge => { 8 const post = edge.node 9 return ( 10 <p key={post.guid}> 11 <Link to={`/posts/${post.guid}`}> 12 {post.title} 13 </Link> 14 </p> 15 ) 16 })} 17 </Layout> 18 ) 20 export const query = graphql` 21 { 22 allFeedBlogPost { 23 edges { 24 node { 25 guid 26 title 27 } 28 } 29 } 30 } 31 `
  15. #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 }
  16. #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 <div> 8 <p>{post.title}</p> 9 <div 10 dangerouslySetInnerHTML={{ 11 __html: post.content.replace('\n', '<br/>'), 12 }} 13 /> 14 </div> 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
  17. #spzcolab GatsbyJS HandsOn ⼿順 • GitHubのAPI Tokenを取得 • gatsby-source-githubを利⽤する •

    GraphiQLでデータを確認 • ⼀覧ページの作成 • 詳細ページの作成 • Netlifyにデプロイ
  18. #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を後ほど利⽤するので保管しておいてください。
  19. #spzcolab GatsbyJS HandsOn • 1. プロジェクトを作成します • CodeSandboxの⼈はNew Sandboxで「Gatsby」を選択。 •

    ローカル開発の⼈は npx gatsby new gatsby-github-blog を実⾏しましょう。 • 2. gatsby-source-graphqlをインストールします。 • GitHubはGraphQL形式のAPIを提供しています。このプラグインはGraphQLのAPIで得 られたデータをソースとして扱うためのプラグインです。 Gatsbyのプロジェクトを⽤意
  20. #spzcolab GatsbyJS HandsOn • npm run develop で開発環境を⽴ち上げてGraphiQLを起動 • GraphQLを⼊⼒してデータが帰ってくるか確認します。

    • GitHub APIのクエリは https://developer.github.com/v4/explorer/ で確認できる。 GraphiQLでデータの確認 • 起動する際に環境変数を渡す • `GITHUB_TOKEN=[先程取得したToken] npm run develop`
  21. #spzcolab GatsbyJS HandsOn デプロイ • 環境変数の設定に気をつける。 • Settings > Build

    & Deploy > Environment Variables から設定 • Build hooks の「Add build hook」でデプロイ⽤のURLを⽣成しておく。
  22. #spzcolab GatsbyJS HandsOn Starter • Gatsbyに存在するテンプレートが収集されている。 • いいテンプレートを⾒つけたら `gatsby new

    project-name https://github.com/ gatsbyjs/gatsby-starter-blog` のようにGitHubのURLを引数に渡すと展開してくれる。 https://www.gatsbyjs.org/starters
  23. #spzcolab GatsbyJS HandsOn コードで迷ったら • 実際に動いているコードを参考にする。 • ⼤規模なサイト • gatsbyjs/gatsby/www:

    gatsbyjs.orgのソースコード • reactjs/reactjs.org: reactjs.orgのソースコード • ⽇本⼈ブログ(Gatsby情報を発信している) • mottox2/website: 弊ブログのソースコード • Takumon/blog: Takumonさんのブログ