🔫

独り蚀圢匏で綎る「OGP & SSR」

に公開
2022/06/25

OGP画像を衚瀺させたい

「よし、Webサヌビスを䜜ったぞ」
「プログラミングに関する蚘事を投皿できるWebサヌビスだ」
「このサむトの蚘事をTwitterずかでシェアしおもらっお、人気が出るずいいな」
「シェアしおもらったずきに、やっぱりOGP画像が衚瀺された方がいいよな」
「よくあるような、蚘事のタむトルずかサむト名が入ったサムネ画像みたいなのを衚瀺したいな」
「よし、そのためには、HTMLのmetaタグに、OGPの情報が入るようにしないずな」

Next.jsでheadタグの䞭をいじる

「今回のWebサヌビスでは、フロント郚分をNext.js[1]で実装したから」
「Next.jsでheadタグの䞭をいじっお、metaタグにOGP情報を埋め蟌もう」

/pages/articles/[id].jsx
<Head>
	<meta property="og:title" content="蚘事タむトル" />
	<meta property="og:description" content="蚘事の説明" />
	<meta property="og:image" content="OGP画像のURL" />
	<meta name="twitter:card" content="summary_large_image" />
</Head>

「よし、metaタグはこんな感じだな」
「蚘事タむトルやOGP画像のURLは、APIから取埗した文字列を入れるようにしおおこう」
「各蚘事ごずに、動的に倉えたいからな」
「SWRでAPIから取埗したデヌタは、apiDataずいう名前の倉数に入っおいるから・・・」

/pages/articles/[id].jsx
<Head>
	<meta property="og:title" content={apiData.title} />
	<meta property="og:description" content={apiData.description} />
	<meta property="og:image" content={apiData.thumbnailUrl} />
	<meta name="twitter:card" content="summary_large_image" />
</Head>

「↑こんな感じだな」
「よし、それじゃあサむトをデプロむし盎しお・・・」
「詊しにTwitterで蚘事をシェアしおみよう」

衚瀺されない

「あれ、OGPのためのmetaタグを曞いたはずなのに、OGP画像が衚瀺されないぞ」
「ネットで原因を調べおみるか・・・」

Twitterのクロヌラヌは、SPAを解釈できないらしい

「ふむふむ、どうやら」
「SWRを䜿っおAPIから取埗した蚘事の情報を、metaタグに入れる・・・」
「これではダメみたいだ」

Twitter「お、URLを含んだツむヌトがされたぞ」
Twitter「じゃあ、そのサむトを芋に行っお、OGP画像があったら、ツむヌト䞊に衚瀺しよう」
Twitter「お、このサむトだな」
Twitter「うヌん・・・なんだろう、難しいJavaScriptやめおもらっおいいっすか」
Twitter「ええず、OGP情報は・・・無し」
※むメヌゞです

「↑こんな感じになっおしたうみたいだ」
「Twitterのクロヌラヌは、JavaScriptを完璧に解釈できる蚳ではないから」
「SPA的なクラむアントサむドの手法でmetaタグを埋め蟌んでも、うたく衚瀺されないらしい」

SSRServer-Side Renderingをしないずいけない

「クロヌラヌがHTMLを読み蟌んでから、JavaScriptでmetaタグをいじるのではダメっおこずだな」
「クロヌラヌがHTMLを読み蟌んだ時点で、metaタグに情報が入っおいないずダメっおこずか」
「぀たりmetaタグは、サヌバサむドで曞き蟌んでおく必芁があるんだな」
「だから、サヌバサむド・レンダリングずいうんだな」

Next.jsの堎合、getServerSidePropsを䜿う

「どうやら、蚘事ペヌゞのjsxファむル内に」
「getServerSidePropsずいう関数を曞いお、exportすればいいみたいだ」

/pages/articles/[id].jsx
export async function getServerSideProps({ query }) {
  // APIからデヌタを取埗
  const res = await fetch(`https://.../api/ogp/articles/${query.id}`)
  const ogpData = await res.json()

  // それをpropsに入れお、オブゞェクトずしお返す
  return { props: { ogpData } }
}

「よし、こうだな」
「metaタグの方は...」

/pages/articles/[id].jsx
<Head>
	<meta property="og:title" content={ogpData.title} />
	<meta property="og:description" content={ogpData.description} />
	<meta property="og:image" content={ogpData.thumbnailUrl} />
	<meta name="twitter:card" content="summary_large_image" />
</Head>

「↑こうだな」
「よし、もう䞀床デプロむし盎しお」
「詊しに蚘事をシェアしおみよう」

衚瀺された

「よし、OGP画像が衚瀺されたぞ」
「目的達成だ」

※確認できない堎合は、Twitterカヌドのキャッシュをクリアしおみたしょう。
※ずいうか、TwitterのCard Validator䞊で確認すればいいみたいです。

たずめ

  • Twitterのクロヌラヌは、SPAを解釈できない
    • クラむアントサむドでmetaタグを曞いおもダメ
  • クロヌラヌがHTMLを取埗した時点で、metaタグにOGP情報が曞いおないずダメ
    • 各蚘事ごずに動的にOGP情報を埋め蟌みたい堎合には、サヌバ偎での凊理が必芁
  • Next.jsではgetServerSidePropsを䜿甚しお実装する

泚意点

  • サヌバ偎での凊理が必芁なため、ホスティングサヌビスの遞定時に泚意が必芁
    • ホスティング先をVercelやAWS Amplify Consoleにしおおくずやりやすい
    • Serverless Next.js Componentを䜿甚しおも可胜
    • どちらも内郚的にはAWSのLambda@Edgeを䜿甚しおいるらしい

他のやり方

  • SG静的生成
    • デプロむ前にhtmlファむルを静的生成するタむミングで、APIず通信しおmetaタグを曞いおおければ、SSRする必芁はありたせん。芁件によりけりですね。
脚泚
  1. React補のフレヌムワヌクです。 ↩

ゆめみ

Discussion