GatsbyJS ãš TypeScript ã§ããã°ãäœæããŠå ¬éãã(2)
~ GatsbyJs ã§ gatsby-starter-blog ã䜿ã£ããµã€ãã®äœæ ~
ä»åã¯å®éã«Gatsby CLIã䜿ã£ãŠããµã€ããçæããŠã¿ãããšæããŸãã
â»ç°å¢æ§ç¯ã«ã€ããŠã¯ãååã®æçš¿ãã芧ãã ããã
Gatsby CLI ã§æ°èŠã®ãµã€ããäœæãã
ä»åã¯gatsby-starter-blogãšããã¹ã¿ãŒã¿ãŒ(åŸè¿°)ã䜿çšããŸãã
Mac ãªãã¿ãŒããã«ããWindows ãªã Power Shell(管çè æš©é) ãéããŠã
$ gatsby new my-blog-starter https://github.com/gatsbyjs/gatsby-starter-blog
â»ãã以éã¯ãWindowsã»Mac ã«ããããããäžèšã®$ããŒã¯ã§ã³ãã³ãã®éå§ã衚çŸããŸãã
â»Windows ã§ã¯ãããã管çè æš©éã§èµ·åãè¯ãããšæããŸãã éåžžã® PowerShell ã§å®è¡ããå Žåã«ãéçºãµãŒããŒèµ·åã®ã³ãã³ãã倱æããããšããããŸããã
ã³ãã³ãã®æå³ã§ããã
gatsby new [ä»»æã®ãããžã§ã¯ãå] [Starterã®URL]
ãšãã圢åŒã«ãªã£ãŠãã
-
newã»ã»ã»æ°ãããããžã§ã¯ããäœæããã³ãã³ã -
[ä»»æã®ãããžã§ã¯ãå]ã»ã»ã»å¥œããªååãæå®ããŸãããã®ååã§æ°èŠãã©ã«ããŒãäœæãããŸãã(my-blog-starter) -
[Starterã®URL]ã»ã»ã»ã¹ã¿ãŒã¿ãŒã® URLãæå®ããªããŠãè¯ã
ã¹ã¿ãŒã¿ãŒãšã¯
å ¬åŒã§ã¯ã
Starters are boilerplate Gatsby sites maintained officially, or by the community.
ãšç޹ä»ãããŠããŸãã
å ¬åŒããã³ãã¥ããã£ãŒãéçºããããã³ãã¬ãŒãã®ãããªãã®ã§ã
ãããå©çšããããšã§ããããããå¿ èŠãªèšå®ãããœãŒã¹ã³ãŒãã®ãã³ãã¬ãŒããªã©ãå«ãŸããç¶æ ã§ããããžã§ã¯ããçæããããšãã§ããŸãã
äžããèªåã§å¿ èŠãªã©ã€ãã©ãªãäŸåé¢ä¿ã調ã¹ãŠã€ã³ã¹ããŒã«ããŠããã®ã¯éªšã®ãæããäœæ¥ã§ãã
èªåã®ç®çã«åã£ãã¹ã¿ãŒã¿ãŒãèŠã€ããŠæå®ããã°ãããããäžçºã§ãã£ãŠãããã®ã§çžåœãªæéççž®ã«ãªããŸãã
ãŸãããããã®ã©ã€ãã©ãªã䜿ã£ãŠããçšåºŠã®ã³ãŒããæžãããŠããŸãã®ã§ã
å人çã«ã¯ã©ã€ãã©ãªã®äœ¿ãæ¹ã®å匷ã«ããªããŸããã
ã¹ã¿ãŒã¿ãŒã¯ Gatsby ã®ãµã€ãã§æ¢ãããšãã§ããŸãã
2020/11/22 æç¹ã§ 456 ããããã§ãã
解説ãé·ããªããŸããããäžã§å®è¡ããã³ãã³ãã§ãmy-blog-starterãšãããã©ã«ããäœæãããŠããã¯ãã§ãã
Development Server ãç«ã¡äžããŠãããŒã«ã«ã§ããã°ã確èªãã
次ã«ãå ã»ã©äœæãããããžã§ã¯ããèµ·åããŠç¢ºèªããŠã¿ãŸãã
ãŸãããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ç§»åããŸã
$ cd my-blog-starter
ãããŠããµãŒããŒãç«ã¡äžããŸã
$ gatsby develop
ãã©ãŠã¶ãéããŠãhttp://localhost:8000ã«ã¢ã¯ã»ã¹ãããšã
ç»åã®ãããªãµã€ããç«ã¡äžãã£ãŠããã®ã確èªã§ããŸãã

