Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Next.jsで作ったブログ内に リンクカードを実装したときの知見
Search
soso
June 24, 2023
Programming
3
780
Next.jsで作ったブログ内に リンクカードを実装したときの知見
soso
June 24, 2023
Tweet
Share
More Decks by soso
See All by soso
TiDB Serverless ~理想のServerless DBを考える~
soso_15315
1
450
AWS CDKを4〜5年使ってたどり着いた最新構成
soso_15315
1
1.6k
Reactにおける再レンダリングパフォーマンスチューニングの考え方と実践
soso_15315
2
350
React Hooks公開から1年で得られた知見
soso_15315
1
480
Other Decks in Programming
See All in Programming
未経験でSRE、はじめました! 組織を支える役割と軌跡
curekoshimizu
1
150
新宿駅構内を三人称視点で探索してみる
satoshi7190
2
120
Better Code Design in PHP
afilina
0
170
AIプログラミング雑キャッチアップ
yuheinakasaka
17
4.3k
From the Wild into the Clouds - Laravel Meetup Talk
neverything
0
140
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
170
Unity Android XR入門
sakutama_11
0
180
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.5k
Honoとフロントエンドの 型安全性について
yodaka
7
1.4k
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
510
Rubyと自由とAIと
yotii23
6
1.7k
Featured
See All Featured
Building Adaptive Systems
keathley
40
2.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
370
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
The Cost Of JavaScript in 2023
addyosmani
47
7.4k
GraphQLとの向き合い方2022年版
quramy
44
14k
Agile that works and the tools we love
rasmusluckow
328
21k
It's Worth the Effort
3n
184
28k
KATA
mclloyd
29
14k
What's in a price? How to price your products and services
michaelherold
244
12k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Mobile First: as difficult as doing things right
swwweet
223
9.4k
Making Projects Easy
brettharned
116
6k
Transcript
@sosomuse Next.jsで作ったブログ内に リンクカードを実装したときの知見
作ったもの 6 Next.js on Vercel(SG)の個人ブログにリンクカードを実装した
前提 Next.js v13 以前で作ったブログなので、App Router 対応してません(どこか で移行したい。ただし App Router
でも Pages Router でもこの資料の内容に は特に影響しません。書き方ちょっと変わるぐらいのはず このUIの呼び方は色々あり統一されていない(?)ようですが、本資料中で はZennに合わせてリンクカードと呼称します。 https://zenn.dev/zenn/articles/markdown-guide
作ってみた感想 https://www.sososo.me 自分のブログで作ったけど思ったより面倒だっY Qiita, Zenn, Twitterなどはクオリティ高いなと再認1
なので実装に手間取った時に得た知見を話します
アジェンダ 2. リンクカードの基本構成 3. OGPの取得とキャッシュ 1. 自己紹介
自己紹介 OSSコントリビュート: Storybook, i18next, ...etc 最近はAWS CDKとAtCoderにハマってます。 西村 爽 So
Nishimura フロントエンド: Next.js バックエンド: Go インフラ: AWS @sosomuse
アジェンダ 2. リンクカードの基本構成 3. OGPの取得とキャッシュ 1. 自己紹介
リンクカードの基本構成 これらは で定義されている OGP サービスによって表示要素は異なるが、基本的に以下の要素で構成 URL Title Description Image
OGP(Open Graph protocol) あとはサイトのメタデータから抽出して表示するだけ! Title: `og:title` Description: `og:description` Image: `og:image`
パラメータ https://ogp.me/ Facebookが開発したメタデータのプロトコル 大抵のWebサイトはこれに沿って自身のサイト情報を提供してくれている
コンポーネント作成 いい感じにコンポーネントを作る
完成? やった!完成だ!... ではない OGPの取得場所とキャッシュどうするの?
アジェンダ 2. リンクカードの基本構成 3. OGPの取得とキャッシュ 1. 自己紹介
OGPの取得 課題 解決策 OGPはHTMLのメタデータに定義されているので、取得するためには当然対象の Webサイトにアクセスしなければならない。 OGP取得速度は対象のWebサイトへの表示速度に依存するので、最悪数秒かかる ことも想定される。 クライアント側で取得するのでは遅すぎるし、APIサーバーで持つにしてもキャッ シュしたい。 (クライアント側だとCORS問題もある)
クライアント以外で取得してどこかにキャッシュを持つ 具体的な解決策はいくつかありそうだが、個人ブログなのでコストは掛けたく無 いしリソースも管理したく無い(APIサーバーとかは用意したくない)
他サービスの実装(1) Zenn Zennは開発技術がかなり公開されているので、こういった時非常に参考になりま す。 現在も同じ構成かは分かりませんが catnose さんの当時の scrap によれば、 CloudFunctionsでHTMLを生成して、iframeで表示。一定期間キャッシュしてい
るとのこと。 r https://zenn.dev/catnose99/scraps/381b3750099f49
他サービスの実装(2) 所感 エッジサーバーで取得・キャッシュしてから返すのが実装としては無難そうだ が、ぶっちゃけ個人ブログの1機能ぐらいであればエッジサーバーですら用意した くない。
解決策(1) 最終的な解決 SGでブログをレンダリングしているので、ビルドフェーズでメタデータを取得して最終 的なHTMLを生成する。 メタデータはキャッシュとしてJSONファイルでGitにコミットする。
解決策(2) 解決策(2) 解決策詳細(ビルドフェーズで以下の事を行う) uG 記事のMarkdownからURLを取得して、HTTPリクエストで対象サイトのメタデータ を取r G 取得したメタデータをJSONファイルに書き込む(キャッシュ用e 3G JSONファイルのメタデータを使ってHTML生s
BG キャッシュ用JSONファイルはコミットする
解決策(2) 解決策(3) ビルドフェーズのコード
解決策(2) 解決策(4) 以上でSGで表示できて、キャッシュされるようにもなりました
解決策(2) 課題 & まとめ 課題 残った課題 この処理だと一度取得したメタデータが一生キャッシュされるので、一定期間でパージするよ うな処理を入れないと元サイトのOGPが変わった時に追従されない。 再生成スクリプトを用意してGitHub Actionsで定期実行するのが妥当かなーとか考えている
が、やはり個人ブログの1機能のためにそんなリソースを持ちたくない。(まぁ、GitHub Actionsぐらいならいいかと思いつつ面倒なので放置してます...) OGPが変わる機会もそんなにないので、今はいいかなと思って放置している。
解決策(2) 課題 & まとめ まとめ リンクカードの表示はHTTPリクエストが絡むので思ったより手間が掛かる SGであればビルドフェーズでリクエストしてしまえば高速に表示できる SGできないのであればエッジで処理するのが無難な選択肢
ご静聴ありがとうございました