128
PERFORMANCE WEB ALÉM DO CARREGAMENTO

Performance Web além do carregamento

  • Upload
    caelum

  • View
    290

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Performance Web além do carregamento

PERFORMANCE WEB ALÉM DO CARREGAMENTO

Page 2: Performance Web além do carregamento

@sergio_caelum sergiolopes.org

Page 3: Performance Web além do carregamento

PERFORMANCE?

Page 4: Performance Web além do carregamento

VÁRIAS PERFORMANCES

Page 5: Performance Web além do carregamento

VÁRIAS PERFORMANCESCARREGAMENTO

Page 6: Performance Web além do carregamento

VÁRIAS PERFORMANCESCARREGAMENTOEXECUÇÃO

Page 7: Performance Web além do carregamento

VÁRIAS PERFORMANCESCARREGAMENTOEXECUÇÃOINTERAÇÃO

Page 8: Performance Web além do carregamento

VÁRIAS PERFORMANCESCARREGAMENTOEXECUÇÃOINTERAÇÃOANIMAÇÃO

Page 9: Performance Web além do carregamento

VÁRIAS PERFORMANCESCARREGAMENTOEXECUÇÃOINTERAÇÃOANIMAÇÃOMEMÓRIA, BATERIA

Page 10: Performance Web além do carregamento

PERFORMANCE

EXECUÇÃO INTERAÇÃO ANIMAÇÃO

Page 11: Performance Web além do carregamento

PERFORMANCEEXECUÇÃO INTERAÇÃO ANIMAÇÃO

Page 12: Performance Web além do carregamento

PERFORMANCEEXECUÇÃO INTERAÇÃO ANIMAÇÃO

MAIN THREAD OCUPADA.

MUITO LAYOUT / PAINT.

Page 13: Performance Web além do carregamento

MAIN THREAD

Page 14: Performance Web além do carregamento
Page 15: Performance Web além do carregamento
Page 16: Performance Web além do carregamento

RESPONSE 100ms

Page 17: Performance Web além do carregamento

QUEBRAR EM BLOCOS MENORES

NÃO USAR A MAIN THREAD

Page 18: Performance Web além do carregamento

QUEBRAR EM BLOCOS MENORES

NÃO USAR A MAIN THREAD

Page 19: Performance Web além do carregamento
Page 20: Performance Web além do carregamento
Page 21: Performance Web além do carregamento
Page 22: Performance Web além do carregamento
Page 23: Performance Web além do carregamento
Page 24: Performance Web além do carregamento

setTimeout(funcao, 10);

Page 25: Performance Web além do carregamento

setTimeout(funcao, 10);

setImmediate(funcao);

Page 26: Performance Web além do carregamento

setTimeout(funcao, 10);

setImmediate(funcao);

requestAnimationFrame(funcao);

Page 27: Performance Web além do carregamento

setTimeout(funcao, 10);

setImmediate(funcao);

requestAnimationFrame(funcao);

requestIdleCallback(funcao);

Page 28: Performance Web além do carregamento

IDLE TIME

Page 29: Performance Web além do carregamento
Page 30: Performance Web além do carregamento
Page 31: Performance Web além do carregamento

QUEBRAR EM BLOCOS MENORES

NÃO USAR A MAIN THREAD

Page 32: Performance Web além do carregamento

WEB WORKERS

Page 33: Performance Web além do carregamento
Page 34: Performance Web além do carregamento
Page 35: Performance Web além do carregamento

MULTI THREAD

Page 36: Performance Web além do carregamento
Page 37: Performance Web além do carregamento
Page 38: Performance Web além do carregamento
Page 39: Performance Web além do carregamento
Page 40: Performance Web além do carregamento
Page 41: Performance Web além do carregamento
Page 42: Performance Web além do carregamento
Page 43: Performance Web além do carregamento
Page 44: Performance Web além do carregamento
Page 45: Performance Web além do carregamento

MELHORAR TTI DE SPA

