はじめに
Twitter の埋め込みツイート(Embed tweet)を Lazy load させる方法
TL;DR
- ApoorvSaxena/lozad.js を CDN などから読み込み
- カスタムハンドラ内で埋め込みツイート作成に必要な要素(
blockquote
, script
)を 作成/追加
- いきなりイベントが大量発火しないように
min-height
などを設定しておく
目次
- はじめに
- TL;DR
- 環境・条件
- 詳細
- 前置き: 埋め込みツイートについて
- 大量の埋め込みツイートを表示したい場合の問題点
- 本題: 埋め込みツイートを Lazy Load させる
- 簡単な解説
- カスタムイベントハンドラの設定
- 初期読み込み時の監視イベント発火タイミングの制御
- Tips: イベント発火タイミングの調整
- 注意点
- まとめ
- その他・メモ
- 参考文献
環境・条件
- lozad.js - v1.15.0 - 2020-05-23 (CDN 版)
- Google Chrome バージョン: 83.0.4103.116(Official Build) (64 ビット)
詳細
前置き: 埋め込みツイートについて
埋め込みツイート自体は Twitter Publish を使うと作成できる。
↑のツイートは HTML コード的には以下のようになっている。
1 2 3 4 5 6 7 8 9 10 11 12
| <blockquote class="twitter-tweet"> <p lang="ja" dir="ltr"> tweet.js loader - 全ツイート履歴 表示er <a href="https://t.co/ad1O38z04A">https://t.co/ad1O38z04A</a> <br> Twitter データの tweet.js を読み込んで全ツイート履歴の表示や tweets.csv への書き出しが可能なサイト <a href="https://twitter.com/hashtag/%E5%85%A8%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E5%B1%A5%E6%AD%B4?src=hash&ref_src=twsrc%5Etfw">#全ツイート履歴</a> <a href="https://twitter.com/hashtag/tweetjs?src=hash&ref_src=twsrc%5Etfw">#tweetjs</a> </p>— r17n (@r17num) <a href="https://twitter.com/r17num/status/1189564565970833414?ref_src=twsrc%5Etfw">October 30, 2019</a> </blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
細かい話は省くがこの記事に色々と書いている通り、以下のように情報を極限まで削っても埋め込みツイートの表示自体は動作する。
1 2 3 4 5
| <blockquote class="twitter-tweet"> <p lang="ja" dir="ltr"></p> <a href="https://twitter.com/i/status/1189564565970833414"></a> </blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
|
大量の埋め込みツイートを表示したい場合の問題点
埋め込みツイートを複数表示したい場合、Twitter Publish で作った埋め込みコードなり、前述の手順で極限まで削った HTML タグなりを並べていけば表示できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <blockquote class="twitter-tweet"> <p lang="ja" dir="ltr"></p> <a href="https://twitter.com/i/status/1189564565970833414"></a> </blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet">...</blockquote> <script ...></script>
...
<blockquote class="twitter-tweet">...</blockquote> <script ...></script>
|
埋め込みツイート数が少ないうちは良いかもしれないが、大量のツイートを1ページに表示したいようなケースだと、大量のリクエストが一度に発行されブラウザが固まってしまう。
※もちろん「そもそもそんなページ構成にするな」という問題でもある。が、ここでは無視する。
本題: 埋め込みツイートを Lazy Load させる
というわけで ApoorvSaxena/lozad.js を使って、埋め込みツイートを Lazy Load させるようにしてみた。
See the Pen
Embed tweet lazy load using lozad.js by 17num (@17num)
on CodePen.
Embed tweet lazy load using lozad.js
コード的には以下のような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"></script> <title>Twitter embed lazy load</title> <style> .lozad { min-height: 500px; } </style> </head> <body> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285474269690949633"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285507640232009733"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1286466271085641729"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285796171403849735"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285469590504345600"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285107828743499777"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1285099290583392257"></div> <div class="lozad" data-twitter-src="https://twitter.com/i/status/1283978337841377280"></div> <script> const observer = lozad('.lozad', { load: el => { const blockquote = document.createElement('blockquote'); blockquote.className = 'twitter-tweet';
const p = document.createElement('p'); p.lang = 'ja'; p.dir = 'ltr'; blockquote.appendChild(p);
const twitterSrc = el.dataset.twitterSrc; const a = document.createElement('a'); a.href = twitterSrc; blockquote.appendChild(a);
const script = document.createElement('script'); script.src = 'https://platform.twitter.com/widgets.js'; script.charset = 'utf-8'; script.async = true;
el.insertAdjacentElement('beforeEnd', blockquote); el.insertAdjacentElement('beforeEnd', script); } }); observer.observe(); </script> </body> </html>
|
簡単な解説
前章のコメント読めばほとんど分かると思う、主なポイントは2つ。
カスタムイベントハンドラの設定
Usage の最後に記載されている通り、Observer 初期化時に load
オプションを設定することで独自の処理を実行させることができる。
1 2 3 4 5
| const observer = lozad('.lozad', { load: el => { } });
|
今回はここで blockquote
と script
を 作成/追加 するようにしている。
初期読み込み時の監視イベント発火タイミングの制御
class="lozad"
の min-height: 500px;
としているのは、高さを設定していないと一気に全ての要素を検知しイベントがまとめて発火するため。
1 2 3
| .lozad { min-height: 500px; }
|
高さは適当なので各自で調整。
Tips: イベント発火タイミングの調整
rootMargin
, threshold
の設定でイベント発火タイミングを調整可能。
1 2 3 4
| const observer = lozad('.lozad', { rootMargin: '10px 0px', threshold: 0.1, });
|
注意点
Browser Support に書かれている通り、IE 11 は未サポートなので Polyfill が必要になる。
まとめ
- ApoorvSaxena/lozad.js を CDN などから読み込み
- カスタムハンドラ内で埋め込みツイート作成に必要な要素(
blockquote
, script
)を 作成/追加
- いきなりイベントが大量発火しないように
min-height
などを設定しておく
その他・メモ
参考文献
関連記事