SlideShare ist ein Scribd-Unternehmen logo
1 von 22
React Suspense, not just
for Alfred Hitchcock
Maurice de Beijer
@mauricedb
Maurice de Beijer
• The Problem Solver
• Microsoft MVP
• Freelance developer/instructor
• @mauricedb
• http://www.TheProblemSolver.nl
• maurice.de.beijer@gmail.com
2© ABL - The Problem Solver
Agenda
Available Now
• Suspense component
• Lazy loading components
• Data fetching
• Strict mode
Available in the Future
• Concurrent Rendering
• Transitions using useTransition()
• Orchestrating suspense with
<SuspenseList />
3© ABL - The Problem Solver
<Suspense />
4© ABL - The Problem Solver
<Suspense />
• Suspend rendering when one or more of
the child components is not ready
• Display a fallback component instead
5© ABL - The Problem Solver
React.lazy()
6© ABL - The Problem Solver
React.lazy()
• Dynamic import React component
• Suspends rendering the closest
<Suspense> component
• Automatic code splitting
• Not available for server-side rendering at
the moment
7© ABL - The Problem Solver
Data Fetching
8© ABL - The Problem Solver
Resource Manager
• Load asynchronous data
• Suspends rendering the closest
<Suspense> component
• Note: Throw a promise to suspend!
• See this gist from Ryan Florence
9© ABL - The Problem Solver
AJAX Resource
© ABL - The Problem Solver 10
AJAX Resource
• A resource using fetch() to load some
data
11© ABL - The Problem Solver
Fetching the resource
• Fetching asynchronous data
• Suspends rendering the closest
<Suspense> component if not ready
• Use an <ErrorBoundary> to handle
errors
12© ABL - The Problem Solver
<StrictMode />
13© ABL - The Problem Solver
<StrictMode />
• Find potential problems with concurrent
rendering without actually doing so
• Warns about:
• Unsafe lifecycle methods
• Deprecated findDOMNode() usage
• legacy string ref API usage
• Legacy context API
• Tries to detect unexpected side effects
• Note: development mode only, no
runtime overhead
14© ABL - The Problem Solver
15© ABL - The Problem Solver
Concurrent Rendering
16© ABL - The Problem Solver
Concurrent Rendering
• Changes how React renders your
components
• The render phase is split into chunks and
can be interrupted/aborted and restarted
• The commit phase is still atomic
• No partial screen updates
• Note: Blocking Mode is a migration step
17© ABL - The Problem Solver
React.useTransition()
18© ABL - The Problem Solver
React.useTransition()
• Transition between application states in a
more controlled manner
19© ABL - The Problem Solver
<SuspenseList />
20© ABL - The Problem Solver
<SuspenseList />
• Control how multiple <Suspense>
boundaries are rendered
• For example:
• Prevents multiple loading indicators at the
same time
21© ABL - The Problem Solver
22© ABL - The Problem Solver

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Manage your environment with DSC
Manage your environment with DSCManage your environment with DSC
Manage your environment with DSC
 
Developing Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's GuideDeveloping Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's Guide
 
Introduction to React, Flux, and Isomorphic Apps
Introduction to React, Flux, and Isomorphic AppsIntroduction to React, Flux, and Isomorphic Apps
Introduction to React, Flux, and Isomorphic Apps
 
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
You don’t need DTAP + Backbase implementation - Amsterdam 17-12-2015
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016React on rails v6.1 at LA Ruby, November 2016
React on rails v6.1 at LA Ruby, November 2016
 
React.js for Rails Developers
React.js for Rails DevelopersReact.js for Rails Developers
React.js for Rails Developers
 
Descarga wamp server
Descarga wamp serverDescarga wamp server
Descarga wamp server
 
Synthetic web performance testing with Selenium
Synthetic web performance testing with SeleniumSynthetic web performance testing with Selenium
Synthetic web performance testing with Selenium
 
Client side production monitoring using - SyncApp Tool
Client side production monitoring using - SyncApp ToolClient side production monitoring using - SyncApp Tool
Client side production monitoring using - SyncApp Tool
 
