Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WordPressで Headlessフロントエンド / kansaiwp-meetup-20...
Search
Hidetaka Okamoto
November 22, 2020
Programming
2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WordPressで Headlessフロントエンド / kansaiwp-meetup-202011
Hidetaka Okamoto
November 22, 2020
More Decks by Hidetaka Okamoto
See All by Hidetaka Okamoto
OpenAI APIで API Changelogを要約してみた話 / chatgpt-osaka-1
hideokamoto
0
720
コミュニティ運営から 中の人に変わって感じたこと
hideokamoto
0
150
Developerが Developer Advocateになった話 / dev-rel-meetup-tokyo-71
hideokamoto
0
390
Jamstack開発者のための App Runner入門
hideokamoto
1
560
WordPressでの webサイト制作2022 / ngk2022s
hideokamoto
0
500
JavaScript(TypeScript)で メディアサイトを インフラから構築する方法 / jsconf-jp-2021
hideokamoto
2
4.4k
AWS上でStripeを利用したアプリをより安全にデプロイする方法 /jaws-pankration-2021
hideokamoto
1
250
Shifter Headlessと Headless WordPressの紹介
hideokamoto
0
2.2k
Stripe & Next.js + AWS Amplify で会員 + 定期課金機能 / JP_Stripes20210903
hideokamoto
7
3.3k
Other Decks in Programming
See All in Programming
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
App Intentsのビルドプロセスを支える技術
kntkymt
0
130
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
260
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1k
ソフトウェアラスタライザ
fadis
1
800
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
110
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
37k
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.7k
不幸な GC
chencmd
0
890
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
140
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Unsuck your backbone
ammeep
672
58k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
510
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Paper Plane
katiecoart
PRO
3
53k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
Odyssey Design
rkendrick25
PRO
2
800
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
Site-Speed That Sticks
csswizardry
13
1.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
How to Ace a Technical Interview
jacobian
281
24k
Transcript
WordPressͰ HeadlessϑϩϯτΤϯυ Kansai WordPress Meetup 2020/11 Okamoto Hidetaka #WPmeetupOsaka
TL;DR • webαΠτදࣔํ๏SSR / SPA / SSGͷ3ͭ • SEO /
Մ༻ੑॏࢹͳΒSSG • Paywall / ձһઐ༻ίϯςϯπͳͲSPA • ύϑΥʔϚϯεͱߋ৽ͷఱṝ࣍ୈͰSSR #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
“Why Headlessʁ”ҎԼͷεϥΠυ https://speakerdeck.com/hideokamoto/shifter-meetup-202011 #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
Headless = ֎͔ΒWPͷσʔλΛऔಘ͢Δ • HTTP(S) APIΛར༻ͯ͠ɺ֎෦͔ΒWPͷσʔλΛऔಘ • REST API /
GraphQL API / XMLRPC APIͷ3ͭ • XMLRPC APIͷ͜ͱΕ·͠ΐ͏ • REST API: ͍ΘΏΔWP API • GraphQL: WP GraphQL ϓϥάΠϯʢ࠷͍ۙͭʹv1ϦϦʔεʣ #WPmeetupOsaka
WP API • WPίΞ͕ఏڙ͢ΔREST API • GET͍͍ͩͨೝূͳ͠ͰOK • HookͰΧελϚΠζՄೳ •
ΧελϜϑΟʔϧυͳͲͷ֦ு ϓϥάΠϯ͔HookͰରԠ https://developer.wordpress.org/rest-api/reference/ #WPmeetupOsaka
WP GraphQL • ϓϥάΠϯͱͯ͠Πϯετʔϧ • WordPressͷσʔλΛGraphQLͰ • HookϓϥάΠϯͰ֦ுՄೳ • ഁյతมߋ͕ଟ͔ͬͨͷͰ
v0࣌ͷهࣄʹཁҙ https://wordpress.org/plugins/wp-graphql/ #WPmeetupOsaka
REST API or GraphQL • ໔ڐऔಘલ͔ΒϨʔγϯάΧʔʹΔඞཁͳ͍ • γϯϓϧͳBlog / websiteͳΒREST
APIͰ͍͍ͩͨࣄΓΔ • ΧελϜߘ / ϑΟʔϧυͳͲ͕૿͑ͯ͘ΔͱɺGraphQLݕ౼ର • REST APIΛ3ͭ4ͭಉ࣌ʹୟ͔ͳ͍ͱ͍͚ͳ͍ or HookͰΧελϜ͠·͘Βͳ͍ͱ͍͚ͳ͍ͳΒGraphQLͷग़൪ • ࠷ऴతʹHTTPͰGET(REST)͔POST(GraphQL)͢ΔͷʹมΘΓͳ͠ʢWebSocketͷ͜ͱ͍ͬͨΜΕΖʣ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S ingle P age A pplication • ࠷ۙͷWebΞϓϦʹଟ͍ • AjaxͰσʔλΛऔಘͯ͠දࣔ
• νϡʔτϦΞϧೖॻ ͍͍ͩͨ͜ΕΛ࡞Δ͜ͱ͕ଟ͍ https://ja.reactjs.org/ #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
ReactͰͷ REST API import React, {useEffect, useState } from 'react'
import DOMPurify from 'dompurify'; export const Home:FC<{ posts: WPPost[] }> = ({posts: initialProps}) => { const [posts, setPosts] = useState([]) useEffect(() => { fetch('https://wp.example.com/wp-json/wp/v2/posts') .then(data => { return data.json() }) .then(data => { setPosts(data) }) }) return ( <div> {posts.map(post => ( <div key={post.ID}> <h1 dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.title.rendered) }}/> <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(post.excerpt.rendered) }}/> </div> ))} </div> ) • APIͳͲඇಉظॲཧ Ұखؒඞཁ • useEffectͰAPIݺͼग़͠ • useStateͰϨεϙϯεอ࣋ • ͋ͱReact JSXͰHTMLඳը #WPmeetupOsaka
SPAͰWebαΠτΛ࡞Δ • ೖ͍͢͠ • ॻ੶ͳͲͷϦιʔεଟΊ • શ෦ϑϩϯτͰ࣮ߦͳͷͰ ൺֱతγϯϓϧʹ࡞ΕΔ • CapacitorͳͲͰiOS
/ AndroidରԠ ϝϦοτ • SEO / OGPͰҰखؒඞཁ • ϧʔςΟϯά͋Δఔࣗલ࣮ • First Meaningful Paint͕Ί • ίʔυׂ͠ͳ͍ͱ JSͷಡΈࠐΈαΠζ͕ංେ͕ͪ͠ σϝϦοτ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S tatic S ite G enerator • JekyllHugoͳͲ • දࣔ͢ΔHTMLΛࣄલʹੜ͢Δ
• MovableTypeͷGenerate͍ۙ • FW / Tool͕܈༤ׂڌঢ়ଶ Vue / React + Ruby / Go / etc… https://jamstack.org/generators/ #WPmeetupOsaka
ReactͰͷSSG 2TOP: Next.js / Gatsby
SSGͰWebαΠτΛ࡞Δ • ࣄલʹHTMLΛϏϧυ͢ΔͷͰɺ ද͕ࣔ͘ͳΓ͍͢ • WP / DBʹো͕ى͖ͯɺ webαΠτμϯ͠ͳ͍ •
αʔόʔ͕҆Ձ • FWͷػೳ / API͕๛ ϝϦοτ • Ϗϧυ͠ͳ͍ͱެ։Ͱ͖ͳ͍ • ϖʔδʹൺྫ͢ΔϏϧυ࣌ؒ • FWͷґଘ͕ڧ͘ͳΓ͕ͪ • Ϗϧυͷσόοά͕গ͠େม σϝϦοτ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
S erver S ide R endering • WordPressςʔϚͱಉ͡ख๏ • HTMLඳըͳͷͰɺ
ϏϧυΛͭඞཁͳ͠ • αʔόʔଆඳըͳͷͰɺ SEO / OGPͷෆ҆ͳ͠ • WPಛԽFW “Frontity”ͷଘࡏ https://frontity.org/ #WPmeetupOsaka
FrontityͰ WebαΠτ # ΞϓϦͷηοτΞοϓ $ npx frontity create my-app $
cd my-app # ϩʔΧϧͰͷςεταΠτ্ཱͪ͛ $ npx frontity dev -> http://localhost:3000 # σΟϨΫτϦߏ $ tree my-app/ |__ node_modules/ |__ package.json |__ frontity.settings.js |__ favicon.ico |__ packages/ |__ mars-theme/ • جຊతͳૢ࡞CLI͚ͩ • —themeͰςʔϚ͕બΔ • —typescriptαϙʔτ #WPmeetupOsaka
FrontityͰ WebαΠτ "name": "frontity-example", "state": { "frontity": { "url": "https://test.frontity.io",
"title": "WordPress Theme Unittest", "description": "Frontity example site using WordPress Theme Unittest posts" } }, "packages": [ { "name": "@frontity/mars-theme", "state": { "theme": { "menu": [ [ “Home", “/“ ], [ "Edge Case Category”, “/category/edge-case-2/“ ], [ “About”, “/about/“ ] ], "featured": { "showOnList": false, "showOnPost": false } } } }, { "name": "@frontity/wp-source", "state": { "source": { "api": "https://test.frontity.io/wp-json" } } }, • frontity.config.jsͰઃఆ • WPςʔϚͷΑ͏ʹ ίʔυΛ৮Βͤͳ͍ ΧελϚΠζํ๏ • ςʔϚͷࣗ࡞ / ެ։Մೳ #WPmeetupOsaka
S erver S ide R endering • WordPressςʔϚͱಉ͡ख๏ • HTMLඳըͳͷͰɺ
ϏϧυΛͭඞཁͳ͠ • αʔόʔଆඳըͳͷͰɺ SEO / OGPͷෆ҆ͳ͠ • WPಛԽFW “Frontity”ͷଘࡏ https://frontity.org/ #WPmeetupOsaka
FrontityͰ WebαΠτ • VercelHerokuͳͲʹ ެ։ • Node.js͕ಈ͘ඞཁ͋Γ • WPͷαʔόʔʹಉډ https://frontity.org/
SSRͰWebαΠτΛ࡞Δ • SSGͱSPAͷܽΛิ͑Δ • SEO / OGP / HeaderͳͲͷग़ྗ •
ϏϧυʹΑΔެ։·Ͱͷϥά • Ruby / Go / PythonͳͲͰՄೳ ϝϦοτ • ʮWordPressςʔϚͰΑ͘Ͷʁʯ • WPಉ༷ࣄނΕനը໘ͷHTTP500 • ϑϩϯτͷJS + αʔόʔͷJSͷ ೋॏཧ͕ൃੜ͠͏Δ σϝϦοτ #WPmeetupOsaka
SPA / SSG / SSR͓͞Β͍ 41" 44( 443 )5.-ඳը ϒϥβ্
Ϗϧυ࣌ ʢ$*ϩʔΧϧͳͲʣ αʔόʔ্ '8ͳͲ *POJD3FBDU $SFBUF3FBDU"QQ /FYUKT (BUTCZ 'SPOUJUZ XJUI81ͷ αΠτߏங ʮͬͯΈͨʯهࣄ ॻ੶ͳͲΛࢀߟʹ '8ͷνϡʔτϦΞϧ Λࢀߟʹ '8ͷνϡʔτϦΞϧ Λࢀߟʹ ͍͍ͯΔέʔε 8FCΞϓϦ ձһ͚αΠτ ϒϩάϙʔτϑΥϦΦ -1ΩϟϯϖʔϯαΠτ ͦΕҎ֎ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby.js • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
ReactͰͷSSG 2TOP: Next.js / Gatsby
ReactͰͷSSG 2TOP: Next.js / Gatsby /FYUKT (BUTCZ 3FOEFSJOH 44(443 44(
3PVUJOH OFYUSPVUFS !SFBDISPVUFS 0⒏DJBM )PTUJOH 7FSDFM (BUTCZ$MPVE %BUB 3FRVFTU 3&45"1*(SBQI2- (SBQI2-
Next.js / Gatsbyݸਓతൺֱ • σʔλͷऔಘ͕ࣗલ࣮ • SSRซ༻Ͱެ։·ͰͷϥάΛॖ • SSGߴԽ3rd partyґଘ
• SSRՄೳɻ෯͑͘Δ Next.js • ϓϥάΠϯͰ؆୯σʔλऔಘ • ϏϧυඞਢͳͷͰެ։ʹϥά༗ • ࠩϏϧυʹΑΔϏϧυߴԽ • SSGʹಛԽ Gatsby #WPmeetupOsaka
Next.js / Gatsbyʹڞ௨͍ͯ͠Δ͜ͱ ࣗࣾαʔϏε͋Γ͖ͷ ػೳ͕ͨ·ʹؚ·ΕΔ ͍͍ͦͯͩͨ͠୭͔ʹʮNetlify൛ʯΛޙൃͰग़͞ΕΔ #WPmeetupOsaka
Next.jsͱGatsbyͷσʔλऔಘ export const getStaticPaths = async () => { const
posts = await fetcher(url) return { paths: posts.map(post => ({ params: { id: post.id, slug: decodeURI(post.slug) } })), fallback: false } } export const pageQuery = graphql` query SinglePost($slug: String) { wordpressPost(slug: { eq: $slug }) { id slug title content } } ` Next.js Gatsby #WPmeetupOsaka
ࣗͰࢼͯ͠Έ͍ͨਓShifterϒϩά https://www.getshifter.io/ja/blog/category/integration-ja/ #WPmeetupOsaka
SSGͷϏϧυԆ • GatsbyʮࠩͷΈϏϧυ͢Δํ๏ʯΛϕʔλϦϦʔε Incremental Builds: https://www.gatsbyjs.com/blog/2020-04-22-announcing-incremental-builds/ • Next.jsʮͳ͍ͳΒͦͷͰSSG / SSR͠Α͏ʯͱ͍͏ൃ
Fallback mode: https://nextjs.org/docs/basic-features/data-fetching#fallback-true • Next.js͞ΒʹʮఆظతʹཪଆͰSSG͠ͳ͓ͦ͏ʯͱߟ͍͑ͯΔ Incremental Static Regeneration: https://nextjs.org/docs/basic-features/data-fetching#incremental-static-regeneration • GatsbyϏϧυΛߴԽɺNext.jsSSRతൃΛซ༻ͯ͠ߴԽ #WPmeetupOsaka
Agenda • WordPressΛHeadlessʹ͏ͨΊʹඞཁͳͷ • SPAͰ࡞Δํ๏ • SSGͰ࡞Δํ๏ • SSRͰ࡞Δํ๏ •
Next.js ͱ Gatsby.js • All In One Content Management System͔Βͷ٫ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
ಠࣗλάͷ࡞ / ར༻ͰϚʔΫΞοϓͷڞ௨Խ … <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body <?php
body_class(); ?> <div class="jumbotron"> <h1>Hello, world!</h1> <p> <a class="btn btn-primary btn-lg” role="button">Learn more</a> </p> </div> <div class="row"> <div class="col-md-1">.col-md-1</div> <div class="col-md-1">.col-md-1</div> </div> import React from 'react'; import { Jumbotron, Button, Row, Col } from 'reactstrap'; export const App: FC = () => ( <> <Jumbotron> <h1>Hello, world!</h1> <p className=“lead”> <Button color="primary">Learn More</Button> </p> </Jumbotron> <Row> <Col md={1}>.col</Col> </Row> </> ) WordPress Theme React (Reactstrap) #WPmeetupOsaka
ެ։͞Ε͍ͯΔUIϑϨʔϜϫʔΫͷಋೖ / ެ։ • Bootstrap / Material Design / Foundation
/ etc.. • ଟ͘ͷCSSϑϨʔϜϫʔΫ͍͍ͩͨReactnize͞Εͨͷ͕͋Δ • reactstrap / material-ui / react-foundation / etc.. • Ionic FrameworkͷΑ͏ʹReact / Angular / VueΛԣஅͰ͖Δͷ • AWS NorthstarͷΑ͏ʹɺ σβΠϯΨΠυϥΠϯΛϥΠϒϥϦԽͯ͠γΣΞ͕Ͱ͖Δ #WPmeetupOsaka
JavaScriptͰϑϩϯτΤϯυΛͳͥ࡞Δʁ • ։ൃڥɾެ։αʔόʔͷ༻ҙָ͕ • োΞΫηεूதʹର͢Δڧ্͕͕Γ͍͢ • ڞ༗Մೳͳίϯϙʔωϯτ͕࡞ΕΔ / ར༻Ͱ͖Δ •
ʮ࠶ར༻ੑͷߴ͍ٕज़ɾϊϋʯ͕ͨ·Γ͍͢ #WPmeetupOsaka
σʔλͱ ϑϩϯτͷ • HeadlessԽ͢Δ͜ͱͰɺ CMSґଘগͷϑϩϯτ͕࡞ΕΔ • GatsbySource PluginͰ ෳdata source͕ར༻Մೳ
• dataʹґଘ͠ͳ͍ϑϩϯτٕज़ ͱͯ͠ͷJavaScript https://www.gatsbyjs.com/plugins?=source #WPmeetupOsaka
TL;DR • Headlessʹ͢Δ͜ͱͰɺ ͞·͟·ͳํ๏ / ݴޠ / FWͰαΠτ͕࡞ΕΔ • ReactΛ͏߹ɺNext.js
/ GatsbyͳͲΛ͏ͷ͕ ͍·ͷͱ͜ΖఆੴԽͭͭ͋͠Δ • WordPress͚ͩͰαΠτΛ։ൃ / ӡ༻͍ͯ͠ͳ͍߹ʹɺ ڥʹґଘ͠ͳ͍Headless͕׆͖͍͢ #WPmeetupOsaka