Open6
react-helmet導入
モチベーション:body以外のhtmlを共通化するため
$ yarn add react-helmet
# TypeScriptの型定義も導入
$ yarn add @types/react-helmet
react-helmetの仕組みはheadタグに格納する属性を Helmet
コンポーネント内に記述することでそれをDOMに生成/上書きしてくれるというもの
様々な兼ね合いからhtmlファイルを後述の最小構成にできないために、上書きができるようになっていると思われる(そのような考慮の不要なサーバーサイドレンダリングではゼロからhtmlを生成するようだ)
# 静的htmlファイル
<html>
<head>
<title>Static Title</title>
</head>
<body>
<div id="root"></div>
<script src="index.js"></script>
</body>
</html>
// index.js へコンパイルされる
import React from "react"
import ReactDOM from "react-dom"
import { Helmet } from "react-helmet"
const App = () => {
return (
<div>
<Helmet>
<title>Runtime Title</title>
</Helmet>
<div id="hoge"></div>
</div>
)
}
ReactDOM.render(<App />, document.getElementById("root"))
# 生成されたDOM
<html>
<head>
<title>Runtime Title</title> # コードで指定した値に上書きされている
</head>
<body>
<div id="root">
<div id="hoge"></div> # コードで記述した <Helmet> 以外の部分
</div>
<script src="index.js"></script>
</body>
</html>
用意しておく静的htmlファイルはReactを扱ううえでの最小構成である以下の記述のみでも動作した
<div id="root"></div>
<script src="index.js"></script>
headタグのattributesはサポートされないらしい🤔
Supports all valid head tags: title, base, meta, link, script, noscript, and style tags.
Supports attributes for body, html and title tags.
https://github.com/nfl/react-helmet#features
react-helmetでOGPを設定することはできるが、実際にホスティングしたときに読み込まれる(= Reactのレンダリングがされる)のかどうか
→ ビルド時にhtmlファイルごと生成して静的に持つようにすれば良いのでは