Bluemix - Deploying a Java Web Application
Bluemix - Deploying a Java Web ApplicationBluemix - Deploying a Java Web Application
Bluemix - Deploying a Java Web Application
 
Test eng-meetup-taki take
Test eng-meetup-taki takeTest eng-meetup-taki take
Test eng-meetup-taki take
 
Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)
 
Reactive programming intro
Reactive programming introReactive programming intro
Reactive programming intro
 
stackconf 2020 | Real Continuous Deployment of JVM applications by Nicolas Fr...
stackconf 2020 | Real Continuous Deployment of JVM applications by Nicolas Fr...stackconf 2020 | Real Continuous Deployment of JVM applications by Nicolas Fr...
stackconf 2020 | Real Continuous Deployment of JVM applications by Nicolas Fr...
 
Plugins: A double-edged sword
Plugins: A double-edged swordPlugins: A double-edged sword
Plugins: A double-edged sword
 
Programming Sessions KU Leuven - Session 03
Programming Sessions KU Leuven - Session 03Programming Sessions KU Leuven - Session 03
Programming Sessions KU Leuven - Session 03
 
Async Server Rendering in React+Redux at NYTimes (redux-taxi)
Async Server Rendering in React+Redux at NYTimes (redux-taxi)Async Server Rendering in React+Redux at NYTimes (redux-taxi)
Async Server Rendering in React+Redux at NYTimes (redux-taxi)
 
Real Time with Rails 5
Real Time with Rails 5Real Time with Rails 5
Real Time with Rails 5
 
Ramaze
RamazeRamaze
Ramaze
 

Ähnlich wie React suspense, not just for Alfred Hitchcock

Ähnlich wie React suspense, not just for Alfred Hitchcock (20)

The new React
The new React The new React
The new React
 
Better React state management with Redux
Better React state management with ReduxBetter React state management with Redux
Better React state management with Redux
 
Building high-performance web applications with Preact
Building high-performance web applications with PreactBuilding high-performance web applications with Preact
Building high-performance web applications with Preact
 
Building reliable applications with React, C#, and Azure
Building reliable applications with React, C#, and AzureBuilding reliable applications with React, C#, and Azure
Building reliable applications with React, C#, and Azure
 
Double Sync Replication
Double Sync ReplicationDouble Sync Replication
Double Sync Replication
 
Web Performance & Latest in React
Web Performance & Latest in ReactWeb Performance & Latest in React
Web Performance & Latest in React
 
Building large and scalable mission critical applications with React
Building large and scalable mission critical applications with ReactBuilding large and scalable mission critical applications with React
Building large and scalable mission critical applications with React
 
Building Reliable Applications Using React, .NET & Azure
Building Reliable Applications Using React, .NET & AzureBuilding Reliable Applications Using React, .NET & Azure
Building Reliable Applications Using React, .NET & Azure
 
Why I am hooked on the future of React
Why I am hooked on the future of ReactWhy I am hooked on the future of React
Why I am hooked on the future of React
 
Enterprise Drupal Application & Hosting Infrastructure Level Monitoring
Enterprise Drupal Application & Hosting Infrastructure Level MonitoringEnterprise Drupal Application & Hosting Infrastructure Level Monitoring
Enterprise Drupal Application & Hosting Infrastructure Level Monitoring
 
React Tech Salon
React Tech SalonReact Tech Salon
React Tech Salon
 
Why I am hooked on the future of React
Why I am hooked on the future of ReactWhy I am hooked on the future of React
Why I am hooked on the future of React
 
MidwestJS 2014 Reconciling ReactJS as a View Layer Replacement
MidwestJS 2014 Reconciling ReactJS as a View Layer ReplacementMidwestJS 2014 Reconciling ReactJS as a View Layer Replacement
MidwestJS 2014 Reconciling ReactJS as a View Layer Replacement
 
Reconciling ReactJS as a View Layer Replacement (MidwestJS 2014)
Reconciling ReactJS as a View Layer Replacement (MidwestJS 2014)Reconciling ReactJS as a View Layer Replacement (MidwestJS 2014)
Reconciling ReactJS as a View Layer Replacement (MidwestJS 2014)
 
