HatenaStar.jsはdeferにできる(がasyncにはできない)

2024/1/6

はてなスターをブログに設置するにはを読むとこういうスニペットが掲載されていて、これを貼り付けるとはてなスターボタンを自分のサイトにつけられて楽しいです。

<script type="text/javascript" src="https://s.hatena.ne.jp/js/HatenaStar.js"></script>
<script type="text/javascript">
Hatena.Star.SiteConfig = {
  entryNodes: {
    'div.section': {
      uri: 'h3 a',
      title: 'h3',
      container: 'h3'
    }
  }
};
</script>

ところで、このスニペットをそのまま <head> 内に貼ると HatenaStar.js のダウンロードと評価の影響でFCPが数百ms悪化します(<body> の末尾に貼ればこれは回避できる)。asyncdefer かを設定したいものですが、HatenaStar.js を読むと DOMContentLoaded を待ち受けているので async にはできません。残念。

defer なら大丈夫なんですが、ただdeferすると window.Hatena が未定義で壊れるので、2つ目のscriptを以下のようにしてあげる必要があります。これがこの記事の本題。

<script type="text/javascript" src="https://s.hatena.ne.jp/js/HatenaStar.js"></script>
<script type="text/javascript">
Hatena = {
  Star: {
    SiteConfig: {
      entryNodes: {
        'div.section': {
          uri: 'h3 a',
          title: 'h3',
          container: 'h3'
      }
    }
  }
};
</script>

現在の HatenaStar.js では window.Hatena がただのObjectだからこれで大丈夫だけど、将来的に変わったら壊れるかも。

別件: スターをつけた人のアイコンを並べる表示(variant: profile-icon)は使えるのか?

はてなブログに表示されるはてなスターはスターをつけた人のアイコンがずらっと並んでもっとにぎやかな感じなんですが、HatenaStar.js を使っている場合はそっちの見た目にする方法はない…… 気がしています。その実装は HatenaStar.js 内に含まれていそうではあるが。

はてなブログ限定機能? minifyされたJSを気合いで読んでいるので自信なし。