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
680
コミュニティ運営から 中の人に変わって感じたこと
hideokamoto
0
140
Developerが Developer Advocateになった話 / dev-rel-meetup-tokyo-71
hideokamoto
0
380
Jamstack開発者のための App Runner入門
hideokamoto
1
540
WordPressでの webサイト制作2022 / ngk2022s
hideokamoto
0
490
JavaScript(TypeScript)で メディアサイトを インフラから構築する方法 / jsconf-jp-2021
hideokamoto
2
4.4k
AWS上でStripeを利用したアプリをより安全にデプロイする方法 /jaws-pankration-2021
hideokamoto
1
240
Shifter Headlessと Headless WordPressの紹介
hideokamoto
0
2.1k
Stripe & Next.js + AWS Amplify で会員 + 定期課金機能 / JP_Stripes20210903
hideokamoto
7
3.3k
Other Decks in Programming
See All in Programming
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
470
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.8k
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
140
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.6k
Modding RubyKaigi for Myself
yui_knk
0
900
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
110
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
110
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
450
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
360
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
Everyday Curiosity
cassininazir
0
220
Game over? The fight for quality and originality in the time of robots
wayneb77
1
190
Navigating Weather and Climate Data
rabernat
0
210
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Between Models and Reality
mayunak
4
330
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