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
460
AWS CDKを4〜5年使ってたどり着いた最新構成
soso_15315
1
1.7k
Reactにおける再レンダリングパフォーマンスチューニングの考え方と実践
soso_15315
2
350
React Hooks公開から1年で得られた知見
soso_15315
1
480
Other Decks in Programming
See All in Programming
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
950
未経験でSRE、はじめました! 組織を支える役割と軌跡
curekoshimizu
1
170
Better Code Design in PHP
afilina
0
180
新宿駅構内を三人称視点で探索してみる
satoshi7190
2
120
React 19アップデートのために必要なこと
uhyo
8
1.5k
Introduction to kotlinx.rpc
arawn
0
770
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
230
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
750
DRFを少しずつ オニオンアーキテクチャに寄せていく DjangoCongress JP 2025
nealle
2
280
From the Wild into the Clouds - Laravel Meetup Talk
neverything
0
170
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
940
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Git: the NoSQL Database
bkeepers
PRO
428
65k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
RailsConf 2023
tenderlove
29
1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
11
1.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
How to train your dragon (web standard)
notwaldorf
91
5.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
How to Ace a Technical Interview
jacobian
276
23k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
650
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できないのであればエッジで処理するのが無難な選択肢
ご静聴ありがとうございました