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
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
690
コミュニティ運営から 中の人に変わって感じたこと
hideokamoto
0
140
Developerが Developer Advocateになった話 / dev-rel-meetup-tokyo-71
hideokamoto
0
380
Jamstack開発者のための App Runner入門
hideokamoto
1
550
WordPressでの webサイト制作2022 / ngk2022s
hideokamoto
0
490
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
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
630
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
180
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
340
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.4k
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
120
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
どこまでゆるくて許されるのか
tk3fftk
0
300
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
4
600
symfony/aiとlaravel/boost
77web
0
110
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
460
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
190
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Odyssey Design
rkendrick25
PRO
2
720
The SEO identity crisis: Don't let AI make you average
varn
0
510
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
400
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
30 Presentation Tips
portentint
PRO
1
340
So, you think you're a good person
axbom
PRO
2
2.1k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Writing Fast Ruby
sferik
630
63k
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