React Safety Helmet
A fork of react-helmet that support for renderToNodeStream and thread safe with the power of redux
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.
This is a fork of react-helmet.
Example
;; Component { 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:
;; { const helmetStore = ; ReactDOM;}
outputs:
Nested Title
See below for a full reference guide.
Features
- Supports all valid head tags:
title
,base
,meta
,link
,script
,noscript
, andstyle
tags. - Supports attributes for
body
,html
andtitle
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.
Installation
Yarn:
yarn add react-safety-helmet
npm:
npm install --save react-safety-helmet
Server Usage
To use on the server, call store.renderStatic()
after ReactDOMServer.renderToString
or ReactDOMServer.renderToStaticMarkup
to get the head data for use in your prerender.
; const helmetStore = ;ReactDOMServer;const helmet = helmetStore;
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 > <head> </head> <body > <div id="content"> // React stuff here </div> </body> </html>`;
As React components
{ const htmlAttrs = helmethtmlAttributes; const bodyAttrs = helmetbodyAttributes; return <html ...htmlAttrs> <head> helmettitle helmetmeta helmetlink </head> <body ...bodyAttrs> <div id="content"> // React stuff here </div> </body> </html> ;}
ReactDOMServer.renderToNodeStream()
and ReactDOMServer.renderToStaticNodeStream()
Server Usage with {const helmetStore = ;let body = '';ReactDOMServer;};
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>My 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= console> /* 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 /* 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>
Helmet.rewind()
, Helmet.renderStatic()
and peek()
?
Where is Use helmetStore.renderStatic() instead of Helmet.rewind() and Helmet.renderStatic()
const helmetStore = ;ReactDOMServer;const head = helmetStore;
Use helmetStore.peek() instead of Helmet.peek()
const helmetStore = ;ReactDOM;helmetStoretitle; // "Fancy title"
Contributing to this project
Please take a moment to review the guidelines for contributing.
License
MIT