Gatsbyã§ããã°ãäœãçŽããŸãã
æ å ±ãã¢ãŠããããã§ããå Žæã欲ãããªãšåããæã£ãŠãããQiitaãã¯ãŠãªããã°ã®å©çšãèããŠããŸããããããã£ãšæ°æ¥œã«ããããããèªåã¡ã¢çãªãã®ã眮ãããããã¹ã¿ã€ã«ã¯èªåã§èªç±ã«å€ãããããªã©ãšèšãèš³ã°ããããŠå šç¶é²ãã§ããŸããã§ããã
ãããæ å ±ãä»å ¥ããŠãããã¡ã«ãGatsbyãšããéçãµã€ããžã§ãã¬ãŒã¿ãŒãç¥ãããããã¯é¢çœããã ïŒæ¥œã§ãããã ïŒé¢åããããªãããã ïŒïŒããšæãäžå¿µçºèµ·ãéãè °ããããããšã«ããŸãããéçãµã€ããžã§ãã¬ãŒã¿ãŒã«ã¯æ°å€ãã®éžæè¢ããããŸãããããJavaScriptã§æžãããã®ãããããæ°ããæè¡ã®ç¿åŸãå Œãããããšããããšã§ãçµå±Gatsbyãæ¡çšããŸããã
ä»ã«ãè²ã ãªéçãµã€ããžã§ãã¬ãŒã¿ãŒã䜿ã£ãŠWebãµã€ããäœã£ãŠãŸãã®ã§ãããã«é¢ããŠã®èšäºã¯ãã¡ããã芧ãã ããã
å®ã¯ä»¥åã«ãGatsbyã§ããã°ãäœæããŠããŸããããæ°ããããŒãžã§ã³ã§ããGatsby Version3ããªãªãŒã¹ãããããšïŒããããããŠãããã¡ã«ãVersion4ãåºãŸãããð°ïŒãTypeScript察å¿ãåºæ¥ãŠããªãã£ãããšãªã©ããããäžããäœãçŽãããšã«ããŸããã
ãã®ããŒãžã§ã¯ãåœããã°ã®æ©èœããã ãããã€ã³ããæžããªãã£ãŠããŸãããGatsbyã£ãŠã©ããªããšãã§ããã®âãã䜿ã£ãŠã¿ãããã©äœãé£ãããðããªã©ãGatsbyã§ã®ããã°äœæãèããŠããæ¹ã®åèã«ãªãã°å¹žãã§ãã
Point1 ããŒã¯ããŠã³ã§ã®èšäºäœæ
èšäºã¯å šãŠããŒã¯ããŠã³ãã¡ã€ã«ã§çšæããŠããŸãã
åœåã¯ãããã¬ã¹CMSã§ããmicroCMSãContentfulãå°å ¥ãèšäºã³ã³ãã³ãã管çããŠããŸããããããŒã¯ããŠã³ã®æ¹ãæ°è»œã«èšäºãæžããã®ã§åãæ¿ããŸããã
ãªã«ãããããŒã«ã«ã§å¥œããªæã«ããã£ãšäœæ¥ã§ãããšããã®ãããã§ãããäŒç€Ÿã§ä»äºäžã«ãèšäºæžããŸããã
ãã©ã°ã€ã³ã䜿çšããŠããå å®ããèšäºã«
ããŒã¯ããŠã³çšã«ããããã®Gatsbyãã©ã°ã€ã³ãçšæãããŠããŸãã
æè¡ããã°ã§ã¯å¿
é ã®ã³ãŒããããã¯ãšã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã§ãããgatsby-remark-prismjs
ãšãããã©ã°ã€ã³ã䜿çšããç°¡åã«å®çŸã§ããŸããè¡çªå·ã®è¡šç€ºãç¹å®è¡ã®ãã€ã©ã€ãããã¡ã€ã«åã®è¡šç€ºãåœç¶å¯èœã§ãã
// 颿°ãå®çŸ©
function func(id: number): void {
console.log(id)
}
func(1)
Point2 ã³ã³ãã³ãã®ååŸã¯GraphQLã§
ãã ãããã€ã³ããšãããGatsbyãããããé ãã«ãªã£ãŠããã®ã§ãããGatsbyã§ã¯GraphQLãšããã¯ãšãªãŒèšèªã䜿çšããŠã³ã³ãã³ããååŸãããµã€ããæ§ç¯ïŒãã«ãïŒããŸãã
äŸãã°ãã®ããŒãžã®ãããã«ããµã€ãåã§ãããé³¥ã«çãŸããããšãã§ããªãã£ã人ãžããšããæåã衚瀺ãããŠããŸãããããã¯markdownãJSXãã¡ã€ã«ã«ãé³¥ã«çãŸããïœããšã¹ãæžãããŠããã®ã§ã¯ãªããgatsby-config.js
ãšãããã¡ã€ã«ã«ä»¥äžã®ãããªåœ¢ã§ãµã€ãåãèšè¿°ãããã«ãæã«GraphQLããããååŸã衚瀺ãããŠãããŠããŸãã
module.exports = {
siteMetadata: {
title: `é³¥ã«çãŸããããšãã§ããªãã£ã人ãž`,
siteUrl: `https://blog.toriwatari.work/`,
author: {
name: `Kento Yoshizu`,
},
description: `ITæè¡ããã°ãšãã®ä»è¶£å³`,
...
以äžãgatsby-config.js
ã§å®çŸ©ãããµã€ãåãååŸããgraphqlã¯ãšãªãŒã§ãããµã€ãåãsite
ã«æ ŒçŽãããŸãã
const { site } = useStaticQuery(
graphql`
query {
site {
siteMetadata {
title
}
}
}
`
)
ããã以äžã®ãããªæãã§site
ããåãåºããŸãã
<header>
<h1>
{site.siteMetadata.title}
</h1>
</header>
Gatsbyãéžãã ããããã®çç±ããã¯ãšãªãŒèšèªã«GraphQLãæ¡çšããŠããããããšããã®ããããŸããããçµæçã«ããå匷ã«ãªã£ããšæã£ãŠããŸãã
Point3 TypeScriptã§æžãã
Gatsbyã¯ReactããŒã¹ã§ãã®ã§ãTypeScriptãšã®çžæ§ããšãŠãããã§ãããã®ããã°ããŸã å®ãºãã§ã¯ãããŸããããã»ãšãã©ãTypeScriptåããŠããŸãã
Point4 ã·ãªãŒãºæ©èœãšã¿ã°æ©èœ
ããããã®èšäºã«ã·ãªãŒãºãšã¿ã°ãä»äžããå¿ èŠã«å¿ããŠåéãå©çšããŠããŸãã
ããšãã°ããã¡ãã«ã¢ã¯ã»ã¹ãããšãã·ãªãŒãºäžèЧãšåã·ãªãŒãºã®èšäºä»¶æ°ã衚瀺ãããŸãã
ããããã¡ãããåãäžã€äžã€æã§æžããŠãã®ã§ã¯ãªããGraphQLã䜿çšãã³ã³ãã³ããååŸãGatsbyãèªåã§ããŒãžãçæããŠãŸãã
ããŒã¯ããŠã³ãã¡ã€ã«ã®å é ã«ä»¥äžã®ããã«yaml颚å³ãªåœ¢åŒïŒfrontmatterãšåŒã°ããŠããŸãïŒã§ãèšäºãå±ããã·ãªãŒãºãã¿ã°ãèšè¿°ããŸãã
---
title: "Gatsbyã§ããã°ãå§ããŸãã"
postdate: "2021-07-24"
updatedate: "2021-11-19"
seriesName: "æ¥èš"
seriesSlug: "Diary"
description: "éçãµã€ããžã§ãã¬ãŒã¿ã®Gatsbyã䜿çšããŠããã°ãç«ã¡äžããŸããã"
tags: ["æ¥èš", "Gatsby"]
---
gatsby-node.ts
ã䜿çšãããã«ãæã«ãGraphQLã§ããŒã¯ããŠã³ãã¡ã€ã«ã®æ
å ±ïŒfrontmatterïŒãååŸãããããåãã·ãªãŒãºã®èšäºããšã«éçŽããããããªã¹ãåããããŒãžãäœæãããšãããããªããšããã£ãŠãããŠããŸãã
ãŸãããã¡ãã®ããŒãžã§ã¯ãåããŠã®HTML & CSSããšããã·ãªãŒãºã®èšäºäžèЧããªã¹ãã¢ããããŠããŸãã
ãããGraphQLã䜿çšãããåãã·ãªãŒãºã®èšäºäžèЧãååŸãèšäºæ°ã ãã«ãŒãã§è¡šç€ºãããããšããããšããã£ãŠããŸãã
Point5 ãååŸã®èšäºãžãæ©èœ
èšäºã®äžã®æ¹ãŸã§ãããšååŸã®èšäºãžã®ãªã³ã¯ããããŸãã
ããã¯GraphQLã§ãåãã·ãªãŒãºã®èšäºãæçš¿æ¥ä»é ã«ååŸããã®ããŒãžã®èšäºã®ååŸã®ãªã³ã¯ãäœæããããšããããšããã£ãŠããŸãã
Point6 ããŒãžããŒã·ã§ã³æ©èœ
1ããŒãžã«äœåä»¶ãäœçŸä»¶ãèšäºããªã¹ãã¢ããããããšå°ããŸããããåœããã°ã§ã¯1ããŒãžåœãã6ä»¶ã®èšäºã衚瀺ãããããšæ±ºããŠããŒãžããŒã·ã§ã³æ©èœãä»äžããŸããã
GraphQLã§ãå šãŠã®èšäºã®åæ°ãã«ãŠã³ãã6ã§å²ã£ãŠãã®æ°ã ãããŒãžãçæãããŸããåŸã¯ããŒãžã®æ°ã ããªã³ã¯ã衚瀺ãããŠãããããååŸã®ããŒãžãžç§»åããprevãnextãã¿ã³ãèšçœ®ããŸãã
äŸãã°ãïŒïœïŒããŒãžã«ãããšãã¯ã6ããŒãžç§»è¡ãçç¥ããŠæåŸã®ããŒãžã®ãªã³ã¯ã衚瀺ã
éã«åŸãã®æ¹ã®ããŒãžã«ããæã¯ãæåã®ããŒãžãšæåŸããïŒããŒãžåã®ãªã³ã¯ã衚瀺ã
ãã®ã©ã¡ãã§ããªããçãäžãããã«ããæã¯æåãšæåŸã®ããŒãžãšãçŸåšã®ããŒãžã®åšèŸºã®ãªã³ã¯ã衚瀺ããŸãã
Point7 PWA察å¿
PWAã«å¯Ÿå¿ããŠããŸãã
ã察å¿ããšãã£ãŠãGatsbyã®ãã©ã°ã€ã³ãããã€ãã€ã³ã¹ããŒã«ããconfigãã¡ã€ã«ã«PWAã®èšå®ãèšè¿°ããã ãã§ããããŸãã«ããã£ããã§ãããããã¡ãã£ãšç©è¶³ããªãæã¯ãããŸããã
Point8 ãããã€ã¯AWS Amplifyã§
åœåã¯Netlifyãšãããã¹ãã£ã³ã°ãµãŒãã¹ãå©çšããµã€ããå ¬éããŠããŸãããããã£ãããªã®ã§AWS Amplifyã«ç§»è¡ããŸããã
Point9 ããŒã¯ãŒãæ€çŽ¢ã·ã¹ãã
2022幎1æã«ããµã€ãå æ€çŽ¢ã·ã¹ãã ãå®è£ ããŸãããå³äžã®è«çŒé¡ããŒã¯ã®ã¢ã€ã³ã³ãã¯ãªãã¯ããããã¹ãããã¯ã¹ã«ä»»æã®æååãå ¥åããããšã§ããŒã¯ãŒãã«ããèšäºã®æ€çŽ¢ãè¡ããŸãã
æ©èœå®è£
ã®ããã«åããŒã¯ããŠã³ã®frontmatterã«keywords
ãšããé
ç®ã远å ããŸãããããããJSONãã¡ã€ã«ã«æžãåºãæ€çŽ¢ãè¡ããŸãã詳ããã¯ãã¡ãã®èšäºãã芧ãã ããã
Point10 ããŒã¯ã¢ãŒã
2022幎3æãããããããŒã¯ã¢ãŒãã«å¯Ÿå¿ãããŸãããå³äžã®å€ªéœïŒæã®ã¢ã€ã³ã³ãã¯ãªãã¯ãããšãlightïŒdarkãåãæ¿ãããŸãã
ãã®æ©èœã®å®è£
ã«ã¯gatsby-plugin-dark-mode
ãå©çšããŸããã以äžã®ããã«ThemeToggler
ã³ã³ããŒãã³ããã€ã³ããŒãããŠå©çšããŸããtoggleTheme
ãå®è¡ããããšã§bodyèŠçŽ ã«light
ã¯ã©ã¹ãdark
ã¯ã©ã¹ãä»äžããŸãã
import { ThemeToggler } from 'gatsby-plugin-dark-mode'
export const ToggleButton = () => (
<ThemeToggler>
{({ theme, toggleTheme }) => {
// darkã¢ãŒããã©ãããä¿æ
const isDark = theme === 'dark'
const icon = isDark ? (
<FontAwesomeIcon icon={faMoon} />
) : (
<FontAwesomeIcon icon={faSun} />
)
return (
<div
// ã¢ãŒããå転ããã
onClick={() => toggleTheme(isDark ? 'light' : 'dark')}
>
{ icon }
</div>
)
}}
</ThemeToggler>
)
CSSåŽã§ã¯CSS ã«ã¹ã¿ã ã³ã³ããŒã³ãã³ãïŒããããCSS倿°ãšãããã€ïŒãå©çšããbodyèŠçŽ ã«dark
ã¯ã©ã¹ãä»äžãããŠããæãããªãæã®ã¹ã¿ã€ã«ãåãæ¿ããŸãã
body {
--bg-color: #fff;
--text-color: #444;
background-color: var(--bg-color);
color: var(--text-color);
}
body.dark {
--bg-color: #15141a;
--text-color: #fbfbfe;
}
ãããã
ãŸã ãŸã Gatsbyã䜿ãããªããšããåã«ã¯éããŠããŸããããå人çã«ã¯ãŸããŸãæºè¶³ããä»äžããã«ãªã£ãŠããã®ã§ããã®ããã°ããããåãã®ã¯ãããããã«ãããããšæã£ãŠããŸãïŒå®ç§ãè¿œãæ±ãããšãã€ãŸã§çµã£ãŠãçµãããŸãããïŒã
ãã®ããã°ã«ã¯åãåãããã©ãŒã ããªãã®ã§ãAWS lambdaïŒAWS SES蟺ãã§å®è£ ãããããšæã£ãŠããŸããåªå 床ã¯äœãã§ããã