mintsu's blog

Nuxt.jsでTwitterシェアボタンやツイートの埋め込みなどのwidgetsを追加する方法

2020-05-23 11:00:00
フロントエンド

Nuxt.jsでTwitterシェアボタンやツーとのwigetsを追加する方法

Nuxt.jsなどでSPAでTwitterのシェアボタンやツイート表示のウィジェットを利用する際、ページ遷移時にうまく表示されない場合があります。

twitterのwidgets.jsの読み込みのタイミング本来は表示用のタグが挿入されますが、SPAではページ遷移時にwidgets.jsの再読み込みは行われません。そのため意図した表示になりません。

そのため今回は、ページ遷移のタイミングでwidgets.jsの読み込みを行うようにしていきます。

目次

SPAでの問題点

twitterのwidgets.jsの読み込みのタイミング本来は表示用のタグが挿入されますが、SPAではページ遷移時にwidgets.jsの再読み込みは行われません。そのため意図した表示になりません。

次のようなコードをページに入れてみます。
このタグは Twitter Publish で 「Embedded Tweet」 で作成したものです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/AcVSLgYInZ">https://t.co/AcVSLgYInZ</a><br>一応ブログを公開した。<br>しばらくはブログ改善する</p>&mdash; みんつ (@mintsu123) <a href="https://twitter.com/mintsu123/status/1104879873523277824?ref_src=twsrc%5Etfw">March 10, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

このブログでの例ですが、直接埋め込んだページを開く場合は正しく期待した表示になりますが、別ページから遷移してタグを埋め込んだページに行くと期待した表示にはなりません。

正しく表示されない例
正しく表示されない例

期待する表示例
期待する表示例

本来であれば下記のスクリプトがページが表示されたタイミングで呼び出されますが、SPAのページでは遷移時にスクリプトは読み込まれません。

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

解決方法

twitterのwigets.jsを事前に読み込んでおいて、遷移したタイミングでwidgets.jsのページ読み込み後ににコンテンツを初期化する方法を使います。

wigets.jsの読み込み

wigets.jsの読み込みが必要なページコンポーネントのheadメソッド、もしくは、サイト全体で使いたい場合はnuxt.config.jsにwigets.jsの読み込みを記述します。

今回はnuxt.config.jsに記載します。

~省略~
module.exports = {
~省略~
  /*
  ** Headers of the page
  */
  head: {
    script: [
      {
        hid: 'twitter',
        type: 'text/javascript',
        src: '//platform.twitter.com/widgets.js',
        async: true,
        defer: true,
        body: true
      }
    ],
  }
~省略~
}

これでページ全体でwidgets.jsが読み込まれるようになります。

続いて遷移時にwidgets.jsのウィジェットの初期化を行うようにします。

ページ遷移時にウィジェットを初期化する

ページ遷移時にウィジェットを初期化するにはtwttr.widgets.load()関数を使います。

Nuxt.jsでページ遷移時に呼び出すにはmountedメソッドを使います。

ページコンポーネントのmountedメソッドに下記を追記します。

  mounted() {
    if (twttr) {
      twttr.widgets.load()
    }
  }

これでSPAでもページ遷移時にもTwitterのウィジェットが表示されるようになります。

まとめ

  • SPAではページ遷移時にwidgetsの初期化が必要
  • twttr.widgets.load()でウィジェットの初期化ができる

今回はツイートの埋め込みを例としていましたが、タイムラインの埋め込みや、ツイートボタンの埋め込みなども同様の手順で解決ができます。