Page 46: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERING

Page 47: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERINGMENOS DEPENDÊNCIAS

Page 48: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERINGMENOS DEPENDÊNCIASCODE SPLITTING

Page 49: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERINGMENOS DEPENDÊNCIASCODE SPLITTINGTREE SHAKING

Page 50: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERINGMENOS DEPENDÊNCIASCODE SPLITTINGTREE SHAKINGAOT COMPILER

Page 51: Performance Web além do carregamento

MELHORAR TTI DE SPASERVER SIDE RENDERINGMENOS DEPENDÊNCIASCODE SPLITTINGTREE SHAKINGAOT COMPILERFRAMEWORK COM WEB WORKER

Page 52: Performance Web além do carregamento

QUEBRAR EM BLOCOS MENORES

NÃO USAR A MAIN THREAD

Page 53: Performance Web além do carregamento
Page 54: Performance Web além do carregamento
Page 55: Performance Web além do carregamento
Page 56: Performance Web além do carregamento
Page 57: Performance Web além do carregamento

@keyframes anima { to { left: 200px; width: 250px; }}

@keyframes animaGPU { to { transform: translateX(200px) scale(1.7); }}

Page 58: Performance Web além do carregamento
Page 59: Performance Web além do carregamento

60FPS

Page 60: Performance Web além do carregamento

60FPS16ms

Page 61: Performance Web além do carregamento
Page 62: Performance Web além do carregamento
Page 63: Performance Web além do carregamento
Page 64: Performance Web além do carregamento

.container {top: 0;transition: top 500ms;

}

.container.buscaVisivel {top: 100px;

}

Page 65: Performance Web além do carregamento

.container {top: 0;transition: top 500ms;

}

.container.buscaVisivel {top: 100px;

}

Page 66: Performance Web além do carregamento
Page 67: Performance Web além do carregamento
Page 68: Performance Web além do carregamento

.container {transition: transform 500ms;

}

.container.buscaVisivel {transform: translateY(100px);

}

Page 69: Performance Web além do carregamento
Page 70: Performance Web além do carregamento
Page 71: Performance Web além do carregamento
Page 72: Performance Web além do carregamento
Page 73: Performance Web além do carregamento

.container {transition: transform 500ms;will-change: transform;

}

.container.buscaVisivel {transform: translateY(100px);

}

Page 74: Performance Web além do carregamento

.container {transition: transform 500ms;will-change: transform;

}

.container.buscaVisivel {transform: translateY(100px);

}

.container {transition: transform 500ms;transform: translateZ(0);

}

.container.buscaVisivel {transform: translateY(100px);

}

Page 75: Performance Web além do carregamento
Page 76: Performance Web além do carregamento
Page 77: Performance Web além do carregamento
Page 78: Performance Web além do carregamento
Page 79: Performance Web além do carregamento
Page 80: Performance Web além do carregamento
Page 81: Performance Web além do carregamento
Page 82: Performance Web além do carregamento
Page 83: Performance Web além do carregamento
Page 84: Performance Web além do carregamento

INICIAL

Page 85: Performance Web além do carregamento

INICIAL FINAL

Page 86: Performance Web além do carregamento

INICIAL FINAL

Page 87: Performance Web além do carregamento

INICIAL FINAL

opacity: 0;transition: opacity 500ms ease-out;

Page 88: Performance Web além do carregamento

INICIAL

Page 89: Performance Web além do carregamento

INICIAL FINAL

Page 90: Performance Web além do carregamento

INICIAL FINAL

var posInicial = cartao.getBoundingClientRect();

Page 91: Performance Web além do carregamento

INICIAL FINAL

var posInicial = cartao.getBoundingClientRect();cartaoARemover.classList.add('remove');

Page 92: Performance Web além do carregamento

INICIAL FINAL

var posInicial = cartao.getBoundingClientRect();cartaoARemover.classList.add('remove');var posFinal = cartao.getBoundingClientRect();

