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
Go headless but don't lose your head
Search
Andy Adiwidjaja
September 24, 2020
Technology
0
420
Go headless but don't lose your head
Use NextJS+Headless Silverstripe CMS. Talk at Virtual StripeCon Europe 2020
Andy Adiwidjaja
September 24, 2020
Tweet
Share
More Decks by Andy Adiwidjaja
See All by Andy Adiwidjaja
Printing with Puphpeteer
adiwidjaja
0
510
Other Decks in Technology
See All in Technology
Kiro IDEのドキュメントを全部読んだので地味だけどちょっと嬉しい機能を紹介する
khmoryz
0
210
Claude_CodeでSEOを最適化する_AI_Ops_Community_Vol.2__マーケティングx_AIはここまで進化した.pdf
riku_423
2
610
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
5
810
Greatest Disaster Hits in Web Performance
guaca
0
280
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
390
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
110
SRE Enabling戦記 - 急成長する組織にSREを浸透させる戦いの歴史
markie1009
0
160
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.6k
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
740
Red Hat OpenStack Services on OpenShift
tamemiya
0
130
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
840
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
120
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
450
My Coaching Mixtape
mlcsv
0
49
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
160
Designing Powerful Visuals for Engaging Learning
tmiket
0
240
Code Reviewing Like a Champion
maltzj
527
40k
Practical Orchestrator
shlominoach
191
11k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Typedesign – Prime Four
hannesfritz
42
2.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.6k
Facilitating Awesome Meetings
lara
57
6.8k
Transcript
Go headless, but don’t lose your head Andy Adiwidjaja Virtual
StripeCon Europe, 24.09.2020
Headless is here to stay and Silverstripe CMS is the
best open source solution
Overview Why SSR? Should I care? Why headless Silverstripe CMS?
How can I start?
Why SSR? Should I care? Is it worth it?
Me - had projects as a NextJS developer - was
forced to work with strange backends - would like to use Silverstripe CMS - launches own projects with NextJS+SilverstripeCMS
Going SSR Disadvantages of Single Page Apps: - SEO -
Browser history - Time to first render Solutions: - Server-side-rendering - Static generators (Graphic: microsoft.com)
Yeah, right Stacey Trooster StripeCon EU 2019
Headless CMS, React, SSR? 2001 2003 Plain PHP, Templating with
Smarty 2010 CMS, SASS, JQuery, Ajax 2015 CMS/Framework, SASS, React / Angular 2020 Plain HTML, Dreamweaver Templates
Demo https://kulturellebildung-sh.de/ Loads pages as XHR Loads HTML on Reload
Works without JavaScript!
NextJS getStaticProps getStaticPaths: - Fetch data at Build time New:
“static can also be dynamic” - getStaticProps can revalidate - getStaticPaths can have fallback getServerSideProps: - Fetch data on each request
NextJS SSR
NextJS dynamic pages Default NextJS logic: pages in /pages folder.
Former solution: Custom server.js rewriting to /pages/index.tsx Now: /pages/[[...page]].tsx
So, why Silverstripe CMS as headless CMS?
Headless CMS Criteria: Simple setup Mostly config Low maintenance Frontend-independent,
but: Pages Page elements Navigation Custom Data Hosted CMS (examples): Contentful Kentico GraphCMS Expensive, Limitations. Self-hosted CMS: Strange new players, all old players with APIs
Silverstripe CMS - dev/build - Pages with Elemental - ModelAdmin
- Backend functionality - Backend integration! Basic admin interfaces are a matter of configuration, but configuration in code! Strength of Silverstripe: Create solutions! class Actor extends DataObject { private static $db = [ “Name” => “Varchar(255) ]; } class ActorAdmin extends ModelAdmin { private static $managed_models = [ Actor::class, ]; private static $url_segment=”actor”; private static $menu_title=”Actors”; }
Example: DBRD React Frontend Headless Silverstripe CMS Sync with MS
Dynamics 365 (SOAP) ModelAdmin for Control No pages, assets etc. Easy to map models in and out
How? https://github.com/adiwidjaja/silverstripe-nextjs-starter Demo - Elements - Preview - RedirectorPage
File structure .storybook Storybook config backend Silverstripe CMS pages NextJS
pages public NextJS static files src JavaScript code No templates!
Setup > git clone
[email protected]
:adiwidjaja/ silverstripe-nextjs-starter.git demo > cd demo
> vi .env # Configuration > cd backend && composer install # PHP dependencies > cd .. > yarn # JS dependencies > yarn dev # Dev server
JavaScript Stack - NextJS - React - Typescript - Styled-components
- Storybook const FaqElementStyled = styled.div``; const TextContent = styled.div` display: ${props => (props.visible ? 'block' : 'none')}; `; const FaqElement = ({ title, text, }) => { const [open, setOpen] = useState(false); return ( <FaqElementStyled> <h1 onClick={() => setOpen(!open)}>{title}</h1> <TextContent visible={open}>{text}</TextContent> </FaqElementStyled> ); };
Config .env
Backend: Models Page TextElement FAQElement - Title - Description -
Image - Text
GraphQL - Route - Page - Fields - readOne op
with Resolver - nestedQueries - Elements - Menu - Children
Backend: Resolver
GraphiQL Your single most important tool Working with GraphQL. composer
require --dev silverstripe/ Graphql-devtools Demo
Client: GraphQL /src/utils/api.ts Called by getServerSideProps
Tricks BaseElementalExtension: - getContentFields: Waiting for GraphQL 4 Page: -
FrontendLink - Menu - PreviewLink Cannot use LinkOrSection, as Director::get_curr_page() uses Controller::curr(), which is not available.
Hosting - Silverstripe CMS: Standard - Javascript: Start with pm2
- NGinx: - /api: Rewrite to Silverstripe public folder - /: Proxy to Javascript-Server location ^~ /api { alias [...]/demo/backend/public; try_files $uri $uri/ @silverstripe; [...] } location @silverstripe { rewrite /api/(.*)$ /api/index.php?$1 last; } location ~ ^/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost:3000; } > yarn && yarn build > pm2 start yarn --interpreter bash --name app -- start > pm2 restart app
Conclusion SSR is no silver bullet Headless is here to
stay SSR+Headless Silverstripe CMS is easy to setup I would like to see a positioning for Silverstripe CMS as a headless CMS.
Thank you! I’m happy to speak with you about Headless+SSR.
Or anything else. Andy Adiwidjaja EMail:
[email protected]
Illustrations: Maria Müller-Leinweber https://www.mamuelei.de