react-helmet vs react-helmet-async vs react-document-title
React Document Head Management Libraries Comparison
1 Year
react-helmetreact-helmet-asyncreact-document-titleSimilar Packages:
What's React Document Head Management Libraries?

These libraries are designed to manage the document head in React applications, allowing developers to dynamically set the title, meta tags, and other head elements based on the current state of the application. This is crucial for SEO, social sharing, and improving the overall user experience by providing relevant information in the browser tab and search engine results. They help ensure that each page of a single-page application (SPA) has the appropriate metadata, which is essential for both user engagement and search engine optimization.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-helmet1,990,92317,448-2225 years agoMIT
react-helmet-async1,898,8312,18886.3 kB7310 months agoApache-2.0
react-document-title56,2451,864-218 years agoMIT
Feature Comparison: react-helmet vs react-helmet-async vs react-document-title

Head Management

  • react-helmet:

    react-helmet offers a more extensive API for managing not just the title but also meta tags, link tags, and script tags. This allows developers to customize the document head comprehensively, making it suitable for complex applications that require detailed SEO management.

  • react-helmet-async:

    react-helmet-async builds on the capabilities of react-helmet by adding support for asynchronous updates. This is particularly useful in scenarios where head management needs to be performed during server-side rendering, ensuring that the correct head elements are sent to the client.

  • react-document-title:

    react-document-title provides a simple API to manage the document title. It allows you to set the title of the document based on the current component's state, making it easy to ensure that the title reflects the content being displayed.

Server-Side Rendering Support

  • react-helmet:

    react-helmet can be used with server-side rendering, but it does not handle asynchronous updates effectively, which can lead to issues in SSR scenarios.

  • react-helmet-async:

    react-helmet-async is specifically designed for server-side rendering and handles asynchronous updates seamlessly, making it the best choice for applications that require SSR and optimal SEO.

  • react-document-title:

    react-document-title does not support server-side rendering, making it less suitable for applications that require SEO optimization through SSR.

Performance

  • react-helmet:

    react-helmet can introduce some performance overhead due to its comprehensive feature set, but it is generally efficient for most applications. Care should be taken to manage updates properly to avoid unnecessary re-renders.

  • react-helmet-async:

    react-helmet-async is optimized for performance in SSR scenarios, allowing for efficient head management without blocking rendering, which can enhance the overall performance of the application.

  • react-document-title:

    react-document-title is lightweight and has minimal performance overhead, making it ideal for applications that only need to manage the document title without additional features.

Ease of Use

  • react-helmet:

    react-helmet has a steeper learning curve due to its extensive features, but it provides powerful capabilities for those who need detailed control over the document head.

  • react-helmet-async:

    react-helmet-async retains the ease of use of react-helmet while adding asynchronous capabilities, making it accessible for developers familiar with react-helmet.

  • react-document-title:

    react-document-title is straightforward and easy to use, making it an excellent choice for developers who need a quick solution for managing document titles without complexity.

Community and Support

  • react-helmet:

    react-helmet has a larger community and extensive documentation, providing ample resources for troubleshooting and implementation.

  • react-helmet-async:

    react-helmet-async, while newer, is gaining traction and benefits from the existing react-helmet community, providing a growing base of support and resources.

  • react-document-title:

    react-document-title has a smaller community and fewer resources compared to the other libraries, which may limit support options.

How to Choose: react-helmet vs react-helmet-async vs react-document-title
  • react-helmet:

    Choose react-helmet if you require a more comprehensive solution for managing the document head, including meta tags, links, and scripts. It offers a rich API and is suitable for applications that need detailed control over the head elements, especially for SEO and social media sharing.

  • react-helmet-async:

    Choose react-helmet-async if you need server-side rendering (SSR) support and want to manage head elements asynchronously. This package is particularly beneficial for applications that require improved performance and SEO capabilities when rendering on the server, as it allows for better handling of head updates during asynchronous operations.

  • react-document-title:

    Choose react-document-title if you need a simple solution for managing the document title in a straightforward manner without additional overhead. It is lightweight and focuses solely on the document title, making it ideal for smaller projects or when you don't need extensive head management features.

README for react-helmet

React Helmet

npm Version codecov.io Build Status Dependency Status PRs Welcome

This reusable React component will manage all of your changes to the document head.

Helmet takes plain HTML tags and outputs plain HTML tags. It's dead simple, and React beginner friendly.

6.0.0 Breaking Changes

Example

import React from "react";
import {Helmet} from "react-helmet";

class Application extends React.Component {
  render () {
    return (
        <div className="application">
            <Helmet>
                <meta charSet="utf-8" />
                <title>My Title</title>
                <link rel="canonical" href="http://mysite.com/example" />
            </Helmet>
            ...
        </div>
    );
  }
};

Nested or latter components will override duplicate changes:

<Parent>
    <Helmet>
        <title>My Title</title>
        <meta name="description" content="Helmet application" />
    </Helmet>

    <Child>
        <Helmet>
            <title>Nested Title</title>
            <meta name="description" content="Nested component" />
        </Helmet>
    </Child>
</Parent>

