🐕
Nuxt3でOGPに対応しようとして苦労した話
結論
SPAからSSRに急に変えたため色々エラーが出た。
対策(?)としてApp.vueで全体を<ClienyOnly>で囲んだら、設定したメタデータが適用されなかった(当たり前)。
<ClienyOnly>は適切に使わないといけない、各ページでメタデータを設定する場合、せめてページの箇所(<NuxtPage/>)だけでも<ClienyOnly>から除外する。
Nuxt3のSSRの問題
次の記事で書く
OGPについて
全体に共通のものはnuxt.config.tsとかに書く
nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
titleTemplate: title,
title: title,
htmlAttrs: {
lang: 'ja',
},
meta: [
{charset: 'utf-8'},
{name: 'viewport', content: 'width=device-width, initial-scale=1'},
{name: 'description', content: description},
{name: 'format-detection', content: 'telephone=no'},
{name: 'content-language', content: 'ja'},
{name: 'apple-mobile-web-app-capable', content: 'yes'},
{name: 'mobile-web-app-capable', content: 'yes'},
],
link: [
{rel: 'icon', type: 'image/x-icon', href: `/favicon.ico`},
]
},
},
各ページではuseHeadを利用して設定する。動的なページ(ルーティング)に設定したい場合は、多分SSRでないと駄目。
SSRではuseAsyncDataを使用して事前データを取得する。useAsyncDataはPOSTでも使える。
書いておくべきなのは基本次のメタ情報
各ページの<script setup>
useHead({
title: title,
meta: [
{name: 'description', content: description},
{name: 'og:title', property: 'og:title', content: title},
{name: 'og:description', property: 'og:description', content: description},
// X(Twitter)
{name: 'twitter:site', content: '@oshivo_ex'},
{name: 'twitter:card', content: 'summary_large_image'},
{name: 'twitter:title', content: title},
{name: 'twitter:description', content: description},
]
})
OGP確認サイト
以下など
Discussion