I am hooked on React
I am hooked on ReactI am hooked on React
I am hooked on React
 
Continuous Deployment of your Application @SpringOne
Continuous Deployment of your Application @SpringOneContinuous Deployment of your Application @SpringOne
Continuous Deployment of your Application @SpringOne
 
Microservices: The Best Practices
Microservices: The Best PracticesMicroservices: The Best Practices
Microservices: The Best Practices
 
What is the merge window?
What is the merge window?What is the merge window?
What is the merge window?
 
Optimizing React Native views for pre-animation
Optimizing React Native views for pre-animationOptimizing React Native views for pre-animation
Optimizing React Native views for pre-animation
 
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
Debugging,Troubleshooting & Monitoring Distributed Web & Cloud Applications a...
 

Mehr von Maurice De Beijer [MVP]

Mehr von Maurice De Beijer [MVP] (20)

Practice TypeScript Techniques Building React Server Components App
Practice TypeScript Techniques Building React Server Components AppPractice TypeScript Techniques Building React Server Components App
Practice TypeScript Techniques Building React Server Components App
 
A foolproof Way to Estimate a Software Project
A foolproof Way to Estimate a Software ProjectA foolproof Way to Estimate a Software Project
A foolproof Way to Estimate a Software Project
 
Surati Tech Talks 2022 / Build reliable Svelte applications using Cypress
Surati Tech Talks 2022 / Build reliable Svelte applications using CypressSurati Tech Talks 2022 / Build reliable Svelte applications using Cypress
Surati Tech Talks 2022 / Build reliable Svelte applications using Cypress
 
Build reliable Svelte applications using Cypress
Build reliable Svelte applications using CypressBuild reliable Svelte applications using Cypress
Build reliable Svelte applications using Cypress
 
Building Reliable Applications Using React, .NET & Azure
Building Reliable Applications Using React, .NET & AzureBuilding Reliable Applications Using React, .NET & Azure
Building Reliable Applications Using React, .NET & Azure
 
Concurrent Rendering Adventures in React 18
Concurrent Rendering Adventures in React 18Concurrent Rendering Adventures in React 18
Concurrent Rendering Adventures in React 18
 
Why I am hooked on the future of React
Why I am hooked on the future of ReactWhy I am hooked on the future of React
Why I am hooked on the future of React
 
Building reliable web applications using Cypress
Building reliable web applications using CypressBuilding reliable web applications using Cypress
Building reliable web applications using Cypress
 
Getting started with React Suspense and concurrent rendering
Getting started with React Suspense and concurrent renderingGetting started with React Suspense and concurrent rendering
Getting started with React Suspense and concurrent rendering
 
From zero to hero with the Reactive extensions for JavaScript
From zero to hero with the Reactive extensions for JavaScriptFrom zero to hero with the Reactive extensions for JavaScript
From zero to hero with the Reactive extensions for JavaScript
 
From zero to hero with the reactive extensions for JavaScript
From zero to hero with the reactive extensions for JavaScriptFrom zero to hero with the reactive extensions for JavaScript
From zero to hero with the reactive extensions for JavaScript
 
Create flexible React applications using GraphQL apis
Create flexible React applications using GraphQL apisCreate flexible React applications using GraphQL apis
Create flexible React applications using GraphQL apis
 
Create flexible react applications using GraphQL API's
Create flexible react applications using GraphQL API'sCreate flexible react applications using GraphQL API's
Create flexible react applications using GraphQL API's
 
Docker for a .NET web developer
Docker for a .NET web developerDocker for a .NET web developer
Docker for a .NET web developer
 
From zero to hero with the reactive extensions for JavaScript
From zero to hero with the reactive extensions for JavaScriptFrom zero to hero with the reactive extensions for JavaScript
From zero to hero with the reactive extensions for JavaScript
 
The productive developer guide to React
The productive developer guide to ReactThe productive developer guide to React
The productive developer guide to React
 
Docker containers on Windows
Docker containers on WindowsDocker containers on Windows
Docker containers on Windows
 
