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.2k
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
「人を評価する AI」の設計と実装
ryoyanara
0
250
高専キャリア LT 発表内容
crysta1221
2
2.8k
Go 1.27 における memory allocation の高速化
andpad
0
340
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
560
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.8k
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
450
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
110
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
240
不幸な GC
chencmd
0
800
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
730
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
310
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
170
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.9k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
So, you think you're a good person
axbom
PRO
2
2.1k
Tell your own story through comics
letsgokoyo
1
1k
Writing Fast Ruby
sferik
630
63k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
220
We Are The Robots
honzajavorek
0
310
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
290
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
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 ϋϚΓͲ͜Ζ͚ͩҙ͠·͠ΐ͏