Gatsby is a static web site framework that’s based on React.
We can use it to create static websites from external data sources and more.
In this article, we’ll look at how to create a site with Gatsby.
Conditionals
We can add conditional operations with our GraphQL queries.
For example, we can with:
query GetBlogPosts($withDate: Boolean = false) {
allMarkdownRemark(limit: 3, skip: 1) {
edges {
node {
frontmatter {
title
date @include(if: $withDate)
}
}
}
}
}
We use the $withDate boolean value in our if operator.
Creating and Modifying Pages
We can use GraphQL queries to create pages in the gatsby-node.js file.
For example, we can write:
gatsby-node.js
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions
const result = await graphql(
`
{
allMarkdownRemark(limit: 1000) {
edges {
node {
frontmatter {
path
}
}
}
}
}
`
)
if (result.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
const blogPostTemplate = path.resolve(`src/templates/post.js`)
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
const path = node.frontmatter.path
createPage({
path,
component: blogPostTemplate,
context: {
pagePath: path,
},
})
})
}
gatsby-config.js
module.exports = {
plugins: [
`gatsby-transformer-remark`,
{
resolve: `gatsby-source-filesystem`,
options: {
name: `content`,
path: `${__dirname}/src/content`,
},
},
]
}
src/templates/post.js
import React from "react"
import { graphql } from "gatsby"
export default function Template({ data }) {
const { markdownRemark } = data
const { frontmatter, html } = markdownRemark
return (
<div className="blog-post">
<h1>{frontmatter.title}</h1>
<h2>{frontmatter.date}</h2>
<div
className="blog-post-content"
dangerouslySetInnerHTML={{ __html: html }}
/>
</div>
)
}
export const pageQuery = graphql`
query($path: String!) {
markdownRemark(frontmatter: { path: { eq: $path } }) {
html
frontmatter {
date(formatString: "MMMM DD, YYYY")
path
title
}
}
}
`
We get the results with the createPages function in gatsby-node.js .
Then we loop through the items with the forEach call and call createPage to create the posts.
We reference post.js , which is the template component.
And then we call createPage and set the template as the component.
context has data we want to display on our page.
We access that in the data prop of the Template component.
Removing Trailing Slashes
We can remove trailing slashes from the path when we create the page.
For instance, we can write:
const replacePath = path => (path === `/` ? path : path.replace(//$/, ``))
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage, deletePage } = actions
const result = await graphql(
`
{
allMarkdownRemark(limit: 1000) {
edges {
node {
frontmatter {
path
}
}
}
}
}
`
)
if (result.errors) {
reporter.panicOnBuild(`Error while running GraphQL query.`)
return
}
const blogPostTemplate = path.resolve(`src/templates/post.js`)
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
const path = node.frontmatter.path
const page = {
path,
component: blogPostTemplate,
context: {
pagePath: path,
},
}
const oldPage = Object.assign({}, page)
page.path = replacePath(page.path)
if (page.path !== oldPage.path) {
deletePage(oldPage)
createPage(page)
}
})
}
We check if the oldPage.path is equal to page.path .
If they aren’t equal, then we call deletePage to delete the old page and call createPage to add the new page.
Conclusion
We can make conditional queries and create pages from GraphQL queries with Gatsby.