åããŠã® Gatsby ãµã€ããã§ããŸããïŒ
èšäºã远å ããŠã¿ã
gatsby-blog-starter ã«ã¯ãMarkdown ããèšäºãçæããããã®ãã©ã°ã€ã³ãããã©ã«ãã§å ¥ã£ãŠããŸãã
ããã©ã«ãã§è¡šç€ºãããŠããèšäºã Markdown ããçæãããŠããŸãã
以äžã®ãã£ã¬ã¯ããªã«å ¥ã£ãŠããã®ãããã§ããã
> content
> assets
> blog
> hello-world
index.md
salty_egg.jpg
> my-second-post
index.md
> new-begginings
index.md
詊ãã«ãäžã€è¿œå ããŠã¿ãŸãã
content/blogé
äžã«test-postãšãããã¡ã€ã«ãäœã£ãŠã
ããã«index.md ãšãããã¡ã€ã«ãæ°èŠäœæããŸãã
> content
> assets
> blog
...
> test-post
index.md
index.mdã¯ä»¥äžã®ããã«ããŸã
---
title: Test Post
date: "2112-09-03"
description: "This is a test post."
---
# ããã¯ãã¹ãã§ã!
ãã¹ããã¹ã
ãã¡ã€ã«ãä¿åããŠãå
ã»ã©éããŠããhttp://localhost:8000ãã¿ããšã
èšäºã®äžèЧã«äžã€èšäºãå¢ããŠããããšã確èªã§ãããšæããŸãã

远å ãããèšäºã¯ãªã³ã¯ã«ãªã£ãŠããŸãã®ã§ãã¯ãªãã¯ããŠã¿ããšå 容ã確èªã§ããŸãã

