ブログにシェア画像自動生成機能をつけた
2020年7月2日
概要
シェア画像自動生成機能をつけた。この記事を参考にした。
大体こんな感じ。
- タイトルからシェア画像の元になるページを生成
- ブログのデータにシェア画像URLをセット
- ベースレイアウトでURLをog:imageにセット
- 生成元ページのHTMLからPNGを生成
細かい話
HTML to PNG
参考にした記事ではSVGを作ってそれをPNGに変換しているけど、僕はSVGでいろいろ調整していくのがめんどくさかったのでHTMLをPNGにする方法にした。HTMLをPNGに変換するのはnode-html-to-imageを使った。このライブラリはpuppeteerを使ってHTMLを画像に変換してくれるやつ。記事数増えてビルドに時間かかりすぎるようなら考え直すかも。
CSS in puppeteer
外部CSSは反映されなかったのでインラインスタイルでCSSを書いた。Google Fontsのフォントを参照したかったんだけど無理だったのでbase64にしてHTMLに埋め込んだ。おかげでHTMLがクソ長になってしまった…。
node-html-to-image
のoptionにあるwaitUntil
にdomcontentloaded
を設定すれば外部CSSも適用される。(base64でフォント埋め込んだせいでビルドが大変遅くなっていた…。)
{
waitUntil: 'domcontentloaded',
}
あと「ブラウザで見ると問題ないのに生成した画像だとちょっとずれる」みたいなことがあったのでCSSを調整した。margin-top
があると良くないみたいだったのでpadding
にした。
Computed Data
記事のデータにogImageUrl
を持たせる必要があったので、11tyのComputed Data
という仕組みを利用した。blog
ディレクトリにblog.11tydata.js
を配置して下記のようなコードを書けば、blog
配下にある記事すべてにogImageUrl
というデータが追加される。
module.exports = {
eleventyComputed: {
ogImageUrl: (data) =>
`https://takanorip.com/teasers/${data.page.fileSlug}.png`,
},
};
その他
11tyのPaginationとPermalinkはマジで便利。この2つを使えば任意のデータからページを簡単に出力できる。タグの記事一覧もこれらの機能を使って実装されてる。
感想
意外とかんたんだった。だいぶ11tyを理解してきた気がする。