Nuxt(SPAモード) + FirebaseでTwitterシェア用にOGP画像の設定をしたい。

Nuxt(SPA) + Firebaseでプロジェクトを作っていたのですが、OGP設定ができなくて悩みまくったのでメモ。

基本的にOGP設定とかをきちんとやりたい場合はSSRでアプリを作りましょう。

今回はSPAモードで作ってしまっていたのでゴリ押ししてみましたという記事です(なのであまり良い方法ではないかもしれない)。

注)Twitterシェアを想定しています。


## nuxt.config.ts(js)を編集

まずは`nuxt.config.ts`を開いて`head`部分を以下のように追記してください。

(僕は今回TypeScriptで書いていますが、修正する箇所はJacaScriptでも同じです。)

 ```ts:nuxt.config.ts
export default {
 mode: 'spa' // <- ここが'universal'の場合は普通にできると思うので今回の記事はいらない。
 ...
 head: {
    title: 'サービスのタイトル',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'サービスの説明' },
      { hid: 'twitter:card', name: 'twitter:card', content: 'summary_large_image' }, // 画像のタイプ。詳しくは後術。
      { hid: 'twitter:site', name: 'twitter:site', content: '@uzr4b' },
      { hid: 'twitter:image', name: 'twitter:image', content: '画像パス(絶対パス)'}, // 苦労しました。詳しくは後術。
      { hid: 'og:type', property: 'og:type', content: 'サービスのタイプ(blogとかwebsiteとか)' },
      {
        hid: 'og:title',
        property: 'og:title',
        content: 'サービスのタイトル'
      },
      {
        hid: 'og:url',
        property: 'og:url',
        content: 'サービスのURL' // デプロイ済みであることが前提です。
      },
      {
        hid: 'og:description',
        property: 'og:description',
        content: 'サービスの説明'
      },
      {
        hid: 'og:image',
        property: 'og:image',
        content: '画像(絶対パス)'
      },
      { hid: 'og:site_name', name: 'og:site_name', content: 'サイト名' }
    ],
    ...
  }, 
}
```

### `twitter:card`について
上記の `twitter:card`の部分は画像の大きさや文字との比率を好みで設定します。
> カードタイプは、“summary”、“summary_large_image”、“app”、“player”のいずれかになります。[ツイートをカードで最適化する](https://developer.twitter.com/ja/docs/tweets/optimize-with-cards/guides/getting-started)

[こちらの記事](【2020年版】Twitterカードとは？使い方と設定方法まとめ)が非常にわかりやすかったです。

### `twitter:image`について
`twitter:image`はシェアされた時に出てくる画像を指します。

画像に関しても[こちらの記事](【2020年版】Twitterカードとは？使い方と設定方法まとめ)が非常にわかりやすかったです。


またここで指定する画像は以下のような規則があるようです。
> Twitterカードを設定している WebページのURLのドメイン名と、画像のURLのドメイン名が異なる場合は、Twitterカードに画像を表示しない仕様のようです。

自分はFirebaseのCloud Firetoreを使用していたので、Cloud Firestoreに画像を保存しておきました。こうすることでドメイン名が合うようになりました。

(こんな感じ↓)
<img width="1294" alt="スクリーンショット 2020-07-30 19.34.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416999/f8ec7fb8-b688-dc2a-f324-eed23a7c27ac.png">

ここで保管した画像のurlを先ほどの`content: '画像パス(絶対パス)'`のところに貼り付けます。

これで基本的な設定は完了です。

## package.jsonの設定
次に静的なサイトの設定をします。
注) JavaScriptを使用している方は`-ts`はいらないです。

```js:package.json
...
"scripts": {
    "dev": "nuxt-ts",
    "build": "nuxt-ts build",
    "start": "nuxt-ts start",
    "export": "nuxt-ts export",
    "serve": "nuxt-ts serve",
    "generate": "nuxt-ts generate" // 追記
  },
...
```

以下のコマンドを実行して静的なサイト設定をします。

```
$ npm run generate
```
このコマンドを実行すると`200.html`と`index.html`が生成されて先ほどのOPG設定が反映されているかと思います。


ここまできたらCard validator で確認してみましょう。

## Card validator で設定の確認
[Card validator | Twitter Developers](https://cards-dev.twitter.com/validator)にアクセスし自分のサイトのurlを入力して確認してみましょう。

うまくいけば以下の画像のようになります。

<img width="1003" alt="スクリーンショット 2020-07-30 19.47.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416999/b633b7af-c511-c231-8912-56f4c880f509.png">
Card previewがきちんと表示され、Logにエラーも出ていません。

もし、Logは成功しているけど画像が表示されないとなったら画像のパスがきちんと設定できていない可能性があるので上記(`twitter:image`について)の項を参考にしてみてください。

また`generate`コマンドを打たないとページのソースにOGPの設定が出てきません。
[こちらの記事](https://saruwakakun.com/html-css/reference/twitter-card#section5)の【5. Twitterカードが表示されないときの対処法】をみてみてください。



これでサイトのURLをツイートするとOGP画像が出るようになりました！！

## この時作ったもの
昔作っていたNuxtのプロジェクトをTypeScriptの練習で書き換えたものです。
よろしければみてやってください🙇‍♂️
[Course Map](https://tutorials-list.web.app/)
<img width="592" alt="スクリーンショット 2020-07-30 20.00.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416999/32f1a991-eaf5-b2ce-08c2-9d4fb76ecef9.png">