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
960
Next.jsで作ったブログ内に リンクカードを実装したときの知見
soso
June 24, 2023
Tweet
Share
More Decks by soso
See All by soso
Devinアップデート最前線2025.07 Devin v2.xの活用術
soso_15315
1
290
TiDB Serverless ~理想のServerless DBを考える~
soso_15315
1
630
AWS CDKを4〜5年使ってたどり着いた最新構成
soso_15315
1
2.5k
Reactにおける再レンダリングパフォーマンスチューニングの考え方と実践
soso_15315
2
410
React Hooks公開から1年で得られた知見
soso_15315
1
510
Other Decks in Programming
See All in Programming
Go コードベースの構成と AI コンテキスト定義
andpad
0
160
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.6k
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
1.4k
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
540
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
650
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
410
クラウドに依存しないS3を使った開発術
simesaba80
0
220
Deno Tunnel を使ってみた話
kamekyame
0
320
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
460
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.6k
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
650
CSC307 Lecture 03
javiergs
PRO
1
470
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
890
Building an army of robots
kneath
306
46k
Skip the Path - Find Your Career Trail
mkilby
0
42
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
190
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
330
Optimizing for Happiness
mojombo
379
70k
We Are The Robots
honzajavorek
0
130
Navigating Weather and Climate Data
rabernat
0
68
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.3k
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できないのであればエッジで処理するのが無難な選択肢
ご静聴ありがとうございました