Update: If you're looking for code, checkout the testimonials history for my personal site here.
Today I was working on getting testimonials on my personal site, to do this I had to learn about "sourcing", "transforming" and "querying" data in GatsbyJs. It took a couple of steps, but I was eventually able to get to a point where I could manage this data as a separate file.
The first step in this process was following along in the "Sourcing Data" guide.
The TL;DR here is that we use the sourceData
Gatsby Node API to manually create some data that can be queried. We use this method along with createNode
to add a node to the data.
Sample code:
// gatsby-node.js
exports.sourceNodes = ({ actions, createNodeId, createContentDigest }) => {
const testimonials = [
{ cite: "Some Author", quote: "Some Quote" },
{ cite: "Some Author 2", quote: "Some Quote 2" },
]
testimonials.forEach(testimonial => {
const node = {
cite: testimonial.cite,
quote: testimonial.quote,
id: createNodeId(`Testimonial-${testimonial.cite}`),
internal: {
type: "Testimonial",
contentDigest: createContentDigest(testimonial),
},
}
actions.createNode(node)
})
}
// src/pages/testimonials.js
import React from "react"
import { graphql } from "gatsby"
const Testimonials = ({ data }) => {
const {
allTestimonial: { nodes: testimonials },
} = data;
return (
{testimonials.map(t => (
<blockquote
cite={t.cite}
dangerouslySetInnerHTML={{ __html: t.quote }}
></blockquote>
))}
);
}
export const query = graphql`
query {
allTestimonial {
nodes {
id
cite
quote
}
}
}
`
The second step in the process is moving this data outside to a file. To do that we need to source some files and then transform them.
A sourcing plugin "fetch[es] data from their source".
A transformer plugin essentially "take[s] data fetched using source plugins, and process it into something more usable".
For my purpose, I went with gatsby-source-filesystem
and gatsby-transformer-json
.
Sample code:
yarn add gatsby-transformer-json gatsby-source-filesystem
// gatsby-config.js
`gatsby-transformer-json`,
{
resolve: `gatsby-source-filesystem`,
options: {
name: `data`,
path: `${__dirname}/src/data`,
ignore: [`**/\.*`], // ignore files starting with a dot
},
},
// src/pages/testimonials.js
export const query = graphql`
query {
allTestimonialsJson {
edges {
node {
id
cite
quote
}
}
}
}
๐๐๐ We have a nice GraphQL implementation of fetching testimonials!
Alright! Thank you for reading my learnings from today. Did you learn something new? Anything here that I got wrong or can improve on? Let me know at @alvincrespo.
Cheers!