Reactヘルメットでタイトルとメタデータを変更する方法
序章
React Helmet は、ドキュメントのhead
セクションを動的に管理するためのコンポーネントです。 一般的な使用例には、ドキュメントのtitle
、description
、およびmeta
タグの設定が含まれます。
サーバーサイドレンダリングと組み合わせると、検索エンジンやソーシャルメディアクローラーによって読み取られるmeta
タグを設定できます。 これにより、サーバーサイドレンダリングとReact Helmetは、SEO(検索エンジン最適化)とoEmbed、Facebook Open Graph、Twitterカードなどのソーシャルメディアデータの恩恵を受けることができるアプリを作成するための強力な組み合わせになります。
この記事では、ReactアプリケーションでのReactヘルメットの機能について説明します。
前提条件
この記事をフォローするには、次のものが必要です。
npm
やyarn
などのパッケージマネージャーを使用したパッケージのインストールに精通していること。- Reactプロジェクトでのコンポーネントのインポートと使用に精通していること。
注:このチュートリアルでは、Reactプロジェクトを作成する手順やサーバー側のレンダリングを設定する手順については説明しません。 Reactアプリのサーバー側レンダリングを有効にする方法を参照してください。
このチュートリアルは、ノードv15.3.0、npm
v6.14.9、react
v17.0.1、およびreact-helmet
v6.1.0で検証されました。
ステップ1—プロジェクトにReactヘルメットを追加する
まず、コンポーネントをプロジェクトにインストールします。
- npm install react-helmet@6.1.0
これで、ドキュメントの先頭に子として配置する必要のある要素をHelmet
コンポーネントに追加することで、アプリでReactHelmetを使用できます。
import { Helmet } from 'react-helmet';
function App() {
return (
<div className="App">
<Helmet>
<title>App Title</title>
<meta name="description" content="App Description" />
<meta name="theme-color" content="#008f68" />
</Helmet>
</div>
);
}
export default App;
次に、ブラウザの開発者ツールを開き、head
要素を調べます。
Inspect Element<head>
<!-- ... --->
<title>App Title</title>
<!-- ... -->
<meta name="description" content="App Description" data-react-helmet="true">
<meta name="theme-color" content="#008f68" data-react-helmet="true">
<!-- ... --->
</head>
ReactHelmetによって追加されたtitle
およびmeta
要素を観察します。
ステップ2—値を上書きする
ツリーのさらに下のコンポーネントは、上位レベルのHelmet
コンポーネントに提供される値をオーバーライドできます。
たとえば、title
を変更するHelmet
コンポーネントを含むChildComponent
について考えてみます。
import React from 'react';
import { Helmet } from 'react-helmet';
export default function ChildComponent() {
return (
<div>
<Helmet>
<title>Modified Title</title>
</Helmet>
<h1>Child Component</h1>
</div>
)
}
次に、App
コンポーネントに再度アクセスし、新しいChildComponent
を含めます。
import { Helmet } from 'react-helmet';
import ChildComponent from './ChildComponent';
function App() {
return (
<div className="App">
<Helmet>
<title>App Title</title>
<meta name="description" content="App Description" />
<meta name="theme-color" content="#008f68" />
</Helmet>
<ChildComponent />
</div>
);
}
次に、ブラウザの開発者ツールを開き、head
要素を調べます。
Inspect Element<head>
<!-- ... --->
<title>Modified Title</title>
<!-- ... -->
<meta name="description" content="App Description" data-react-helmet="true">
<meta name="theme-color" content="#008f68" data-react-helmet="true">
<!-- ... --->
</head>
title
はApp Title
からModified Title
に変更されます。 description
およびtheme-color
値のmeta
タグは、上書きされていないため、同じままです。
ステップ3—html
およびbody
の属性の処理
属性を指定する必要がある場合は、html
およびbody
要素を含めることもできます。
たとえば、dark
テーマが適用されているbody
要素について考えてみます。
import { Helmet } from 'react-helmet';
function App() {
return (
<div className="App">
<Helmet>
<title>App Title</title>
<meta name="description" content="App Description" />
<meta name="theme-color" content="#008f68" />
<body class="dark" />
</Helmet>
</div>
);
}
次に、ブラウザの開発者ツールを開き、body
要素を調べます。
[seconday_label Inspect Element]
<body class="dark" data-react-helmet="class">
<!-- ... -->
</body>
class
はdark
に設定されます。
ステップ4—サーバーでのレンダリング
React Helmetの完全な利点は、アプリがサーバー上でレンダリングされるときに明らかになり、アプリがドキュメントの先頭にある正しい要素で提供されるようになります。
Reactサーバー側でレンダリングされたアプリのセットアップが整っていると仮定すると、ReactDOMServerのrenderToString
またはrenderToStaticMarkup
を呼び出した直後に、ReactHelmetのrenderStatic
メソッドを呼び出して、プロパティを持つインスタンスを取得できます。 Helmet
データの場合:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import express from 'express';
import { Helmet } from 'react-helmet';
import App from '../src/App';
const PORT = process.env.PORT || 3006;
const app = express();
app.get('/*', (req, res) => {
const appString = ReactDOMServer.renderToString(<App />);
const helmet = Helmet.renderStatic();
const html = `<!DOCTYPE html>
<html lang="en">
<head>
${helmet.title.toString()}
${helmet.meta.toString()}
</head>
<body>
<div id="root">
${ appString }
</div>
</body>
</html>
`
res.send(html);
});
app.listen(PORT);
ヘルメットのrenderStatic
を呼び出すと、title
やmeta
などのプロパティを持つインスタンスが返されます。 link
、script
、noscript
、style
、htmlAttributes
、bodyAttributes
などの他のプロパティにもアクセスできます。 ]。
ステップ5—react-helmet-async
と非同期でレンダリングする
ここでSpectrumから