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
vercel/og-imageを使ったブログOGPの簡単自動生成 / Generate OGP...
Search
ぷらす
November 21, 2020
Programming
1.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
vercel/og-imageを使ったブログOGPの簡単自動生成 / Generate OGP easily using vercel og-image
ぷらす
November 21, 2020
More Decks by ぷらす
See All by ぷらす
AWSの認定資格を受けた話
p1ass
1
510
趣味プロジェクトをリードする技術 / Technology to lead hobby projects
p1ass
21
9.1k
Webアプリケーションにおける並行処理の難しさ / #Gocon_Sendai
p1ass
4
2.7k
RSSフィードをもっと便利に / Make RSS feeds more convenient #camphor_lt
p1ass
1
16k
うじまる君の生活習慣の乱れを可視化したい! / uzimaru birthday LT
p1ass
2
16k
複数サービスを運用しやすい理想のコンテナ環境をVPS上に構築する #camphor_day / Building ideal container environment on VPS
p1ass
1
9.2k
Kubernetesのイメージタグの更新を楽にするツールを作った / p1ass/mikku - make updating Kubernetes image tags easier
p1ass
1
120
ドメインロジックと 永続化処理を分離する設計改善 を行って得られた知見 / Design improvements that separate domain logic and persistence function
p1ass
1
2.3k
Micro Frontends × gRPC-Web の挑戦 / The challenge of micro frontends and gRPC-Web
p1ass
0
200
Other Decks in Programming
See All in Programming
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
580
今さら聞けない .NET CLI
htkym
0
180
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
「人を評価する AI」の設計と実装
ryoyanara
0
180
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
140
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
440
Cloudflare is Agents
chimame
0
140
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
270
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
330
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
290
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
680
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
How to make the Groovebox
asonas
2
2.3k
So, you think you're a good person
axbom
PRO
2
2.1k
Google's AI Overviews - The New Search
badams
0
1.1k
Transcript
WFSDFMPHJNBHFΛͬͨ ϒϩά0(1ͷ؆୯ࣗಈੜ -5 /BPLJ,JTIJ !QBTT
͡Ίʹ ࠓ͋Γ͕ͱ͏͍͟͝·͢
IUUQTCMPHQBTTDPN Β͢ͷϒϩά
Β͢ͷϒϩά ٕज़ωλͦͷଞॾʑΛॻࣗ͘࡞ϒϩά l (JU)VCQBTTCMPH l ੩తαΠτδΣωϨʔλ)VHP l σβΠϯطଘͷͷʹେྔͷύονΛͯͯΔ l ϗεςΟϯά7FSDFM
l 5XJUUFSͯϒ্Ͱදࣔ l ΠϯϓϨογϣϯͷӨڹେ l ࢹೝੑͷ֦େ l ΫϦοΫྖҬͷ֦େ ը૾Λݸผʹ༻ҙ͍ͨ͠ʂ ϒϩάͷ0(1
ࠓ·Ͱͷ0(1ӡ༻ l هࣄΛॻͨ͘ͼʹ(*.1Ͱը૾Λ࡞ l ςϯϓϨʔτϦϙδτϦʹஔ͍ͱ͍ͨ l ͦͷը૾ΛࣗͰDPNNJU ͦΕͰྑ͍ͬͪΌྑ͍͕໘
Ͳ͏ʹ͔ͯ͠0(1Λࣗಈੜ͍ͨ͠ʂ l όοΫΤϯυͷهࣄͰը૾Λ͏͜ͱك l جຊλΠτϧͷΈͷ0(1Λ࡞ ࣗ͠ಈͰੜͰ͖ΔͷͰʁ
طଘͷੜख๏ ࠨIUUQTTQFBLFSEFDLDPNTDILUKNGJSFCBTFEFPTIPVRJOHPHQTIFOHDIFOH ӈIUUQTTQFBLFSEFDLDPNEPSB ੜ-5ͷఆ൪ωλ
طଘͷੜख๏ l 'JSFCBTF $MPVE'VODUJPOT l ͓खܰ CZͨ͡· l /FYUKT 443
7FSDFM l +49Λ͔͚ΔͷͰෳࡶͳ͜ͱΛ͢Δͷʹྑͦ͞͏ l 0(1͚ͩͷͨΊͩͱΦʔόʔΤϯδχΞϦϯά͔ʁ
ୈࡾͷબࢶ WFSDFMPHJNBHF https://github.com/vercel/og-image
WFSDFMPHJNBHFͷಛ l 63*ɾΫΤϦύϥϝʔλΛม͑Δ͜ͱͰੜը૾ΛมԽ l ϒϩάͷλΠτϧΛૹΕ0, l WFSDFMͰ؆୯σϓϩΠʂ l $*ͰσϓϩΠࣗಈԽΛؤுΜͳͯ͘0, l
$%/ʹΩϟογϡͯ͘͠ΕΔͷͰຖճը૾͕ੜ͞Εͣߴ ࠓճͷ༻్ʹྑͦ͞͏
WFSDFMPHJNBHFͷσϓϩΠ جຊ3&"%.&௨ΓʹΕ0, WFSDFMPHJNBHFΛϑΥʔΫ WFSDFMKTPOΛฤू )5.-$44Λ͍ͬͯ͡σβΠϯΛมߋ WFSDFMʹσϓϩΠ
࣮ࡍͷྫ IUUQTPHJNBHFQBTTDPNBQJW$BEEZͰH31$ͷϦΫΤετΛϦόʔεϓϩΩγ͢ΔQOH
ؾΛ͚ͭΔϙΠϯτ l WFSDFMʹຊޠϑΥϯτ͕ͳ͍ l ͲΒ܅ݴͬͯͨɻ8FCϑΥϯτ͔ຒΊࠐΈͰରԠ l ࠷ॳۭനͷ0(1Λੜͯ͠͠·ͬͨ
ؾΛ͚ͭΔϙΠϯτ l σϑΥϧτͷ$BDIF$POUSPM͕ l ۭനͷ0(1͕5XJUUFSʹΩϟογϡ͞Εɺ5XJUUFS7BMJEBUPSΛͬͯ 0(1͕ߋ৽͞Εͳ͍ l 63-ʹόʔδϣϯQSFGJYΛ༩ͯ͠ରԠ l IUUQTPHJNBHFQBTTDPNBQJW$BEEZͰH31$ͷϦΫΤετΛϦόʔεϓϩΩ
γ͢ΔQOH
ਓʹΑͬͯؾʹͳΔϙΠϯτ l ੜը૾ͷϚʔΫΞοϓ͕+49Ͱͳ͘ී௨ͷ)5.- l ࠓճఔͷͷͰ͋Εͳ͔͕ͬͨɺ ෳࡶͳͷΛΖ͏ͱ͢Δͱ +49Λॻ͖ͨ͘ͳ͖ͬͯͦ͏ l ReactDOMServer.renderToStaticMarkup(element)で )5.-จࣈྻΛੜͯ͠͠·͑؆୯ʹग़དྷͦ͏
https://zenn.dev/otsukayuhi/articles/e52651b4e2c5ae7c4a17 export function getHtml(parsedReq: ParsedRequest) { const { text, theme, md, fontSize } = parsedReq; return `<!DOCTYPE html> <html> <meta charset="utf-8"> <title>Generated Image</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> ${getCss(theme, fontSize)} </style> <body> <div> <div class="spacer"> <div class="heading">${emojify( md ? marked(text) : sanitizeHtml(text) )} </div> </div> </body> </html>`; }
ଞͷਓ͕࡞ͬͨWFSDFMPHJNBHFΛͬͨͭ (JU)VC4PDJBMJGZ(JU)VC༻ͷ0(1Λ࡞ͬͯ͘ΕΔ܅ https://socialify.git.ci/
·ͱΊ l WFSDFMPHJNBHFΛͬͯϒϩάͷ0(1Λࣗಈੜ l WFSDFMʹ؆୯σϓϩΠͰ͖ΔͷͰݸਓͩͱ͔ͳΓ༗༻ l ϋϚΓͲ͜Ζ͚ͩҙ͠·͠ΐ͏