Tutorial

มาลองใช้ StaticQuery ใน Gatsby v2 กัน

By Arnon Puitrakul - 20 กรกฎาคม 2018

มาลองใช้ StaticQuery ใน Gatsby v2 กัน

เรื่องมันเกิดจากเมื่อราว ๆ เดือนก่อนก็พยายาม Upgrade Gatsby ใน Blog (เว็บนี้แหละ) ให้เป็น V2 Beta เลยต้องมานั่งอ่าน Migration Guide แล้วไปเจอกับสิ่งที่เรียกว่า StaticQuery เข้า ตอนแรกก็เฉย ๆ แต่พอมานั่งอ่านมันดี ๆ แล้ว มันโคตรแจ่ม วันนี้เลยมาสั้น ๆ จะมาแนะนำท่าที่จะใช้จากมันกัน

StaticQuery คืออะไร ?

StaticQuery เป็น API ใน Gatsby V2 ที่ทำให้เราสามารถรัน GraphQL Query จาก Component ได้ ถ้าใครใช้ V1 อยู่จะรู้ว่า GraphQL Query สามารถทำได้ผ่าน Page หรือ Layout ได้แค่นั้น ไม่สามารถแปะไว้ในไฟล์ Component ใด ๆ ได้

ถ้าเราใส่ไว้ ตอนเราสั่ง develop มันจะขึ้นเตือนอยู่ ตอนแรก ๆ ที่ผมเขียนก็ไม่รู้ก็เขียนใส่ใน Component ไปดอกนึง งมอยู่เป็นวัน สรุปคือมันทำไม่ได้ แต่มาใน Version 2 สามารถทำได้แล้วผ่าน StaticQuery นั่นเอง

มาลองเล่นกันดีกว่า

ก่อนอื่นให้เราไปสร้าง Gatsby Project กันก่อนโดยใช้ gatsby-cli เหมือนปกติที่เราสร้าง Project กัน แต่ครั้งนี้เราต้องการ Version 2 เลยต้องเพิ่ม Option นิดหน่อย

gatsby new static-query-tester https://github.com/gatsbyjs/gatsby-starter-default#v2

จริง ๆ ใน Starter ของ Version 2 มันก็มีการใช้ StaticQuery มาแล้วละ ตรง Layout ก็มีเขียนไว้อยู่ ดังนั้นเราลองมาดูกันว่า ใน Starter เขียนอะไรมาบ้าง

import React from 'react'
import PropTypes from 'prop-types'
import {Helmet} from 'react-helmet'
import { StaticQuery, graphql } from "gatsby"

import Header from './header'
import './layout.css'

const Layout = ({ children, data }) => (
  <StaticQuery
    query={graphql`
      query SiteTitleQuery {
        site {
          siteMetadata {
            title
          }
        }
      }
    `}
    render={data => (
      <>
        <Helmet
          title={data.site.siteMetadata.title}
          meta={[
            { name: 'description', content: 'Sample' },
            { name: 'keywords', content: 'sample, something' },
          ]}
        />
        <Header siteTitle={data.site.siteMetadata.title} />
        <div
          style={{
            margin: '0 auto',
            maxWidth: 960,
            padding: '0px 1.0875rem 1.45rem',
            paddingTop: 0,
          }}
        >
          {children}
        </div>
      </>
    )}
  />
)

Layout.propTypes = {
  children: PropTypes.node.isRequired,
}

export default Layout

layout.js

ในไฟล์นี้ เราจะเห็นว่า เขา Import StaticQuery และ graphql ออกมาและสั่ง render Component ชื่อ StaticQuery ออกมา ทำให้เราเห็นว่า StaticQuery ก็เป็นเหมือน Component นึง ที่เราสามารถป้อน Query และ Children เป็น Props ลงไปได้ ดังนั้นวิธีใช้ก็ง่าย ๆ เหมือนเราเรียกใช้ Component ทั่ว ๆ ไปเลย

แล้วมันช่วยอะไร ?

คนที่ไม่เคยเขียน Gatsby มาก่อนน่าจะยังนึกภาพไม่ออกว่ามันเข้ามาช่วยอะไร แต่กลับกัน ถ้าเป็นคนที่เคยเขียนมาก่อนจะรู้ว่า มันโคตรแจ่ม เคสง่าย ๆ อย่างเช่น ถ้าเราต้องการ SiteInfo ที่เราเขียนไว้ใน gatsby-config.js เราก็จะต้องทำผ่าน GraphQL Query ที่เราสามารถทำได้ใน Layout และ Page เท่านั้น

แต่เวลาเราเขียนกัน เราจะเขียน Header แยกออกไปเป็นอีกไฟล์นึง เพราะฉะนั้น เราจะต้อง Query ชื่อเว็บ ที่อยู่ใน SiteInfo ทุกที่ที่เราเรียกใช้ Header แล้วโยนเข้าไปเป็น Props ให้ Header ซึ่งมันกินบรรทัดของ Code เยอะมาก และทำให้ Code ค่อนข้างรก เพราะเราต้องเขียนเรียกส่วนที่ Header ต้องการซำ้ ๆ กันหลาย ๆ ครั้งตามจำนวนที่เราเรียก Header

หรืออีกเคสที่น่าเอามาใช้ก็น่าจะเป็นเหมือนกับ Top Stories หรือ Top Sale ที่มันจะฟีทของหรือบทความที่คนดูเยอะ หรือซื้อเยอะสุดมาให้ โดยที่เราไม่ต้องสั่ง Query ใน Layout ให้เปลืองบรรทัด Code มากขึ้นอีก

สรุป

StaticQuery เป็น API ตัวใหม่ใน Gatsby v2 ที่จะเข้ามาช่วยให้เราสามารถเรียก GraphQL Query จาก Component ไหนก็ได้ ต่างจาก V1 ที่สามารถ Query ได้จากแค่ Layout และ Page เท่านั้น ทำให้เราไม่ต้องโยนข้อมูลที่เป็น Static ไม่ต้องขึ้นกับอะไร เช่น Header ที่แสดงแค่ประมาณชื่อเว็บอะไรประมาณนั้น ก็เป็น API ที่ผมชอบมาก อยากให้ทุกคนลองฮ่ะ มันช่วยให้ Code เราสะอาดขึ้นมาก

Read Next...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...