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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
730
コミュニティ運営から 中の人に変わって感じたこと
hideokamoto
0
160
Developerが Developer Advocateになった話 / dev-rel-meetup-tokyo-71
hideokamoto
0
400
Jamstack開発者のための App Runner入門
hideokamoto
1
560
WordPressでの webサイト制作2022 / ngk2022s
hideokamoto
0
500
JavaScript(TypeScript)で メディアサイトを インフラから構築する方法 / jsconf-jp-2021
hideokamoto
2
4.5k
AWS上でStripeを利用したアプリをより安全にデプロイする方法 /jaws-pankration-2021
hideokamoto
1
260
Shifter Headlessと Headless WordPressの紹介
hideokamoto
0
2.3k
Stripe & Next.js + AWS Amplify で会員 + 定期課金機能 / JP_Stripes20210903
hideokamoto
7
3.3k
Other Decks in Programming
See All in Programming
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
JIS keyboard support in Omarchy
lef237
0
110
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
540
SREの越境 / SRE Collaboration
y0hgi
2
310
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Navigating Team Friction
lara
192
16k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
370
Paper Plane
katiecoart
PRO
5
54k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
A better future with KSS
kneath
240
18k
sira's awesome portfolio website redesign presentation
elsirapls
0
450
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Technical Leadership for Architectural Decision Making
baasie
3
600
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
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