A Deep Dive Into Concurrent React by Matheus Albuquerque
ScyllaDB
98 views
64 slides
Jun 27, 2024
Slide 1 of 85
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
About This Presentation
Writing fluid user interfaces becomes more and more challenging as the application complexity increases. In this talk, we’ll explore how proper scheduling improves your app’s experience by diving into some of the concurrent React features, understanding their rationales, and how they work under ...
Writing fluid user interfaces becomes more and more challenging as the application complexity increases. In this talk, we’ll explore how proper scheduling improves your app’s experience by diving into some of the concurrent React features, understanding their rationales, and how they work under the hood.
Size: 17.38 MB
Language: en
Added: Jun 27, 2024
Slides: 64 pages
Slide Content
DEEP DIVING ON CONCURRENT REACT 👨💻 @medallia 🧑🏫 @techlabs 🐦 @ythecombinator ↑ ALL THE LINKS! 🤓 ⚡ Perf GDE
#DISCLAIMER 😌 This is a deep dive for those who are interested in API discussions . You don’t need to know all of that to be productive with React.
#QUESTION 🤔 If you were to summarize Concurrent React in one word/expression , what’d be your pick?
The Main Thread DEEP DIVING ON CONCURRENT REACT
#RESEARCH 📚 Phone users experience slow First Input Delay on 7x more websites. — Web Almanac By HTTP Archive, 2021
— AKAMAI AND CHROME RESEARCHµ 2017
#QUESTION 🤔 How to avoid blocking the main thread?
A B C D
PARALLELISM CONCURRENCY SCHEDULING
PARALLELISM CONCURRENCY SCHEDULING
↝ DATA EXCHANGE IS THROUGH MESSAGE-PASSING ↝ NO ACCESS TO ANY VARIABLES/CODE FROM THE PAGE THAT CREATED THEM OR VICE VERSA ↝ NO ACCESS TO THE DOM µ MAKING UI UPDATES FROM A WORKER BARELY IMPOSSIBLE ↝ TWO MODELS: ACTORS & SHARED MEMORY
🎭 ACTORS ↝ EACH ACTOR FULLY OWNS THE DATA IT IS OPERATING ON ↝ ACTORS CAN ONLY SEND/REACT TO MESSAGES ↝ THE MAIN THREAD IS ACTOR THAT OWNS THE DOM/UI ↝ postMessage HAS NO BUILT-IN UNDERSTANDING OF REQUEST AND RESPONSE ↝ BALANCE: MOVING CODE TO A WORKER VS COMMUNICATION OVERHEAD / WORKER BEING BUSY ↝ ONE DEDICATED TYPE: SharedArrayBuffer ↝ IF SENT VIA postMessage µ THE OTHER END GETS A HANDLE TO THE EXACT SAME MEMORY CHUNK ↝ MOST OF THE WEB APIS ARE BUILT NO CONCURRENT ACCESS TO OBJECTS ↝ YOU BUILD YOUR OWN CONCURRENT DATA STRUCTURES ↝ NO DIRECT WAY OF WORKING ON FAMILIAR OBJECTS/ARRAYS ; JUST A SERIES OF BYTES 🔗 SHARED MEMORY
🎭 ACTORS ↝ EACH ACTOR FULLY OWNS THE DATA IT IS OPERATING ON ↝ ACTORS CAN ONLY SEND/REACT TO MESSAGES ↝ THE MAIN THREAD IS ACTOR THAT OWNS THE DOM/UI ↝ postMessage HAS NO BUILT-IN UNDERSTANDING OF REQUEST AND RESPONSE ↝ BALANCE: MOVING CODE TO A WORKER VS COMMUNICATION OVERHEAD / WORKER BEING BUSY ↝ ONE DEDICATED TYPE: SharedArrayBuffer ↝ IF SENT VIA postMessage µ THE OTHER END GETS A HANDLE TO THE EXACT SAME MEMORY CHUNK ↝ MOST OF THE WEB APIS ARE BUILT NO CONCURRENT ACCESS TO OBJECTS ↝ YOU BUILD YOUR OWN CONCURRENT DATA STRUCTURES ↝ NO DIRECT WAY OF WORKING ON FAMILIAR OBJECTS/ARRAYS ; JUST A SERIES OF BYTES 🔗 SHARED MEMORY
↝ THE BEST EXPERIENCE FOR SHARED-MEMORY MODEL ↝ DOESN’T OFFER THE "COMFORT" OF JAVASCRIPT ↝ FASTER WHEN YOU STAY WITHIN WASM ↝ JAVASCRIPT IS OFTEN FASTER AT DOM AND HIGH- LEVEL UI LIBRARIES CAN BE MORE PERFORMANT THAN LOW-LEVEL WASM IMPLEMENTATIONS
↝ Atomics ↝ BuffferBackedObject ↝ Comlink ↝ WorkerDOM ↝ Partytown ↝ AND MUCH MORE !
↝ GOOD FOR DATA PROCESSING AND CRUNCHING NUMBERS ↝ HARD TO USE FOR UI-RELATED STUFF ↝ PERHAPS HARDER THAN ADJUSTING WORK FOR A SCHEDULER
PARALLELISM CONCURRENCY SCHEDULING
#QUESTION 🤔 If you were to summarize Concurrent React in one word/expression , what’d be your pick?
Scheduling in React DEEP DIVING ON CONCURRENT REACT
↝ A COOPERATIVE MULTITASKING MODEL ↝ A SINGLE INTERRUPTIBLE RENDERING THREAD ↝ RENDERING CAN BE INTERLEAVED WITH OTHER MAIN THREAD TASKS (AND OTHER REACT RENDERS) ↝ AN UPDATE CAN HAPPEN IN THE BACKGROUND WITHOUT BLOCKING THE RESPONSE TO NEW INPUT
↓ ORIGINAL RENDER TASK USER INPUT → ↑ HIGHER PRIORITY RENDER TASK ↓ RESUME ORIGINAL RENDER TASK
↝ IT YIELDS EXECUTION IS BACK TO THE MAIN THREAD EVERY 5MS ↝ IT'S SMALLER THAN A SINGLE FRAME EVEN ON 120FPS µ SO IT WON'T BLOCK ANIMATIONS ↝ IN PRACTICEµ RENDERING IS INTERRUPTIBLE
#QUESTION 🤔 How do we benefit from these in our everyday projects ?
Scheduling in React [ for the rest of us ] DEEP DIVING ON CONCURRENT REACT
HANDLING LOTS OF DATA WITH THE useTransition HOOK TACKLING WASTED RENDERS WITH THE useSyncExternalStore HOOK HYDRATION IMPROVEMENTS WITH SELECTIVE HYDRATION & CONCURRENT REACT PROFILER ENHANCEMENTS INSPECT TRANSITIONS µ GET WARNS µ AND MUCH MORE!
#1 HANDLING LARGE SETS OF DATA DEEP DIVING ON CONCURRENT REACT
😔 NON-PRACTICAL… ↝ FINDING PRIMES ↝ CRACKING PASSWORDS ↝ SIERPINSKI TRIANGLE 😊 PRACTICAL… ↝ RENDERING MANY DATA-POINTS ↝ RENDERING ON A <canvas> ↝ PROCESSING DATA
😊 PRACTICAL… ↝ RENDERING MANY DATA-POINTS ↝ RENDERING ON A <canvas> ↝ PROCESSING DATA 😔 NON-PRACTICAL… ↝ FINDING PRIMES ↝ CRACKING PASSWORDS ↝ SIERPINSKI TRIANGLE
#3 HYDRATION IMPROVEMENTS DEEP DIVING ON CONCURRENT REACT
FETCHING DATA (SERVER) RENDERING HTML (SERVER) LOADING CODE (CLIENT) HYDRATING TIME TO FIRST BYTE FIRST CONTENTFUL PAINT TIME TO INTERACTIVE
↝ HYDRATION COULD ONLY BEGIN AFTER THE ENTIRE DATA WAS FETCHED AND RENDERED ↝ USERS COULDN’T INTERACT WITH THE PAGE UNTIL HYDRATION WAS COMPLETE FOR THE WHOLE PAGE ↝ PARTS OF YOUR APP THAT LOAD FAST WOULD ALWAYS HAVE TO WAIT FOR THE SLOW ONES
DEEP DIVING ON CONCURRENT REACT
FETCHING DATA (SERVER) RENDERING HTML (SERVER) LOADING CODE (CLIENT) HYDRATING TIME TO FIRST BYTE FIRST CONTENTFUL PAINT TIME TO INTERACTIVE
TIME TO FIRST BYTE FIRST CONTENTFUL PAINT TIME TO INTERACTIVE […] FETCHING DATA (SERVER) RENDERING HTML (SERVER) HYDRATING LOADING CODE (CLIENT) […] […] […] […] […] […]
↝ pipeToNodeStream + createRoot + <Suspense> ↝ REACT PRIORITIZES HYDRATING THE PARTS THAT THE USER INTERACTED WITH BEFORE THE REST ↝ COMPONENTS CAN BECOME INTERACTIVE FASTER BY ALLOWING THE BROWSER TO DO OTHER WORK AT THE SAME TIME AS HYDRATION
↝ REACT WON'T WAIT FOR HUGE COMPONENTS TO LOAD TO CONTINUE STREAMING HTML FOR THE REST OF THE PAGE ↝ WHEN THE HTML BECOMES AVAILABLE ON THE SERVERµ IT WILL BE ADDED TO THE SAME STREAM ALONG WITH A SCRIPT TAG AND INSERTED IN THE RIGHT PLACE
DEEP DIVING ON CONCURRENT REACT
#4 PROFILER ENHANCEMENTS DEEP DIVING ON CONCURRENT REACT
— INTRODUCING A NEW REACT PROFILERµ BY BRIAN VAUGHN
— INTRODUCING A NEW REACT PROFILERµ BY BRIAN VAUGHN
The Future DEEP DIVING ON CONCURRENT REACT
↝ I/O LIBRARIES LIKE react-fetch ↝ BUILT-IN <Cache> FOR DATA FETCHING LIBRARIES TO INTEGRATE WITH <Suspense> ↝ <Suspense> FOR CPU-BOUND TREES TO IMMEDIATELY FALLBACK WITHOUT EVEN TRYING TO RENDER
↝ useInsertionEffect FOR STYLESHEET LIBRARIES ↝ THE <Offscreen> COMPONENT ↝ SERVER COMPONENTS ↝ NATIVE SCHEDULING PRIMITIVES ON THE BROWSER
DEEP DIVING ON CONCURRENT REACT
↝ A MORE ROBUST SOLUTION FOR SCHEDULING TASKS ↝ CONTROL AND SCHEDULE PRIORITIZED TASKS IN A UNITED AND FLEXIBLE WAY ↝ INTEGRATED DIRECTLY INTO THE EVENT LOOP ↝ ALIGNED WITH THE WORK OF THE REACT TEAM AND IN COOPERATION WITH GOOGLE µ W3C AND OTHERS
scheduler.postTask() SCHEDULE AND CONTROL PRIORITIZING TASKS. scheduler.wait() YIELD AND RESUME AFTER SOME AMOUNT OF TIME OR PERHAPS AFTER AN EVENT HAS OCCURRED. scheduler.yield() BREAK UP LONG TASKS BY YIELDING TO THE BROWSER AND CONTINUING AFTER BEING RESCHEDULED. isInputPending() DETERMINE IF THE CURRENT TASK IS BLOCKING INPUT EVENTS.
Closing Notes DEEP DIVING ON CONCURRENT REACT
DEEP DIVING ON CONCURRENT REACT
#1 DEEP DIVING ON CONCURRENT REACT REACT IS NOT REACTIVEµ BUT IT IS CONCURRENT AND THAT MIGHT BE ENOUGH FOR YOU
#2 DEEP DIVING ON CONCURRENT REACT REACT HAS BEEN PUSHING WEB APIS TO THE FUTURE E.G. THE SCHEDULER API
#3 DEEP DIVING ON CONCURRENT REACT SCHEDULING DOES NOT NECESSARILY MEAN BETTER PERFORMANCE
#3 DEEP DIVING ON CONCURRENT REACT SCHEDULING DOES NOT NECESSARILY MEAN BETTER PERFORMANCE ↝ ↝ ↝ NON-URGENT UPDATES TAKE LONGER CAN’T HELP SOME EXPENSIVE COMPONENTS EXTRA CPU COST
#4 DEEP DIVING ON CONCURRENT REACT THERE'S NO SILVER BULLET . IDENTIFY YOUR CORE METRICS.
#5 DEEP DIVING ON CONCURRENT REACT THERE’S A LOT OF INFORMATION OUT THERE
#6 DEEP DIVING ON CONCURRENT REACT ALWAYS TRY TO CORRELATE BUSINESS METRICS WITH PERFORMANCE