èšäºã远å ããŠããgatsby develoopã³ãã³ããå®è¡ããªããå¿
èŠããããŸããã
Gatsby ã¯ããããªããŒãã®æ©èœãã€ããŠãããèšäºã ãã§ãªã
React.js ã§å®è£ ãããã®ä»ã®ãã¶ã€ã³ãªã©ãããã«åæ ãããŸãã
ãšãã£ãŠã調ã¹ããšæ§ã ãªçç±ã§çµå±ã³ãã³ãå©ããªããããšãå€ãã¿ããã§ããããã
ãšããã GatsbyJS ã¯ãããã£ãéçºãå¹çããè¡ãæ©èœãç°¡åã«äœ¿ããã®ããããšããã§ãã
Markdown ããèšäºãçæãããä»çµã¿
GatsbyJS ã«ãããŠãåçã«ããŒãžãçæããå Žåã«çšããããã®ãã
gatsby-node.js ãã¡ã€ã«ã§ãã
ãã¡ãã¯ãã«ãããã»ã¹ã§åŒã°ãã API ã«ãªã£ãŠããã
åçãªããŒãžçæãGraphQL ãžã®ããŒãã®è¿œå ããã«ãã©ã€ããµã€ã¯ã«äžã®ã€ãã³ãããã£ããããŠåŠçãè¡ã£ãããšãã£ãããšãå¯èœã«ãªããŸãã
æ°ããããŒãžãäœæããã«ã¯ 2 ã€ã®ã¹ãããããããŸãã
- ããŒãžã®ãã¹(slug)ãã€ãã
- ããŒãžãã®ãã®ãçæãã
ãšããå·¥çšãèžãå¿
èŠãããããããè¡ã£ãŠããã®ãgatsby-node.jsãšããããšã§ãã
ã¡ãªã¿ã«slugãšããã®ã¯ãŠã§ãã®ã¢ãã¬ã¹ã®äžéšã§ãäŸãã°ã
https://kohsuk.tech/posts/no-oneãšããã¢ãã¬ã¹ããã£ãå Žå
/posts/no-oneã®éšåã®ããšããããŸãã
ããŒãžãã®ãã®ãšãããã«å°éããããã® URL ã®çæãå¿ èŠãšããã€ã¡ãŒãžã§ãã
onCreateNodeãšcreatePage
gatsby-node.jså
ã§ãããè¡ã£ãŠããã®ããonCreateNodeãšcreatePageã§ãã
åè ããèŠãŠãããŸãã
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions;
if (node.internal.type === `MarkdownRemark`) {
const value = createFilePath({ node, getNode });
createNodeField({
name: `slug`,
node,
value,
});
}
};
Gatsby ã¯è¿œå ãããå€éšã®ããŒã¿ãnodeãšããŠæ±ããŸãã
onCreateNodeã¯ãã®nodeãäœãããéã«åŒã°ãã颿°ã§ãã
MarkdownRemarkãšããæååãèŠããŸããã
Markdown ãã¡ã€ã«ã¯ãgatsby-transformer-remarkãšãããã©ã°ã€ã³ãããŒã¹ãã
nodeã«ãã®ããŒã¿ã远å ããŠãããŠããŸãã
MarkdownRemarkã¯ãã®ãã©ã°ã€ã³ã§äœãããããŒã¿ã ãšããããšã§ãã
ãã®nodeãããã¡ã€ã«åãååŸãããããå©çšããŠslugãçæãnode ã® field ãšããŠè¿œå ã
ãšããã®ãããã§ã®åŠçã§ã(createNodeField)ã
ç¶ããŠãcreatePageã§ãã
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions;
// Define a template for blog post
const blogPost = path.resolve(`./src/templates/blog-post.js`);
// Get all markdown blog posts sorted by date
const result = await graphql(
`
{
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: ASC }
limit: 1000
) {
nodes {
id
fields {
slug
}
}
}
}
`
);
if (result.errors) {
reporter.panicOnBuild(
`There was an error loading your blog posts`,
result.errors
);
return;
}
const posts = result.data.allMarkdownRemark.nodes;
// Create blog posts pages
// But only if there's at least one markdown file found at "content/blog" (defined in gatsby-config.js)
// `context` is available in the template as a prop and as a variable in GraphQL
if (posts.length > 0) {
posts.forEach((post, index) => {
const previousPostId = index === 0 ? null : posts[index - 1].id;
const nextPostId =
index === posts.length - 1 ? null : posts[index + 1].id;
createPage({
path: post.fields.slug,
component: blogPost,
context: {
id: post.id,
previousPostId,
nextPostId,
},
});
});
}
};
ããã§ã¯äž»ã«ïŒã€ã®ããšãè¡ãããŠããŸãã
- GraphQL ã§ããŒã¯ããŠã³ã®äžèЧãååŸãã
- ååŸããäžèЧããããŒãžãçæãã
ããã§æ³šç®ãã¹ãã¯ãå
ã»ã©nodeã® field ã«è¿œå ããslugã GraphQL ã§ååŸããŠããããšã§ãã
ãã®ããã«nodeã«è¿œå ããããŒã¿ã¯ GraphQL ã§ã¢ã¯ã»ã¹ããããšãã§ããŸãã
ããŒãžå šäœã®çæ
ããŒã¯ããŠã³ãæŸã£ãŠããéšåã¯äœãšãªãããããŸãããã
ããŒã¯ããŠã³ã¯èšäºã®äžèº«ã§ãã£ãŠããã®ä»ã®ããããŒãããã¿ãŒãªã©ã¯å¥ã«å®çŸ©ããŠããã¯ãã§ãã
createPageããéã«ããã«äœ¿ãã³ã³ããŒãã³ãã®ãã¹ãæå®ãããŠããŸããã
ããããããŒãžãäœãéã®ãã³ãã¬ãŒãã«ãªã£ãŠããŸãã
createPagesã®é¢æ°å
ã§äžéšã§æå®ãããŠãã./src/templates/blog-post.jsã§ããã
ãã®blog-post.jsãã¡ã€ã«ã«ã¯ãReact ã®ã³ã³ããŒãã³ããGraphQL ãå®çŸ©ãããŠããŸãã
ãã¡ã€ã«äžéšã§å®çŸ©ããã GraphQL ã®ã¯ãšãªãããèŠãŠã¿ãŸããšã
åŒæ°ãšããŠãid, previousPostId, nextPostIdãåãåãããšãããããŸãã
export const pageQuery = graphql`
query BlogPostBySlug(
$id: String!
$previousPostId: String
$nextPostId: String
) {
...
ãæ°ã¥ããããããŸããããããã¯å
ã»ã©ã®gatsby-node.jsã® createPage ã§contextãšããŠæå®ãããŠããŸãã
createPage({
path: post.fields.slug,
component: blogPost,
context: {
id: post.id,
previousPostId,
nextPostId,
},
})
ã€ãŸããå®éã®ããŒãžå šäœã®çæã¯ã
createPageããâ ããŒãžã®ãã¹ãããŒãžã«äœ¿çšããâ¡ ã³ã³ããŒãã³ãã®ãã¹ããã®ããŒãžã§äœ¿ãâ¢GraphQL ã®åŒæ°ãæå®ããŠåŒã³åºããã
å®éã®èšäºããŒã¿ã¯ãblog-postã§åŒæ°ãšããŠæž¡ãããidãã GraphQL ã§ååŸ,
ãã®ããŒã¿ãã³ã³ããŒãã³ãã«æ³šå ¥ããŠã¬ã³ããªã³ã°ããšããããã«ãªã£ãŠãããã§ããïŒ
ä»åã¯ãããŸã§ã§ãã
ããããã粟é²ããŠè¡ããŸã!






who shares tips on Tech, Productivity, Design, and much more!