PERFORMANCE NA WEB
O MODELO RAIL
E OUTRAS NOVIDADES
@sergio_caelum
sergiolopes.org
OTIMIZAÇÕES WEB
MINIFICAR CSS/JS
COMPRIMIR HTML
GZIP
CONCATENAR CSS/JS
SPRITES
CACHE / EXPIRES
OTIMIZAR IMAGENS
JS NO FIM DA PÁGINA
CSS NO TOPO
ASSÍNCRONO
LAZY-LOAD
CDN
DIMINUIR COOKIES
PARALELIZAR REQs
PERFORMANCE?
ONLOAD
VÁRIAS PERFORMANCES
CARREGAMENTO
INTERAÇÃO
ANIMAÇÃO
MEMÓRIA
BATERIA
LIMITES DA PERCEPÇÃO DE PERFORMANCE
100ms 1s 10s
instantâneo mesma
tarefa
perde
atenção
RAIL
Response
Animation
Idle
Load
LOAD 1s
CRITICAL RENDERING PATH
~600px
~9000px
ABOVE THE FOLD
(ATF)
< 14 KB (1 RTT)
inline do CSS ATF
inline do JS ATF
flush ATF
resto do CSS e JS tudo async
< 14 KB (1 RTT)
inline do CSS ATF
inline do JS ATF
flush ATF
resto do CSS e JS tudo async
server push
http/2
ANIMATION 60FPS
ANIMATION 16ms
elem1.style.top = elemX.offsetTop + 10 + 'px';
elem2.style.top = elemY.offsetTop + 10 + 'px';
elem3.style.top = elemZ.offsetTop + 10 + 'px';
elem4.style.top = elemW.offsetTop + 10 + 'px';
// reads
var topX = elemX.offsetTop;
var topY = elemY.offsetTop;
var topZ = elemZ.offsetTop;
var topW = elemW.offsetTop;
// writes
elem1.style.top = topX + 10 + 'px';
elem2.style.top = topY + 10 + 'px';
elem3.style.top = topZ + 10 + 'px';
elem4.style.top = topW + 10 + 'px';
.header-barraBusca {
height: 100px;
position: absolute;
top: -100px;
}
botaoBusca.onclick = function() {
container.classList.toggle('buscaVisivel');
};
.container {
position: relative;
}
.container.buscaVisivel {
top: 100px;
}
.container {
position: relative;
top: 0;
transition: top 500ms;
}
.container.buscaVisivel {
top: 100px;
}
.container {
transition: transform 500ms;
}
.container.buscaVisivel {
transform: translateY(100px);
}
.container {
transition: transform 500ms;
will-change: transform;
}
.container.buscaVisivel {
transform: translateY(100px);
}
.container {
transition: transform 500ms;
transform: translateZ(0);
}
.container.buscaVisivel {
transform: translateY(100px);
}
agrupar read / write DOM (fastdom)
animação com CSS
animação GPU (transform / opacity)
RESPONSE 100ms
registre o input em <100ms
o máximo em background
indique progresso se >500ms
RESPONSE +
ANIMATION
IDLE 50ms
quebre a tarefa
setTimeout / setImmediate / requestAnimationFrame / requestIdleCallback
coisas pesadas em background
Web Workers
// carrega videos assincronamente
var containers = document.querySelectorAll('.elasticMedia-container[data-src]'
for (var i = 0; i < containers.length; i++) {
var src = containers[i].getAttribute('data-src');
containers[i].innerHTML = '<iframe class="elasticMedia" src="' + src + '" f
}
setTimeout(function(){
// carrega videos assincronamente
var containers = document.querySelectorAll('.elasticMedia-container[data-src]'
for (var i = 0; i < containers.length; i++) {
var src = containers[i].getAttribute('data-src');
containers[i].innerHTML = '<iframe class="elasticMedia" src="' + src + '" f
}
}, 500);
requestIdleCallback(function(){
// carrega videos assincronamente
var containers = document.querySelectorAll('.elasticMedia-container[data-src]'
for (var i = 0; i < containers.length; i++) {
var src = containers[i].getAttribute('data-src');
containers[i].innerHTML = '<iframe class="elasticMedia" src="' + src + '" f
}
});
PERFORMANCE é UX
IDLE 50ms
ANIMATION 16ms
LOAD 1s
RESPONSE 100ms
RAIL
OBRIGADO!
sergiolopes.org
@sergio_caelum

Performance na web: o modelo RAIL e outras novidades