Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
React Helmet | 16,885 | 19,603 | 3,137 | 2 months ago | 41 | June 08, 2020 | 217 | mit | JavaScript | |
A document head manager for React | ||||||||||
Reactql | 1,829 | 6 months ago | 71 | November 18, 2017 | 41 | mit | TypeScript | |||
Universal React+GraphQL starter kit: React 16, Apollo 2, MobX, Emotion, Webpack 4, GraphQL Code Generator, React Router 4, PostCSS, SSR | ||||||||||
React Helmet Async | 1,609 | 2,899 | 312 | 7 months ago | 35 | April 11, 2022 | 45 | apache-2.0 | JavaScript | |
Thread-safe Helmet for React 16+ and friends | ||||||||||
React Redux Saga Boilerplate | 578 | 9 months ago | 1 | May 06, 2022 | mit | TypeScript | ||||
Starter kit with react-router, react-helmet, redux, redux-saga and styled-components | ||||||||||
React Schemaorg | 421 | 3 | 8 | 2 months ago | 11 | July 19, 2021 | 7 | apache-2.0 | TypeScript | |
Type-checked Schema.org JSON-LD for React | ||||||||||
Universal React | 245 | 1 | 4 years ago | 12 | February 05, 2017 | 3 | JavaScript | |||
A universal react starter, with routing, meta, title, and data features | ||||||||||
React Helmet Example | 76 | 8 years ago | 7 | mit | JavaScript | |||||
A no-frills example of using react, react-router, and react-helmet together in a universal context | ||||||||||
React Jump Start | 62 | 3 years ago | 15 | TypeScript | ||||||
A redux-less boilerplate inspired by @kentcdodds, @mxstbr and @ryanflorence. | ||||||||||
Meteor React Starter | 41 | 2 years ago | JavaScript | |||||||
A starter project on Meteor with React | ||||||||||
Cf Kyt Starter Universal Redux | 38 | 5 years ago | 20 | other | JavaScript | |||||
A starter kyt with React, Redux, SSR and data fetching. |
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.
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.
title
, base
, meta
, link
, script
, noscript
, and style
tags.body
, html
and title
tags.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.
Yarn:
yarn add react-helmet
npm:
npm install --save react-helmet
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:
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>
`;
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>
);
}
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.
<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) set to false to not use requestAnimationFrame and instead update the DOM as soon as possible.
Useful if you want to update the title when the tab is out of focus
*/}
defer={false}
{/* (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>
Please take a moment to review the guidelines for contributing.
MIT