Gatsby Static Generation and AVIF Image Optimization

This article explores how Gatsby leverages Static Site Generation (SSG) alongside its dedicated image processing pipeline to deliver high-performance web pages. You will learn how Gatsby transforms React components and data queries into pre-rendered HTML at build time, and how it utilizes gatsby-plugin-image and Sharp to generate responsive AVIF images with automated browser fallbacks, optimized breakpoints, and minimal Cumulative Layout Shift (CLS).

How Gatsby Handles Static Site Generation

Gatsby operates primarily as a static site generator. During the build phase, it executes a Node.js process that constructs the entire site before any user requests it.

  1. Data Sourcing and the GraphQL Layer: Gatsby gathers content from local files, headless CMSs, or APIs through source plugins. This data is ingested into an internal GraphQL schema.
  2. Page Creation: Gatsby's createPages API takes templates and feeds them specific data contexts derived from GraphQL queries.
  3. HTML Pre-rendering: Gatsby executes the React code for every page, rendering the output into flat HTML, CSS, and lightweight JavaScript bundles.
  4. Hydration: When a user visits a page, the browser immediately receives and renders the static HTML. The accompanying JavaScript bundle then loads in the background to "hydrate" the page, turning it into a dynamic Single Page Application (SPA) capable of instant client-side routing.

Because the HTML and assets are generated upfront, they can be deployed directly to a Content Delivery Network (CDN) edge, resulting in low Time to First Byte (TTFB) and high security.

The Responsive Image Processing Pipeline

To avoid serving oversized, unoptimized assets, Gatsby automates image handling at build time through a suite of plugins: gatsby-source-filesystem, gatsby-transformer-sharp, and gatsby-plugin-sharp.

gatsby-plugin-sharp interfaces with libvips via the Node.js Sharp library, a high-performance image processing engine. When images are queried through GraphQL, Sharp intercepts the files, reads their metadata, and prepares multiple resized versions corresponding to common viewport widths.

Instead of outputting a single static image, the pipeline generates:

Implementing AVIF Optimization

AVIF (AV1 Image File Format) offers significantly higher compression efficiency than JPEG, PNG, and even WebP, often reducing file sizes by up to 50% compared to standard JPEGs without perceptual loss of quality.

Gatsby handles AVIF generation natively within the gatsby-plugin-image configuration. Because AVIF encoding is computationally intensive, Gatsby processes these transformations during the static build, ensuring end-users never experience server latency from real-time conversions.

Developers configure AVIF generation in their GraphQL queries using the gatsbyImageData resolver:

query {
  file(relativePath: { eq: "hero.jpg" }) {
    childImageSharp {
      gatsbyImageData(
        layout: CONSTRAINED
        placeholder: BLURRED
        formats: [AUTO, WEBP, AVIF]
      )
    }
  }
}

When AVIF is explicitly included in the formats array:

Delivery and Browser Compatibility Fallbacks

Because not all browsers support AVIF equally, Gatsby does not serve AVIF in isolation. Instead, the <GatsbyImage> component compiles the GraphQL data into a semantic HTML5 <picture> tag.

The resulting markup sequences formats in order of modern preference:

  1. AVIF <source> tags: Targeted first with appropriate type="image/avif" attributes, alongside srcset and sizes attributes covering mobile, tablet, and desktop viewports.
  2. WebP <source> tags: Targeted next with type="image/webp" for browsers that do not support AVIF but support WebP.
  3. Fallback <img> tag: Standard JPEG or PNG formats served as the final fallback for legacy user agents.

The <GatsbyImage> component also automatically injects CSS aspect ratio styles matching the original file. This reserves exact screen space before the image finishes downloading, effectively eliminating Cumulative Layout Shift (CLS) and ensuring optimal Core Web Vitals performance.