Done in 0.0166666666 seconds
I'm Alex, nice to meet you!
@alexnmoldovan
Co-Founder @JSHeroes
✍ freecodecamp.org/news/author/alexnm/
No Servus 🇷🇴Timișoara!
Open Source Engineer @teleportHQ
http://bit.ly/revojs-alex
"We will build sites that perform badly"
"We shouldn't be afraid of getting our hands dirty"
Browser Rendering Pipeline
JavaScript
Style Calc
Layout
Paint
Composite
1 second = 60 frames
1/60 = 0.0166666666s
= 16 ms for rendering
16 ms
16 ms
16 ms
16 ms
10ms
10ms
10ms
10ms
In an ideal world...
javascript logic
business logic
event handlers
data fetching
dom diffing
data processing
...
16 ms
16 ms
16 ms
16 ms
10ms
40ms
In the real world...
Audit Time!
1. DOM Access
Multiple DOM accesses
for (let index = 0; index < newsItems.length; index++) {
const newsBox = document.createElement('div')
/* ... */
const newsItemsList = document.getElementById('news-items-list')
newsItemsList.appendChild(newsBox)
}
Involuntarily Layout Trigger
const header = document.getElementById('header')
function handleScroll() {
if (window.scrollY > 50) {
header.style.position = "fixed"
}
}
Forced Synchronous Layout = FSL
FSL = Layout Trashing
const header = document.getElementById('header')
function handleScroll() {
if (window.scrollY > 50) {
header.style.position = "fixed"
}
}
1. DOM Access
2. JavaScript
Avoid Long Running Handlers
Event Throttling
Passive Event Listeners
addEventListener('touchstart', onTouchStart, {passive: true});
1. DOM Access
2. JavaScript
3. Animations
JavaScript Animations
function animateBox() {
/* ... */
offset = offset + step
box.style.marginLeft = offset + "px";
/* ... */
requestAnimationFrame(animateBox);
}
Style
Layout
Paint
Composite
Style
Layout
Paint
Composite
Style
Layout
Paint
Composite
CSS Animations
Layout
Paint
Composite
Paint
Composite
Composite
Does it change the geometry of the element?
(ex: width, margin, border)
Is it a visual property?
(ex: color, background-color, visibility)
Does it promote the element to a new layer?
(ex: transform, opacity)
will-change
Use it as a last resort
Don't over use it, composition is not cheap
Test how the browser optimizes the layers before using it
Recap
Avoid unnecessary or repetitive DOM access
Use requestAnimationFrame for all visual delays / animations
Throttle sensitive event handlers (ex: scroll, resize)
Use passive event listeners for an easy win
Avoid forced reflows / layout trashing
Prefer transform and opacity for css animations
Use will-change as a last resort to promote an element to its own layer
Resources
I'm open for questions!
@alexnmoldovan
Co-Founder @JSHeroes
✍ freecodecamp.org/news/author/alexnm/
Mulțam fain 🇷🇴Timișoara!
Open Source Engineer @teleportHQ
http://bit.ly/revojs-alex
Ciao ciao!
Done in 0.0166666666 seconds
By Alex Moldovan
Done in 0.0166666666 seconds
Presented at revo.js in Oct 2019
- 1,873