From zero to hero with the reactive extensions for java script
From zero to hero with the reactive extensions for java scriptFrom zero to hero with the reactive extensions for java script
From zero to hero with the reactive extensions for java script
 
Tooling for the productive front end developer
Tooling for the productive front end developerTooling for the productive front end developer
Tooling for the productive front end developer
 
Building high performance web applications
Building high performance web applicationsBuilding high performance web applications
Building high performance web applications
 

Kürzlich hochgeladen

Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent GirlsMorbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
mountabuangels4u
 
sample sample sample sample sample sample
sample sample sample sample sample samplesample sample sample sample sample sample
sample sample sample sample sample sample
Casey Keith
 
Sample sample sample sample sample sample
Sample sample sample sample sample sampleSample sample sample sample sample sample
Sample sample sample sample sample sample
Casey Keith
 
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent GirlsMehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
mountabuangels4u
 
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
mountabuangels4u
 
Sample sample sample sample sample sample
Sample sample sample sample sample sampleSample sample sample sample sample sample
Sample sample sample sample sample sample
Casey Keith
 

Kürzlich hochgeladen (20)

Imphal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Imphal Call Girls 🥰 8617370543 Service Offer VIP Hot ModelImphal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Imphal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Krishnanagar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Krishnanagar Call Girls 🥰 8617370543 Service Offer VIP Hot ModelKrishnanagar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Krishnanagar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Alipurduar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Alipurduar Call Girls 🥰 8617370543 Service Offer VIP Hot ModelAlipurduar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Alipurduar Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Tehri Garhwal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Tehri Garhwal Call Girls 🥰 8617370543 Service Offer VIP Hot ModelTehri Garhwal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Tehri Garhwal Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Jalpaiguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Jalpaiguri Call Girls 🥰 8617370543 Service Offer VIP Hot ModelJalpaiguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Jalpaiguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent GirlsMorbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
Morbi Escort💋 Call Girl (Komal) Service #Morbi Call Girl @Independent Girls
 
Discover Mathura And Vrindavan A Spritual Journey.pdf
Discover Mathura And Vrindavan A Spritual Journey.pdfDiscover Mathura And Vrindavan A Spritual Journey.pdf
Discover Mathura And Vrindavan A Spritual Journey.pdf
 
sample sample sample sample sample sample
sample sample sample sample sample samplesample sample sample sample sample sample
sample sample sample sample sample sample
 
Abortion pills in Jeddah +966572737505 <> buy cytotec <> unwanted kit Saudi A...
Abortion pills in Jeddah +966572737505 <> buy cytotec <> unwanted kit Saudi A...Abortion pills in Jeddah +966572737505 <> buy cytotec <> unwanted kit Saudi A...
Abortion pills in Jeddah +966572737505 <> buy cytotec <> unwanted kit Saudi A...
 
Champawat Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Champawat Call Girls 🥰 8617370543 Service Offer VIP Hot ModelChampawat Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Champawat Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Sample sample sample sample sample sample
Sample sample sample sample sample sampleSample sample sample sample sample sample
Sample sample sample sample sample sample
 
TOURISM ATTRACTION IN LESOTHO 2024.Pptx.
TOURISM ATTRACTION IN LESOTHO 2024.Pptx.TOURISM ATTRACTION IN LESOTHO 2024.Pptx.
TOURISM ATTRACTION IN LESOTHO 2024.Pptx.
 
Daman Escorts 🥰 8617370543 Call Girls Offer VIP Hot Girls
Daman Escorts 🥰 8617370543 Call Girls Offer VIP Hot GirlsDaman Escorts 🥰 8617370543 Call Girls Offer VIP Hot Girls
Daman Escorts 🥰 8617370543 Call Girls Offer VIP Hot Girls
 
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent GirlsMehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
Mehsana Escort💋 Call Girl (Bindu) Service #Mehsana Call Girl @Independent Girls
 
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
Bhavnagar Escort💋 Call Girl (Komal) Service #Bhavnagar Call Girl @Independent...
 
