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
440
0
Share
Go headless but don't lose your head
Use NextJS+Headless Silverstripe CMS. Talk at Virtual StripeCon Europe 2020
Andy Adiwidjaja
September 24, 2020
More Decks by Andy Adiwidjaja
See All by Andy Adiwidjaja
Printing with Puphpeteer
adiwidjaja
0
510
Other Decks in Technology
See All in Technology
AI-Assisted Contributions and Maintainer Load - PyCon US 2026
pauloxnet
1
190
Cortex(Code) を ML モデルの 精度改善サイクルに組み込む.pdf
oimo23
0
250
SpeechTranscriber + AIによる文字起こし機能
kazuki1220
0
120
DI コンテナ自動生成ツールを実装してみた / intro-autodi
uhzz
0
710
パーソルキャリア IT/テクノロジー職向け 会社紹介資料|Company Introduction Deck
techtekt
PRO
0
240
AI飲み会幹事エージェントを作っただけなのに
ykimi
0
240
React Compiler導入の効果と運用の工夫
kakehashi
PRO
3
300
Fラン学生が考える、AI時代のデザインに執着した突破口
husengs7
1
230
Purview 勉強会報告 Microsoft Purview 入門しようとしてみた
masakichixo
1
470
[みん強]AIの価値を最大化するデータ基盤戦略:Self-Service型Data Meshへの転換とAgentic AI Meshに向けた取り組み with Snowflake他
y_matsubara
1
160
コーディングエージェントはTypeScriptの 型エラーをどう自己修正しているのか
melonps
2
240
エムスリーテクノロジーズ株式会社 エンジニア向け紹介資料 / M3 Technologies Company Deck
m3_engineering
0
200
Featured
See All Featured
Docker and Python
trallard
47
3.8k
The untapped power of vector embeddings
frankvandijk
2
1.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Typedesign – Prime Four
hannesfritz
42
3k
[SF Ruby Conf 2025] Rails X
palkan
2
1k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A designer walks into a library…
pauljervisheath
211
24k
Navigating Weather and Climate Data
rabernat
0
190
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
Designing for Performance
lara
611
70k
Mind Mapping
helmedeiros
PRO
1
190
sira's awesome portfolio website redesign presentation
elsirapls
0
250
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