-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.tsx
558 lines (555 loc) · 17.6 KB
/
App.tsx
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
import Slide1 from './slides/Slide1';
import Slide2 from './slides/Slide2';
import Slide3 from './slides/Slide3';
import Slide4 from './slides/Slide4';
import Slide5 from './slides/Slide5';
import Slide6 from './slides/Slide6';
import Slide7 from './slides/Slide7';
import { css } from '@pigment-css/react';
import { Template } from './Template';
import { Backdrop } from './Backdrop';
import {
Slide,
SlideLayout,
Heading,
Text,
Deck,
Image,
Appear,
Notes,
UnorderedList,
ListItem,
} from 'spectacle';
import { rawTheme } from '../rawTheme';
const spectacleTheme = {
colors: {
primary: '#fff',
secondary: 'hsl(210, 100%, 65%)',
brandBlue: 'hsl(210, 100%, 65%)',
textPrimary: '#FFF',
textSecondary: 'hsl(210, 20%, 75%)',
textRed: 'hsl(0, 99%, 70%)',
tertiary: 'transparent',
},
fontSizes: {
h1: '54px',
h2: '64px',
h3: '56px',
text: '44px',
monospace: '20px',
},
Backdrop,
fonts: {
header: rawTheme.typography.fontFamilyTagline,
text: rawTheme.typography.fontFamily,
},
};
const transition = {
from: {
opacity: 0,
},
enter: {
filter: 'blur(0px)',
opacity: 1,
},
leave: {
// Make people loose focus
filter: 'blur(2px)',
opacity: 0,
},
};
export default function Presentation() {
return (
<Deck theme={spectacleTheme} transition={transition} template={<Template />}>
<Slide>
<Slide1 />
<Notes>
<ul>
<li>Hi everyone! I'm so excited to be here.</li>
<li>
I'm Olivier and I'm going to talk about your favorite topic, or maybe not: CSS-in-JS.
</li>
<li>
By the end of this presentation, I would like you to better understand how React
Server Components are shaking this space, the challenges with today's generation of
libraries, and the key properties I think you should look out for a great styling
solutions.
</li>
<li>
Now, React Server Components might shake the space, but there is hope. I'm also going
to introduce Pigment CSS, which is part of a next generation of CSS-in-JS libraries
movement.
</li>
</ul>
40s
</Notes>
</Slide>
<Slide>
<Slide2 />
<Notes>
<ul>
<li>Let's start with two quick questions</li>
<li>Please raise your hands</li>
<li>Who here is currently using styled-components or Emotion?</li>
<li>🙆♂️</li>
<li>I see xx% of the audience who raised their hands</li>
</ul>
1m00s
</Notes>
</Slide>
<Slide>
<Slide3 />
<Notes>
<ul>
<li>You folks seems to be a good sample of the ecosystem.</li>
<li>
According to the last State of CSS survey, over 60% of the frontend community uses one
of these two.
</li>
</ul>
1m10s
</Notes>
</Slide>
<Slide>
<Slide4 />
<Notes>
<ul>
<li>Last question, a spicy one 🌶️, please raise your hand again</li>
<li>Who feels left behind by these libraries and is considering migrating away?</li>
<li>🙆♂️</li>
<li>Or so fewer hands than before, but still a good number, about x%</li>
</ul>
1m30s
</Notes>
</Slide>
<Slide>
<Slide5 />
<Notes>
<ul>
<li>And again, it's consistent with the same survey.</li>
<li>
In the State of CSS you can see a clear decline of interest in styled-components and
Emotion since a year ago.
</li>
</ul>
1m45s
</Notes>
</Slide>
<SlideLayout.Section>
The challenges
<Notes>
<ul>
<li>What's going on?</li>
</ul>
1m50s
</Notes>
</SlideLayout.Section>
<Slide>
<Slide6 />
<Notes>
<ul>
<li>
I can't provide a definitive answer, but at MUI, we are facing the same challenges.
</li>
<li>
For those that don't know me, I co-created Material UI a long time ago. I'm now
running MUI as its CEO.
</li>
</ul>
2m05s
</Notes>
</Slide>
<Slide>
<Slide7 />
<Notes>
<ul>
<li>
At MUI, we fund the development of a few open-source projects:
<br />
- Material UI, a popular UI library that implements Google's Material Design
<br />
- Base UI, a headless, "unstyled" UI component library
<br />
- MUI X, a set of advanced React components, like Data Grids, Charts, and so on
<br />
- Toolpad, a set of components to quickly build internal tools
<br />
</li>
<li>
The common denominator between them is that all these projects rely on Emotion in one
way or another, which gave us a good exposure to the problems.
</li>
</ul>
2m45s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
Performance
</Text>
<Heading fontWeight="500" color="primary">
11 + 4 = 16 kB gzipped of bundle size
</Heading>
<Image src="/images/bundle-size.png" width="50%" className={css({ margin: '30px auto' })} />
<Notes>
{/* https://bundlephobia.com/package/styled-components@6.1.11 */}
<ul>
<li>The first problem we faced is with performance.</li>
<li>
The bundle size of the application takes a hit, styled-components adds about 11kB
gzipped because they have a runtime.
</li>
<li>
And you also need to add about 4kB because it works with a rich JavaScript theme and
it's color transformation tools.
</li>
<li>So in total, maybe 16 kB.</li>
<li>
To be fair, it's not the end of the day, if you compare it to the bundle size of
React, you have 45KB.
</li>
<li>Still, is it really needed?</li>
</ul>
3m20s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
Performance
</Text>
<Heading fontWeight="500" color="primary">
Runtime
</Heading>
<Image src="/images/.png" width="50%" className={css({ margin: 'auto' })} />
<Notes>
<ul>
<li>The runtime takes a much larger hit</li>
<li>Here, you can see how much time it take to render a table with 1,000 rows.</li>
<li>It's not great, you can't use Emotion without virtualization.</li>
</ul>
3m35s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
Performance
</Text>
<Heading fontWeight="500" color="primary">
Data Grid
</Heading>
<video
autoPlay
muted
loop
playsInline
className={css({
width: '50%',
margin: '0 auto',
})}
>
<source src="/images/data-grid.mp4" type="video/mp4"></source>
</video>
<Notes>
{/* https://mui.com/x/react-data-grid/#pro-plan
https://github.com/mui/mui-x/issues/11866#issuecomment-1963168133 */}
<ul>
<li>Let's say you add add virtualization.</li>
<li>This is our data grid, rendering 100,000 rows with CPU throttling.</li>
<li>Do you see the blank screen areas?</li>
</ul>
3m50s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
Performance
</Text>
<Image src="/images/data-grid.png" width="40%" className={css({ margin: '50px auto' })} />
<Notes>
<ul>
<li>
If you look at the time it takes to render each row, we spent about 14% of the time
generating over and over the same Emotion styles.
</li>
<li>So in theory, we could have 14% less blank screen area.</li>
<li>For data analysis use cases, it matters, it's a big deal.</li>
</ul>
4m10s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
Performance
</Text>
<Image
src="/images/user-feedback-1.png"
width="55%"
className={css({ margin: '100px auto 20px' })}
/>
{/*<Image src="/images/user-feedback-2.png" width="55%" className={css({ margin: '5px auto' })} />*/}
<Notes>
{/* https://www.reddit.com/r/reactjs/comments/1bzsxa6/take_a_survey_which_ui_component_library_does/?rdt=61541 */}
<ul>
<li>And if this wasn't enough, we also hear this from our users</li>
<li>People loving to use Material UI but feel frustrated about its speed.</li>
</ul>
4m20s
</Notes>
</Slide>
<Slide>
<Text fontSize="2rem" color="secondary">
RSC support
</Text>
<Image
src="/images/rsc-emotion.png"
width="50%"
className={css({
position: 'absolute',
borderRadius: 4,
top: 150,
transform: 'rotate(-1deg)',
})}
/>
<Image
src="/images/rsc-sc.png"
width="50%"
className={css({
position: 'absolute',
borderRadius: 4,
top: 150,
left: '50%',
transform: 'rotate(4deg)',
})}
/>
<Notes>
{/*
https://github.com/emotion-js/emotion/issues/2978
https://github.com/styled-components/styled-components/issues/4025
*/}
<ul>
<li>That was performance</li>
<li>
The second key problem, that is more recent, is with the support of React Server
Components
</li>
<li>
Nor styled components or Emotion are compatible with it, and we see no real progress.
</li>
<li>The blocking point is the React context API that is not working with RSC.</li>
</ul>
4m40s
</Notes>
</Slide>
<SlideLayout.Section>
The options
<Notes>
<ul>
<li>These problems are too important for MUI not to try to solve.</li>
<li>Over a year ago, we started to work on this.</li>
<li>Let's look at how we approached this.</li>
</ul>
5m00s
</Notes>
</SlideLayout.Section>
<Slide>
<UnorderedList>
<ListItem>Inline style</ListItem>
<ListItem>CSS Modules</ListItem>
<ListItem>StyleX</ListItem>
<ListItem>Tailwind CSS</ListItem>
<ListItem>Panda CSS</ListItem>
<ListItem>Linaria</ListItem>
<ListItem>Tokanami</ListItem>
<ListItem>…</ListItem>
</UnorderedList>
<Notes>
<ul>
<li>First, there are a lot of of options.</li>
<li>
Inline style, CSS Modules, StyleX, Tailwind CSS, Panda CSS, Linaria, Tokanami, and
more
</li>
<li>It can get overwhelming to compare them all.</li>
<li>Instead, we looked at the key properties we wanted out from them</li>
<li>
Now, these were judged at in the context of Material UI, don't take what I present
next as truth, these solution adopt different tradeoffs, I'm sure they all have
context where they are best.
</li>
<li>We developers, love to not disagree on this</li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary">
Style colocation
</Heading>
<Image
src="/images/style-collocation.png"
width="50%"
className={css({ margin: '0px auto' })}
/>
<Notes>
<ul>
<li>The first thing we looked at is style colocation</li>
<li>This bring great benefits:</li>
<li>
<ul>
<li>It minimize context shifting</li>
<li>You don't have to name everything</li>
<li>
having the style closer to your code, opens more door to use JavaScript to control
the style
</li>
<li>and people who truly want separation</li>
</ul>
</li>
{/* Side fun note: http://react-toolbox.io/ */}
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary">
Style colocation
</Heading>
<Text>CSS Modules → 🤔</Text>
<Notes>
<ul>
<li>So, we quickly excluded CSS Modules. </li>
{/* Side fun note: http://react-toolbox.io/ */}
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary">
Plain class names vs. Atomic
</Heading>
<Notes>
<ul>
<li>One of the trikiest decision is choosing on this tradeoff</li>
<li>It involves both performance and DX considerations</li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary" className={css({ marginBottom: '0 !important' })}>
Plain class names vs. Atomic
</Heading>
{/* TODO: Conflict between Pigment CSS and Styled components */}
<Text fontSize="2rem" color="secondary" className={css({ marginTop: '0 !important' })}>
Atomic class names
</Text>
<Image
src="/images/class-atomic.png"
width="60%"
className={css({ margin: '0px auto' })}
/>
<Notes>
<ul>
<li></li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary" className={css({ marginBottom: '0 !important' })}>
Plain class names vs. Atomic
</Heading>
<Text fontSize="2rem" color="secondary" className={css({ marginTop: '0 !important' })}>
Plain class names
</Text>
<Image
src="/images/class-plain.png"
width="60%"
className={css({ margin: '0px auto' })}
/>
<Notes>
<ul>
<li></li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary" className={css({ marginBottom: '0 !important' })}>
Plain class names vs. Atomic
</Heading>
<Text fontSize="2rem" color="secondary" className={css({ marginTop: '0 !important' })}>
Growing applications
</Text>
<UnorderedList>
<ListItem>Atomic classes keep the CSS file small</ListItem>
<ListItem>Nested selectors are eventually needed</ListItem>
</UnorderedList>
<Notes>
<ul>
<li></li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary" className={css({ marginBottom: '0 !important' })}>
Plain class names vs. Atomic
</Heading>
<Text fontSize="2rem" color="secondary" className={css({ marginTop: '0 !important' })}>
Granular style loading
</Text>
<UnorderedList>
<ListItem>Only loading the CSS you need for the page</ListItem>
<ListItem>Inlining of critical CSS</ListItem>
</UnorderedList>
<Notes>
<ul>
<li>So I believe the future for style performance is deep integration with the bundlers.</li>
<li>Knowing exaclty what the dependency tree is and being smart about it</li>
<li>Next.js Pages Router with CSS Modules is the best in that space today that I'm aware of</li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary">
Plain class names vs. Atomic
</Heading>
<UnorderedList>
<ListItem>StyleX → 🤔</ListItem>
<ListItem>Tailwind CSS → 🤔</ListItem>
<ListItem>Panda CSS → 🤔</ListItem>
</UnorderedList>
<Notes>
<ul>
<li></li>
</ul>
</Notes>
</Slide>
<Slide>
<Heading fontWeight="500" color="primary">
Familiarity
</Heading>
<UnorderedList>
<ListItem>Am I good to go with what I already know about CSS?</ListItem>
</UnorderedList>
<Appear>
<UnorderedList>
<ListItem>StyleX → 🤔</ListItem>
<ListItem>Tailwind CSS → 🤔</ListItem>
</UnorderedList>
</Appear>
<Notes>
<ul>
<li>Do I have to learn a new API?</li>
</ul>
</Notes>
</Slide>
<Slide>
<UnorderedList>
<ListItem>Inline style</ListItem>
<ListItem>CSS Modules</ListItem>
<ListItem>StyleX</ListItem>
<ListItem>Tailwind CSS</ListItem>
<ListItem>Panda CSS</ListItem>
<ListItem>Linaria</ListItem>
<ListItem>Tokanami</ListItem>
<ListItem>…</ListItem>
</UnorderedList>
</Slide>
</Deck>
);
}