Published by @SoNiceInfo at 4/5/2020
このサイトはNext.jsで作られているのですが、Uncaught (in promise) TypeError: Cannot read property 'tagName' of null
というエラーに悩まされていました。
原因はhead
タグにかかれているscriptがbody
タグ描画前に発火していることでした。
思い当たるのはHeader.jsx
でhead
タグの内容を動的に書き換えていることです。
head
タグを動的に書き換える方法head
タグを動的に書き換えるにはページ内容からtitleやdescriptionを受け取るcomponentを用意します。 propsを使ってページ内容からhead
タグを含むcomponentへ必要な内容を渡してあげます。
components
└── Header.jsx
pages/
└── index.jsx
components/Header.jsx
import Head from 'next/head'
const Header = ({ title, description, relpath, relimage }) => (
<Head>
<title>{title} - d1v1b</title>
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:type" content="article" />
<meta property="og:url" content={`https://d1v1b.com` + relpath} />
<meta property="og:image" content={`https://d1v1b.com` + relimage} />
<meta property="og:site_name" content={title} />
<meta name="twitter:card" content="summary" />
<meta name="twitter:url" content={`https://d1v1b.com` + relimage} />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={`https://d1v1b.com` + relimage} />
<meta name="description" content={description} />
<meta name="theme-color" content="#1e87f0" />
<link rel="canonical" href={`https://d1v1b.com` + relpath} />
<link rel="icon" href="/favicon.ico" />
<link rel="stylesheet" href="/uikit.min.css" />
<link rel="manifest" href="/manifest.json" />
<link rel="apple-touch-icon" href="/images/icons/192.png" />
</Head>
)
export default Header
pages/index.jsx
import Header from '../components/Header'
const Index = () => (
<>
<Header title="Index"
description="This is description"
relimage="/images/index.png"
relpath="/"
/>
<h1>Index</h1>
<p>
Welocome to Index.
</p>
</>
)
export default Index
自分はcssファイルを作るのが面倒でcomponents/Header.jsx
の<Head>
内で<style jsx></style>
を定義していました。
これが原因でhead
タグ内でscriptが発火してエラーが出ていたようです。<style jsx></style>
を削除したらエラーも消えました。