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.
Add a 404 Page
We can create a 404 page by adding a 404.js
file in the src/pages
folder.
For example, we can write:
src/pages/404.js
import React from "react"
const NotFoundPage = () => {
return <div>not found</div>
}
export default NotFoundPage;
to add this file.
Now we should see this page when we go to any unrecognized URL in production.
SEO
SEO is an important part of many sites.
Gatsby provides support for this with React Helmet.
We have to install React Helmet by running:
npm i react-helmet
Then we can write:
gatsby-config.js
module.exports = {
siteMetadata: {
title: "My Site",
titleTemplate: "%s · The Real Hero",
description: "Some website",
url: "https://www.example.com",
image: "/assets/dog.jpg",
twitterUsername: "@occlumency",
},
}
src/pages/index.js
import React from "react"
import PropTypes from "prop-types"
import { Helmet } from "react-helmet"
import { useLocation } from "@reach/router"
import { useStaticQuery, graphql } from "gatsby"
const SEO = ({ title, description, image, article }) => {
const { pathname } = useLocation()
const { site } = useStaticQuery(query)
const {
defaultTitle,
titleTemplate,
defaultDescription,
siteUrl,
defaultImage,
twitterUsername,
} = site.siteMetadata
const seo = {
title: title || defaultTitle,
description: description || defaultDescription,
image: `${siteUrl}${image || defaultImage}`,
url: `${siteUrl}${pathname}`,
}
return (
<Helmet title={seo.title} titleTemplate={titleTemplate}>
<meta name="description" content={seo.description} />
<meta name="image" content={seo.image} />
{seo.url && <meta property="og:url" content={seo.url} />}
{(article ? true : null) && <meta property="og:type" content="article" />}
{seo.title && <meta property="og:title" content={seo.title} />}
{seo.description && (
<meta property="og:description" content={seo.description} />
)}
{seo.image && <meta property="og:image" content={seo.image} />}
<meta name="twitter:card" content="summary_large_image" />
{twitterUsername && (
<meta name="twitter:creator" content={twitterUsername} />
)}
{seo.title && <meta name="twitter:title" content={seo.title} />}
{seo.description && (
<meta name="twitter:description" content={seo.description} />
)}
{seo.image && <meta name="twitter:image" content={seo.image} />}
</Helmet>
)
}
SEO.propTypes = {
title: PropTypes.string,
description: PropTypes.string,
image: PropTypes.string,
article: PropTypes.bool,
}
SEO.defaultProps = {
title: null,
description: null,
image: null,
article: false,
}
const query = graphql`
query SEO {
site {
siteMetadata {
defaultTitle: title
titleTemplate
defaultDescription: description
siteUrl: url
defaultImage: image
twitterUsername
}
}
}
`
const IndexPage = () => {
return <>
<SEO />
<div>hello world</div>
</>
}
export default IndexPage
In gatsby-config.js
, we have the website’s metadata.
The metadata is in the siteMetadata
property.
title
has the site’s title.
titleTemplate
has the title template. %s
is the placeholder for the title.
description
has the site’s description.
url
has the site’s URL. image
has the site’s preview image.
twitterUsername
has the Twitter username for the site.
Then in index.js
, we create the SEO
component.
It uses the Helmet
component to add the title
, titleTemplate
, description
, url
, and twitterUsername
from the site.siteMetadata
property.
The data comes from the query
object that we have at the bottom of the file.
We call the useStaticQuery
hook with the query
object to make the query.
We pass all the metadata into the Helmet
component and they’ll be rendered in the head
tag.
Conclusion
We can use the React Helmet package to render our site’s metadata in the head
tag for SEO purposes.
Also, we can create a 404 page easily with Gatsby.