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
AI駆動開発の実践とその未来
eltociear
2
500
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
21
8.3k
モダンデータスタックの理想と現実の間で~1.3億人Vポイントデータ基盤の現在地とこれから~
taromatsui_cccmkhd
2
270
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.1k
「もしもデータ基盤開発で『強くてニューゲーム』ができたなら今の僕はどんなデータ基盤を作っただろう」
aeonpeople
0
250
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
9.9k
Connection-based OAuthから学ぶOAuth for AI Agents
flatt_security
0
400
AWSに革命を起こすかもしれない新サービス・アップデートについてのお話
yama3133
0
510
日本Rubyの会: これまでとこれから
snoozer05
PRO
6
250
通勤手当申請チェックエージェント開発のリアル
whisaiyo
3
490
AWSの新機能をフル活用した「re:Inventエージェント」開発秘話
minorun365
2
470
ハッカソンから社内プロダクトへ AIエージェント ko☆shi 開発で学んだ4つの重要要素
leveragestech
0
260
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
200
The Limits of Empathy - UXLibs8
cassininazir
1
190
Mobile First: as difficult as doing things right
swwweet
225
10k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
38
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
[SF Ruby Conf 2025] Rails X
palkan
0
640
The SEO Collaboration Effect
kristinabergwall1
0
310
Typedesign – Prime Four
hannesfritz
42
2.9k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
Crafting Experiences
bethany
0
22
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
0
190
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