Humble Head

Populating the <head> tag might not be the most scintillating component of building a web site, but it’s an important one to get right. Gatsby’s Head API provides a flexible mechanism for doing this and supersedes the functionality from React Helmet.

Implementation is very simple: all you need to do is export a suitable Head() function. We’ll take a look at three approaches to doing this:

  • embedding Head() into each page;
  • importing a centralised definition of Head(); or
  • defining Head() in a template.

📢 The Head API was implemented in Gatsby 4.19.0, so make sure that you are using that version or higher.

🚀 TL;DR Show me the code. Look at the 23-head-api branch. This site is deployed here.

Page

The first option is to implement Head() directly in the code for the page.

export const Head = ({ data }) => {
  return (
    <>
      <html lang="fr" dir="ltr" />
      <title>WhimsyWeb</title>
    </>
  );
}

Of course, you can make this substantially more flexible by using attributes from data to populate the components of the <head> tag.

➡️ See the implementation in src/pages/home.js.

This is the simplest way to implement the Head API but it will become laborious if you have lots of pages to update.

💡 Note: By including an <html> tag in the definition of Head() you can also affect the attributes of this top-level tag.

Import

A more flexible alternative is to define Head() in a separate module and then import it into the pages.

For example, define Head() in src/components/head.js. Then from a page import and re-export like this:

import { Head } from "../components/head";

export { Head };

or, alternatively:

export { Head } from "../components/head";

➡️ You can find a slightly enhanced example of this in src/pages/404.js.

Template

Both of the above approaches require you to amend individual pages. There is a third option that allows you to quickly implement Head() for a collection of pages.

If you use a template to construct the page content (using, for example, AsciiDoc) then you simply need to update the template.

➡️ See the implementation in src/templates/article.js.

Conclusion

🚀 TL;DR Show me the code. Look at the 23-head-api branch. This site is deployed here.