Gatsby in combination with GraphCMS is really cool, but the build time can be quite long. I've searched for some improvements, which I would like to share with you in this post.
1. Use Conditional Page Builds
Whenever you run gatsby build
, all pages are recreated. You can improve the build time by rebuilding only changed pages.
If you're using GitHub Actions, you can check out my previous post:
Use the environment variable GATSBY_EXPERIMENTAL_PAGE_BUILD_ON_DATA_CHANGES
in your gatsby build
command to enable conditional page builds and persist the .cache
and public
directories between builds.
GATSBY_EXPERIMENTAL_PAGE_BUILD_ON_DATA_CHANGES=true gatsby develop
2. Parallel processing of GraphQL queries
The default number of parallel GraphQL queries executed by Gatsby is 4. With the environment variable GATSBY_EXPERIMENTAL_QUERY_CONCURRENCY
you can increase the number.
GATSBY_EXPERIMENTAL_QUERY_CONCURRENCY=20 gatsby develop
3. Use Query Batching
By default, gatsby-source-graphql
executes each query in a separate network request. The plugin offers a configuration option to batch the requests.
If you set GATSBY_EXPERIMENTAL_QUERY_CONCURRENCY
to 20
and maxBatchSize
to 5
, it means that you are running 4 batches in parallel.
{
resolve: 'gatsby-source-graphql',
options: {
typeName: 'GRAPHCMS',
fieldName: 'graphCmsData',
url: 'https://api-eu-central-1.graphcms.com/v2/xxxxxx/master',
batch: true,
dataLoaderOptions: {
maxBatchSize: 5
}
}
}
4. Asynchronize your createPage
function
If you use the createPage
function to create dynamic pages with GraphCMS, be sure to run this function asynchronously.
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const result = await graphql(...)
const pages = result.data.graphCmsData.pages.map(async (page) => {
createPage({
path: page.slug,
component: path.resolve('./src/templates/Page.js'),
context: {
id: page.id
}
})
})
await Promise.all([pages])
}
If you have any kind of feedback, suggestions or ideas - feel free to comment this post!
Top comments (0)