Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nuxt(SPA)でもOGPしたい/want to render ogp with nuxt ...
Search
果物リン
May 27, 2019
Technology
4
3.5k
Nuxt(SPA)でもOGPしたい/want to render ogp with nuxt spa mode
ここにSPAモードのプロッジェクトがあります。
OGP?はい、1個設定できますね。
ページごとに設定したい?いったいなにをいっているんだ。
果物リン
May 27, 2019
Tweet
Share
More Decks by 果物リン
See All by 果物リン
Electron+Vue+Swift=真のデスクトップアプリ / How to create "Really" desktop app using Electron
fruitriin
0
95
ある日オレオレフレームワークを作りたくなったぞ/Want to Create Oreore Framework
fruitriin
1
140
fishとfzfはじめて 豊かになりました / fish and fzf is good
fruitriin
1
920
Chrome Devtools使いこなしたい/I want to master devtool
fruitriin
3
1.5k
Event Stage - 真面目に作ったけど 全くウケなくてクソだったアプリ/I made new service but they say shit
fruitriin
0
180
読み上げチャット+映像配信サービス作ってるけど…/I develop Text-to-Speach chat and broadcast Savice but...
fruitriin
0
150
とある自社開発の苦楽の軌跡/Trajectory of a Certain In-house Development Effort
fruitriin
1
250
動画再生速度を変更するコンポーネントを作ろうとして諦めた話/talk about give up to create video with playback-rate controller
fruitriin
6
960
Soft Skillsから伝えたい新人時代の個人開発技術選定/Selecting Stack for Personal Development as a from Soft Skills
fruitriin
2
370
Other Decks in Technology
See All in Technology
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
2
180
Agent Skillsがハーネスの垣根を超える日
gotalab555
6
3.7k
たまに起きる外部サービスの障害に備えたり備えなかったりする話
egmc
0
390
ソフトウェアエンジニアとAIエンジニアの役割分担についてのある事例
kworkdev
PRO
0
150
障害対応訓練、その前に
coconala_engineer
0
180
ペアーズにおけるAIエージェント 基盤とText to SQLツールの紹介
hisamouna
2
1.4k
事業の財務責任に向き合うリクルートデータプラットフォームのFinOps
recruitengineers
PRO
2
180
コンテキスト情報を活用し個社最適化されたAI Agentを実現する4つのポイント
kworkdev
PRO
1
1.9k
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
2
400
AWS re:Invent 2025 re:Cap LT大会 データベース好きが語る re:Invent 2025 データベースアップデート/セッションの紹介
coldairflow
0
160
ExpoのインダストリーブースでみたAWSが見せる製造業の未来
hamadakoji
0
190
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
570
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
130
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
91
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
The Limits of Empathy - UXLibs8
cassininazir
1
190
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.4k
Why Our Code Smells
bkeepers
PRO
340
57k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Transcript
Nuxt(SPA)でも OGPしたい ՌϦϯ@FruitRiin גࣜձࣾΏΊΈ Roppongi.vue #1 2019/05/27
Q. NuxtͰ ϖʔδݸผʹOGPΛ ઃఆ͍ͨ͠Ͱ͢
SSR, UniversalϞʔυ headͰϝλλάઃఆ
Yes! ͦ͏Ͱ͋Δ͖ʂ
ͱ͜ΖͰ ͜͜ʹSPAϞʔυͷ ϓϩδΣΫτ͕͋Γ·͢
ʮͳΜͰSPAϞʔυͳΜ͔͢ʁʯ ʮ༷͔ͩΒɺܦҢΘ͔ΒΜʯ ʮ͍͞Ͱʯ
ΫϥΠΞϯτͷσΟϨ ʮOGPग़ͳ͍ΜͰ͔͢ʁʯ
Ͱ͢ΑͶʔ
͙͵͵͵…… SPA͔ΒUniversalϞʔυͷΓସ͑…… →fetchͰͷwindow objectૢ࡞͕શ໓ Ұ෦ઃܭΓͳ͓͠ ݕূίετܹ૿……
ΫϥΠΞϯτͷΤϯδχΞ ʮNuxtʹ͢લʹExpressͰ HTMLΛվ͟Μ͢Ε ͍͚ΔͷͰʁʯ
ΓɺΓͭ͘Θ͔Δ Θ͔Δ͕……
Nuxt(SPA)でも OGPしたい 闇の魔術に対する防衛術
自己紹介 • ՌϦϯ@FruitRiin • גࣜձࣾΏΊΈ • ·ͳ͘ೖࣾ4ϲ݄ • ϑϩϯτΤϯδχΞɺνʔϜϦʔμʔɺPMʁ •
Vue͍͍ͧʂ
ʮ͍ͬͯ͏ͳΜ͚ͩͲ͞ɺ Ͱ͖Δͱࢥ͏ʁʯ ʮͪΐͬͱௐͯΈ·͠ΐ͏͔ʯ
ʮͰ͖ͦ͏ͳؾ͕͠·͢ʁʯ ʮϚδͰʁʯ
方針:nuxt startしない プロジェクトを目指す • nuxt start͢Δͱαʔόʔ͕ىಈ͢Δ • վ͟Μͷ༨ͳ͠ • expressΛىಈ͢Δapp.js
తͳͷΛͭ͘Δ • nuxt start ͷΘΓʹ node app.js ͢Δ
app.js? • NodeͰಈ͔͢ϓϩάϥϜͱͯ͠ࢦఆ͢ΔϑΝΠϧ • ߏཁ݅ • nuxtΛexpressͷϞδϡʔϧͱͯ͠ॳظԽ • ։ൃϞʔυͷͱ͖ϗοτϦϩʔυ༻ʹϦϏϧυ •
expressʹϦΫΤετ͕དྷͨͱ͖ Nuxt.jsͰϨϯμϦϯά • expressΛࢦఆϙʔτͰػͤ͞Δ
ͳΔ΄Ͳ·ͬͨ͘Θ͔ΒΜ
app.js • ࢀߟจݙ: nuxt.render() https://ja.nuxtjs.org/api/nuxt-render/ • جຊతͳܕͱ্ͯ͠هͷίʔυΛ ͦͷ··ར༻͠·͠ΐ͏
const { Nuxt, Builder } = require('nuxt') const app =
require('express')() const isProd = (process.env.NODE_ENV === 'production') const port = process.env.PORT || 3000 // Nuxt.js ΛΦϓγϣϯͱͱʹΠϯελϯεԽ͢Δ const config = require('./nuxt.config.js') config.dev = !isProd const nuxt = new Nuxt(config) // ͯ͢ͷϧʔτΛ Nuxt.js ͰϨϯμϦϯά͢Δ app.use(nuxt.render) // ϗοτϦϩʔσΟϯά͢Δ։ൃϞʔυͷͱ͖ͷΈϏϧυ͢Δ if (config.dev) { new Builder(nuxt).build() .then(listen) } else { listen() } function listen() { // αʔόʔΛ Listen ͢Δ app.listen(port, '0.0.0.0') console.log('Server listening on `localhost:' + port + '`.') }
ͦ͏͍͏ͷͩͱఘΊͯ͘Ε
備考:create-nuxt-app • Use a custom server framework? ʹ -> express
ͱճ͢Δ • server/index.js Λࣗಈੜͯ͘͠ΕΔʂʂ • ༰ઌఔͷϑΝΠϧͱ֓Ͷಉ͡
HTMLを取得したい • HTMLͷऔಘʹ nuxt.renderRoute() Λ͏ • SPAϞʔυͰ࣮࣭ςϯϓϨʔτ͕औಘͰ͖Δ • ฦΓͷΦϒδΣΫτʹؚ·ΕΔ html
ʹ ϨϯμϦϯά͠Α͏ͱͨ͠HTML͕ೖ͍ͬͯΔ
ಛఆϧʔςΟϯάͷͱ͖ͷΈͷॲཧ • ϧʔςΟϯάͰॲཧΛ͚͍ͨˠapp.get() ͳͲΛ͏ • express ͷgetϝιου • app.get(‘/detail’) ,
app.get(‘/user/:userId’) ͳͲ
const { Nuxt, Builder } = require('nuxt') const app =
require('express')() const isProd = (process.env.NODE_ENV === 'production') const port = process.env.PORT || 3000 // Nuxt.js ΛΦϓγϣϯͱͱʹΠϯελϯεԽ͢Δ const config = require('./nuxt.config.js') config.dev = !isProd const nuxt = new Nuxt(config) // ͯ͢ͷϧʔτΛ Nuxt.js ͰϨϯμϦϯά͢Δ app.use(nuxt.render) // ϗοτϦϩʔσΟϯά͢Δ։ൃϞʔυͷͱ͖ͷΈϏϧυ͢Δ if (config.dev) { new Builder(nuxt).build() .then(listen) } else { listen() } function listen() { // αʔόʔΛ Listen ͢Δ app.listen(port, '0.0.0.0') console.log('Server listening on `localhost:' + port + '`.') } େࣄͦ͏
// Nuxt.js ΛΦϓγϣϯͱͱʹΠϯελϯεԽ͢Δ const config = require('./nuxt.config.js') config.dev = !isProd
const nuxt = new Nuxt(config) // detailͰಛผॲཧ app.get(‘/detail', async (req, res) => { const result = await nuxt.renderRoute('/'); console.log(result.html) }) // ͯ͢ͷϧʔτΛ Nuxt.js ͰϨϯμϦϯά͢Δ app.use(nuxt.render) Ճ͠·ͨ͠ ↑Ͱॲཧ͞Εͳ͚Ε ɹͬͪ͜Ͱॲཧ͢Δ
None
axiosで必要なデータを引っ張る • ͜͜ීஈͱ͋·ΓมΘΒͳ͍ • axios.get() ͳΓͳΜͳΓ
改ざんしてレンダリング • Կߟ͑ͣʹےͰ String.replace() • String.replace(/<meta data-hid=“og:title”.*?>/, 'ʢུʣ') • ஔͨ͠ͷΛ
res.send() ͢Δ
// detailͰಛผॲཧ app.get("/detail", async (req, res) => { const result
= await nuxt.renderRoute("/"); let html = result.html; const meta = await axios.get("/someting-meta") html = html.replace(/<meta data-n-head="true" data-hid=“og:title".*?>/, `<meta title="og:title" content="${meta.title}">`) res.send(html) }); Ճ͠·ͨ͠
None
None
ΊͰͨ͠ɹΊͰͨ͠
メリット • ҠߦʹൺΕݕূίετ͕͍ܰ • طଘͷSPAͷॲཧΛݟ͞ͳͯ͘Α͍ • αʔόʔͰDOMͷܭࢉΛ͠ͳ͍ͰΑ͍ • expressΛىಈ͢Δඞཁ͋ΔͷͰɺ αʔόʔϦιʔεΛ৯Θͳ͍Θ͚Ͱͳ͍
デメリット • UniversalϞʔυͰ͍͍ͳΒ UniversalϞʔυͷ΄͏͕Α͍ • Expressͷ͕ࣝଟগඞཁ • Δ͜ͱ͕టष͍
デメリット2 • ϖʔδίϯϙʔωϯτͷϧʔςΟϯάͱ վ͟ΜॲཧͷϧʔςΟϯά͕Ұக͠ͳ͍ • NuxtͷࣗಈϧʔςΟϯάͷԸܙΛड͚ΒΕͳ͍ • ̍ϖʔδͷॲཧ͕2Օॴʹ͔ΕΔ • ରͷϖʔδ͕૿͑Δͱίʔυ͕ͨΒ͘ͳΔ
͍ͬͯ͏͔ UniversalϞʔυͰ͖ΔͳΒ ຊʹͦͷํ͕͍͍
ཁ݅ʹ߹Θͤͯ SPAϞʔυͰ։ൃΛਐΊ͍͍ͯͷ͔ ࠓҰߟ͑Α͏
SPAϞʔυ͡Ό OGPग़ͳ͍ͧͬʂ