outputs:

<head>
    <title>Nested Title</title>
    <meta name="description" content="Nested component">
</head>

See below for a full reference guide.

Features

  • Supports all valid head tags: title, base, meta, link, script, noscript, and style tags.
  • Supports attributes for body, html and title tags.
  • Supports server-side rendering.
  • Nested components override duplicate head changes.
  • Duplicate head changes are preserved when specified in the same component (support for tags like "apple-touch-icon").
  • Callback for tracking DOM changes.

Compatibility

Helmet 5 is fully backward-compatible with previous Helmet releases, so you can upgrade at any time without fear of breaking changes. We encourage you to update your code to our more semantic API, but please feel free to do so at your own pace.

Installation

Yarn:

yarn add react-helmet

npm:

npm install --save react-helmet

Server Usage

To use on the server, call Helmet.renderStatic() after ReactDOMServer.renderToString or ReactDOMServer.renderToStaticMarkup to get the head data for use in your prerender.

Because this component keeps track of mounted instances, you have to make sure to call renderStatic on server, or you'll get a memory leak.

ReactDOMServer.renderToString(<Handler />);
const helmet = Helmet.renderStatic();

This helmet instance contains the following properties:

  • base
  • bodyAttributes
  • htmlAttributes
  • link
  • meta
  • noscript
  • script
  • style
  • title

Each property contains toComponent() and toString() methods. Use whichever is appropriate for your environment. For attributes, use the JSX spread operator on the object returned by toComponent(). E.g:

As string output

const html = `
    <!doctype html>
    <html ${helmet.htmlAttributes.toString()}>
        <head>
            ${helmet.title.toString()}
            ${helmet.meta.toString()}
            ${helmet.link.toString()}
        </head>
        <body ${helmet.bodyAttributes.toString()}>
            <div id="content">
                // React stuff here
            </div>
        </body>
    </html>
`;

As React components

function HTML () {
    const htmlAttrs = helmet.htmlAttributes.toComponent();
    const bodyAttrs = helmet.bodyAttributes.toComponent();

    return (
        <html {...htmlAttrs}>
            <head>
                {helmet.title.toComponent()}
                {helmet.meta.toComponent()}
                {helmet.link.toComponent()}
            </head>
            <body {...bodyAttrs}>
                <div id="content">
                    // React stuff here
                </div>
            </body>
        </html>
    );
}

Note: Use the same instance

If you are using a prebuilt compilation of your app with webpack in the server be sure to include this in the webpack file so that the same instance of react-helmet is used.

externals: ["react-helmet"],

Or to import the react-helmet instance from the app on the server.

Reference Guide

<Helmet
    {/* (optional) set to false to disable string encoding (server-only) */}
    encodeSpecialCharacters={true}

    {/*
        (optional) Useful when you want titles to inherit from a template:

        <Helmet
            titleTemplate="%s | MyAwesomeWebsite.com"
        >
            <title>Nested Title</title>
        </Helmet>

        outputs:

        <head>
            <title>Nested Title | MyAwesomeWebsite.com</title>
        </head>
    */}
    titleTemplate="MySite.com - %s"

    {/*
        (optional) used as a fallback when a template exists but a title is not defined

        <Helmet
            defaultTitle="My Site"
            titleTemplate="My Site - %s"
        />

        outputs:

        <head>
            <title>My Site</title>
        </head>
    */}
    defaultTitle="My Default Title"

    {/* (optional) callback that tracks DOM changes */}
    onChangeClientState={(newState, addedTags, removedTags) => console.log(newState, addedTags, removedTags)}
>
    {/* html attributes */}
    <html lang="en" amp />

    {/* body attributes */}
    <body className="root" />

    {/* title attributes and value */}
    <title itemProp="name" lang="en">My Plain Title or {`dynamic`} title</title>

    {/* base element */}
    <base target="_blank" href="http://mysite.com/" />

    {/* multiple meta elements */}
    <meta name="description" content="Helmet application" />
    <meta property="og:type" content="article" />

    {/* multiple link elements */}
    <link rel="canonical" href="http://mysite.com/example" />
    <link rel="apple-touch-icon" href="http://mysite.com/img/apple-touch-icon-57x57.png" />
    <link rel="apple-touch-icon" sizes="72x72" href="http://mysite.com/img/apple-touch-icon-72x72.png" />
    {locales.map((locale) => {
        <link rel="alternate" href="http://example.com/{locale}" hrefLang={locale} key={locale}/>
    })}

    {/* multiple script elements */}
    <script src="http://include.com/pathtojs.js" type="text/javascript" />

    {/* inline script elements */}
    <script type="application/ld+json">{`
        {
            "@context": "http://schema.org"
        }
    `}</script>

    {/* noscript elements */}
    <noscript>{`
        <link rel="stylesheet" type="text/css" href="foo.css" />
    `}</noscript>

    {/* inline style elements */}
    <style type="text/css">{`
        body {
            background-color: blue;
        }

        p {
            font-size: 12px;
        }
    `}</style>
</Helmet>

Contributing to this project

Please take a moment to review the guidelines for contributing.

License

MIT