Prayagraj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Prayagraj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelPrayagraj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Prayagraj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Howrah Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Howrah Call Girls 🥰 8617370543 Service Offer VIP Hot ModelHowrah Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Howrah Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Siliguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Siliguri Call Girls 🥰 8617370543 Service Offer VIP Hot ModelSiliguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Siliguri Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Sample sample sample sample sample sample
Sample sample sample sample sample sampleSample sample sample sample sample sample
Sample sample sample sample sample sample
 
A high-altitude adventure in the mountain kingdom
A high-altitude adventure in the mountain kingdomA high-altitude adventure in the mountain kingdom
A high-altitude adventure in the mountain kingdom
 

React suspense, not just for Alfred Hitchcock

  • 1. React Suspense, not just for Alfred Hitchcock Maurice de Beijer @mauricedb
  • 2. Maurice de Beijer • The Problem Solver • Microsoft MVP • Freelance developer/instructor • @mauricedb • http://www.TheProblemSolver.nl • maurice.de.beijer@gmail.com 2© ABL - The Problem Solver
  • 3. Agenda Available Now • Suspense component • Lazy loading components • Data fetching • Strict mode Available in the Future • Concurrent Rendering • Transitions using useTransition() • Orchestrating suspense with <SuspenseList /> 3© ABL - The Problem Solver
  • 4. <Suspense /> 4© ABL - The Problem Solver
  • 5. <Suspense /> • Suspend rendering when one or more of the child components is not ready • Display a fallback component instead 5© ABL - The Problem Solver
  • 6. React.lazy() 6© ABL - The Problem Solver
  • 7. React.lazy() • Dynamic import React component • Suspends rendering the closest <Suspense> component • Automatic code splitting • Not available for server-side rendering at the moment 7© ABL - The Problem Solver
  • 8. Data Fetching 8© ABL - The Problem Solver
  • 9. Resource Manager • Load asynchronous data • Suspends rendering the closest <Suspense> component • Note: Throw a promise to suspend! • See this gist from Ryan Florence 9© ABL - The Problem Solver
  • 10. AJAX Resource © ABL - The Problem Solver 10
  • 11. AJAX Resource • A resource using fetch() to load some data 11© ABL - The Problem Solver
  • 12. Fetching the resource • Fetching asynchronous data • Suspends rendering the closest <Suspense> component if not ready • Use an <ErrorBoundary> to handle errors 12© ABL - The Problem Solver
  • 13. <StrictMode /> 13© ABL - The Problem Solver
  • 14. <StrictMode /> • Find potential problems with concurrent rendering without actually doing so • Warns about: • Unsafe lifecycle methods • Deprecated findDOMNode() usage • legacy string ref API usage • Legacy context API • Tries to detect unexpected side effects • Note: development mode only, no runtime overhead 14© ABL - The Problem Solver
  • 15. 15© ABL - The Problem Solver
  • 16. Concurrent Rendering 16© ABL - The Problem Solver
  • 17. Concurrent Rendering • Changes how React renders your components • The render phase is split into chunks and can be interrupted/aborted and restarted • The commit phase is still atomic • No partial screen updates • Note: Blocking Mode is a migration step 17© ABL - The Problem Solver
  • 18. React.useTransition() 18© ABL - The Problem Solver
  • 19. React.useTransition() • Transition between application states in a more controlled manner 19© ABL - The Problem Solver
  • 20. <SuspenseList /> 20© ABL - The Problem Solver
  • 21. <SuspenseList /> • Control how multiple <Suspense> boundaries are rendered • For example: • Prevents multiple loading indicators at the same time 21© ABL - The Problem Solver
  • 22. 22© ABL - The Problem Solver

Hinweis der Redaktion

  1. Photo by K. Mitch Hodge on Unsplash
  2. Afbeelding van <a href="https://pixabay.com/nl/users/geralt-9301/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1647323">Gerd Altmann</a> via <a href="https://pixabay.com/nl/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1647323">Pixabay</a>
  3. https://pixabay.com/nl/photos/powerboat-snelheid-speedboot-snel-2784250/
  4. Photo by Ivan Shunyakov on Unsplash
  5. Photo by JJ Ying on Unsplash