Page 93: Performance Web além do carregamento

INICIAL FINAL

Page 94: Performance Web além do carregamento

INICIAL FINAL

var x = posInicial.left - posFinal.left;

Page 95: Performance Web além do carregamento

INICIAL FINAL

var x = posInicial.left - posFinal.left;var y = posInicial.top - posFinal.top;

Page 96: Performance Web além do carregamento

INICIAL FINAL

var x = posInicial.left - posFinal.left;var y = posInicial.top - posFinal.top;

Page 97: Performance Web além do carregamento

INICIAL FINAL

var x = posInicial.left - posFinal.left;var y = posInicial.top - posFinal.top;

cartao.style.transform = `translate(${x}px, ${y}px)`;

Page 98: Performance Web além do carregamento

INICIAL FINAL INVERTE

var x = posInicial.left - posFinal.left;var y = posInicial.top - posFinal.top;

cartao.style.transform = `translate(${x}px, ${y}px)`;

Page 99: Performance Web além do carregamento

INICIAL FINAL INVERTE

Page 100: Performance Web além do carregamento

INICIAL FINAL INVERTE

transform: none;transition: transform 500ms ease-out;

Page 101: Performance Web além do carregamento

INICIAL FINAL INVERTE PLAY

transform: none;transition: transform 500ms ease-out;

Page 102: Performance Web além do carregamento

FIRST LAST INVERT PLAY

FLIP

Page 103: Performance Web além do carregamento

FIRST LAST INVERT PLAY

FLIP

Page 104: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {// preparaAnimacao// disparaAnimacao// aposAnimacao

}

Page 105: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {

}

Page 106: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {

}

Page 107: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {

}

var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());

Page 108: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {

}

var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

Page 109: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {

}

var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

.cartao.remove {position: absolute;

}

Page 110: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

Page 111: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {

Page 112: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();

Page 113: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;

Page 114: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;

Page 115: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

Page 116: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

}

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});

Page 117: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

Page 118: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);// disparaAnimacao// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

.anima .cartao {transition: 500ms ease-out;

}

.anima .cartao.remove {opacity: 0;

}

Page 119: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);

disparaAnimacao();// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

Page 120: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);

requestAnimationFrame(disparaAnimacao);// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

Page 121: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);

requestAnimationFrame(disparaAnimacao);// aposAnimacao

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

function aposAnimacao() {lista.classList.remove('anima');this.remove();

}

Page 122: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);

requestAnimationFrame(disparaAnimacao);this.addEventListener('transitionend', aposAnimacao);

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

function aposAnimacao() {lista.classList.remove('anima');this.remove();

}

Page 123: Performance Web além do carregamento

cartoes.forEach((cartao) => cartao.addEventListener('click', cartaoOnClick));

function cartaoOnClick() {preparaAnimacao(this);requestAnimationFrame(disparaAnimacao);this.addEventListener('transitionend', aposAnimacao);

}

function preparaAnimacao(cartaoARemover) {var posInicial = cartoes.map((cartao) => cartao.getBoundingClientRect());cartaoARemover.classList.add('remove');

cartoes.forEach((cartao, i) => {var posFinal = cartao.getBoundingClientRect();var x = posInicial[i].left - posFinal.left;var y = posInicial[i].top - posFinal.top;cartao.style.transform = `translate(${x}px, ${y}px)`;

});}

function disparaAnimacao() {cartoes.forEach((cartao) => cartao.style.transform = '' );lista.classList.add('anima');

}

function aposAnimacao() {lista.classList.remove('anima');this.remove();

}

Page 124: Performance Web além do carregamento

FLIP ANIMATIONFirst, Last, Invert, Play

Page 125: Performance Web além do carregamento
Page 126: Performance Web além do carregamento
Page 127: Performance Web além do carregamento

PERFORMANCE WEB ALÉM DO CARREGAMENTO

Page 128: Performance Web além do carregamento

OBRIGADO!

sergiolopes.org @sergio_caelum