1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

90
1, 2, 3... LIVE! Performance no frontend: faça suas aplicações voarem Monday, October 3, 11

Upload: carlos-antonio-da-silva

Post on 27-Jun-2015

1.570 views

Category:

Technology


3 download

DESCRIPTION

A maior parte do tempo gasto para abrir uma página normalmente não é no servidor, mas no cliente, no navegador. Este é uma revisão sobre o porquê disto, e como podemos agir de forma ativa para melhorar drasticamente a performance de aplicações web.

TRANSCRIPT

Page 1: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

1, 2, 3... LIVE!

Performance no frontend:faça suas aplicações voarem

Monday, October 3, 11

Page 2: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Carlos Antonio

@cantoniodasilva

Monday, October 3, 11

Page 3: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

@plataformatec

Monday, October 3, 11

Page 4: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Desenvolvemosaplicações em Rails

@plataformatec

Monday, October 3, 11

Page 5: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Desenvolvemosaplicações em Rails

Coaching emRails e Agile

@plataformatec

Monday, October 3, 11

Page 6: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Desenvolvemosaplicações em Rails

ConsultoriaCoaching emRails e Agile

@plataformatec

Monday, October 3, 11

Page 7: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Novo projeto => Yay!

Monday, October 3, 11

Page 8: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

X meses depois...

Monday, October 3, 11

Page 9: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

DONE!

Monday, October 3, 11

Page 10: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Hora do deploy \o/

Monday, October 3, 11

Page 11: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Setup do servidor - ruby, rubygems, etc...

Setup do apache ou nginxPassengerCapistrano

...

Monday, October 3, 11

Page 12: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

cap production deploy... Sucesso!

Monday, October 3, 11

Page 13: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Hora das férias?

Monday, October 3, 11

Page 14: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

yeah!

Monday, October 3, 11

Page 15: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

No 1º (feliz) dia de férias:

O cliente liga: a app está morrendo, lenta, demora uma

vida para carregar!

Monday, October 3, 11

Page 16: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

1 vida == 10s

Monday, October 3, 11

Page 17: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

:bomb:

Monday, October 3, 11

Page 18: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Esperar é um saco.

Monday, October 3, 11

Page 19: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

E a culpa é de quem?

Monday, October 3, 11

Page 20: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Ruby é lento.

Monday, October 3, 11

Page 21: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Será mesmo?

Monday, October 3, 11

Page 22: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

80 a 90% do tempo de renderização é gasto no

navegador.

Monday, October 3, 11

Page 23: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

WTF!?!

Monday, October 3, 11

Page 24: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

SIM!

A maior parte do tempo de renderização de uma página não é

gasto no servidor, mas sim no navegador.

Monday, October 3, 11

Page 25: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Performance?

Vamos otimizar o frontend!

Monday, October 3, 11

Page 26: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Hora do checklist!

Monday, October 3, 11

Page 27: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#1 Diminuir o número de requisições#2 Utilizar um CDN#3 Evitar src ou href vazios#4 Adicionar header Expires#5 Habilitar Gzip#6 Colocar CSS no topo#7 Colocar JS no final#8 Evitar expressões CSS#9 Deixar JS e CSS em arquivos externos#10 Reduzir Lookups DNS#11 Minificar JS e CSS#12 Evitar redirects#13 Remover scripts duplicados#14 Configurar ETags#15 Permitir cache para Ajax #16 Usar GET para requisições Ajax#17 Reduzir o número de elementos DOM#18 Evitar 404#19 Reduzir o tamanho dos cookies#20 Usar domínios sem cookie para componentes#21 Evitar filtros#22 Não escalar imagens no HTML#23 Ter um favicon.ico pequeno e cacheável

Monday, October 3, 11

Page 28: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Ahhhhhhhhhhh!

Tudo isso?

Monday, October 3, 11

Page 29: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Easy!

Monday, October 3, 11

Page 30: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#1 Diminuir o número de requisições

Combine arquivos

JS CSS

Monday, October 3, 11

Page 31: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#1 Diminuir o número de requisições

Sirva 1 arquivo js e 1 arquivo css em produção.

Arquivos separados ajudam a organizar em desenvolvimento. Mas o usuário não precisa disso.

Jammit, Asset Packager, Rails 3.1 asset pipeline, etc.

Monday, October 3, 11

Page 32: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#1 Diminuir o número de requisições

Monday, October 3, 11

Page 33: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#1 Diminuir o número de requisições

Use CSS Sprites

Combine imagens pequenas em uma única imagem maior.

Monday, October 3, 11

Page 34: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#2 Utilizar um CDN

Distribua seus assets em diferentes lugares, mais próximos do usuário.

Akamai Technologies, EdgeCast, level3

Monday, October 3, 11

Page 35: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#2 Utilizar um CDN

Para aplicações realmente grandes! $$

Monday, October 3, 11

Page 36: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#3 Evitar src ou href vazios

<img src="">

Browsers constumam fazer uma nova requisição para a

página atual.Isso está definido em RFC, então em teoria os browsers estão fazendo o correto.

Browsers novos ignoram isso.

HTML 5 adicionou na RFC instrução para ignorar src/href vazios.

Monday, October 3, 11

Page 37: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#3 Evitar src ou href vazios

E não precisamos de requisições que não valem nada.

Monday, October 3, 11

Page 38: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#4 Adicionar header Expires

Diga para seu navegador fazer cache de assets por

algum tempo.

Monday, October 3, 11

Page 39: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#4 Adicionar header Expires

Mas não eternamente!

1 mês ~ 1 ano

Monday, October 3, 11

Page 40: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#4 Adicionar header Expires

Apache => mod_expires

<IfModule mod_expires.c> <FilesMatch "\.(ico|jpg|jpeg|png|gif|js|css)$"> ExpiresActive On ExpiresDefault "access plus 1 month" </FilesMatch></IfModule>

Monday, October 3, 11

Page 41: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#4 Adicionar header Expires

Nginx => HttpHeadersModule

if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") { expires 30d; break;}

Monday, October 3, 11

Page 42: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#5 Habilitar Gzip

Compacte todo texto que sai do seu servidor!

Monday, October 3, 11

Page 43: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#5 Habilitar Gzip

htmlcss

javascriptxmljsonetc...

Todo texto ==

Monday, October 3, 11

Page 44: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#5 Habilitar Gzip

Até 70% de ganhos ao compactar usando gzip.

Monday, October 3, 11

Page 45: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#5 Habilitar Gzip

Apache => mod_deflate

<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml

AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/x-javascript application/javascript AddOutputFilterByType DEFLATE application/rss+xml</IfModule>

Monday, October 3, 11

Page 46: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#5 Habilitar Gzip

Nginx => HttpGzipModule

gzip on; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

Monday, October 3, 11

Page 47: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#6 Colocar CSS no topo

CSS é carregado e interpretado mais rápido.

Mais feedback visual para o usuário!

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Example App</title> <link href="/stylesheets/application.css" media="all" rel="stylesheet" type="text/css" />

Monday, October 3, 11

Page 48: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#7 Colocar JS no final

Scripts bloqueiam downloads paralelos e renderização da página.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script> </body></html>

Monday, October 3, 11

Page 49: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#8 Evitar expressões CSS

Expressões são executadas a cada render, resize, scroll, ou

movimento do mouse!

background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

Monday, October 3, 11

Page 50: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#9 Deixar JS e CSS em arquivos externos

Arquivos externos podem ser cacheados.

Js/css inline, não.

Remover do html também diminui o tamanho final da página.

Monday, October 3, 11

Page 51: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#10 Reduzir Lookups DNS

Muitos hosts diferentes que não estão cacheados,

significam mais tempo para lookup de DNS.

Navegadores possuem cache de DNS, e cada navegador expira isso em um tempo diferente.

100~120 ms por lookup de DNS

Monday, October 3, 11

Page 52: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#10 Reduzir Lookups DNS

3 Lookups de DNS

foo.com/image1.pngbar.com/image2.pngbaz.com/image3.png

Monday, October 3, 11

Page 53: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#11 Minificar JS e CSS

Elimine tudo que não é necessário dos arquivos:

espaços, comentários, etc.

Diferença entre minificar e obfuscar?

Monday, October 3, 11

Page 54: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#11 Minificar JS e CSS

20 ~ 25% de ganho no tamanho dos arquivos.

Monday, October 3, 11

Page 56: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#12 Evitar redirects

HTTP status 301 e 302 são extremamente custosos, e

fazem o usuário esperar mais.

Monday, October 3, 11

Page 57: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#13 Remover scripts duplicados

Duplo trabalho? Quem gosta.

É mais comum do que imaginamos.

Um estudo do Yahoo mostrou que 2 dos 10 sites mais acessados dos EUA possuía scripts duplicados.

Monday, October 3, 11

Page 58: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#14 Configurar ETags

Cache, cache, cache!

Configuração de servidorApache / Nginx

ETag: "10c24bc-4ab-457e1c1f"

Monday, October 3, 11

Page 59: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#14 Configurar ETags

Padrão Otimizado

304 Not modifed200 OK

Requisição 1

Requisição 2

200 OK

Requisição 1

Requisição 2 + ETag em cache

200 OK + ETag

Servidor envia header ETag junto com o componente requisitado.Navegador requisita o componente novamente, enviando ETag em cache.Servidor retorna 304 se a ETag do componente não mudou.

If-None-Match

Monday, October 3, 11

Page 60: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#15 Permitir cache para Ajax

Assíncrono != Instântaneo

Tenha os mesmos cuidados com cache em requisições Ajax.

Monday, October 3, 11

Page 61: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#16 Usar GET para requisições Ajax

POST usa 2 etapas: 1 para enviar os cabeçalhos, outro para enviar o body.

Não quer dizer que não é para usar POST. Quer dizer: não use POST por usar.

Monday, October 3, 11

Page 62: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#17 Reduzir o número de elementos DOM

Muitos elementos significam uma página complexa de renderizar, e mais lenta para acessar usando javascript.

document.getElementsByTagName('*').length

Monday, October 3, 11

Page 63: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#17 Reduzir o número de elementos DOM

Cuidado com

<div></div>

para montar seu layout!

Monday, October 3, 11

Page 64: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#18 Evitar 404

Fazer uma requisição para receber 404 é jogar tempo fora.

Isso é muito comum com assets!

Monday, October 3, 11

Page 65: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#19 Reduzir o tamanho dos cookies

Cookies são enviados em TODOS os requests, inclusive para assets.

Quanto menor o tamanho dos cookies, melhor!

Monday, October 3, 11

Page 66: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#20 Usar domínios sem cookie para componentes

Assets não precisam de cookies. Eles são tráfego de rede desnecessário.

Monday, October 3, 11

Page 67: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#20 Usar domínios sem cookie para componentes

Site => www.example.org (www seta cookies)

Assets => static.example.org(cookie-free)

Monday, October 3, 11

Page 68: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#20 Usar domínios sem cookie para componentes

Site => example.org (seta cookies)

Assets => static.example.org(seta cookies - já era)

Use outro host diferentestatic-example.org

Monday, October 3, 11

Page 69: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#21 Evitar filtros

AlphaImageLoader para corrigir transparência do IE < 7.

Esqueça!

Monday, October 3, 11

Page 70: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#22 Não escalar imagens no HTML

Imagem maior == download maior.

Escalar no navegador == mais processamento para renderizar.

<img width="100" height="100" src="mycat.jpg" alt="My Cat" />

Monday, October 3, 11

Page 71: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#23 Ter um favicon.ico pequeno e cacheável

É um mal necessário, então é melhor não responder com 404.

Monday, October 3, 11

Page 72: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

#23 Ter um favicon.ico pequeno e cacheável

Mantenha pequeno, abaixo de 1kb.

Define um header Expires para alguns meses no futuro.

Não coloque muito tempo de Expires, pois o seu nome não pode ser mudado para expirar o cache.

Monday, October 3, 11

Page 73: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

E agora, quem poderá nos ajudar?

Monday, October 3, 11

Page 74: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

YSlow

http://developer.yahoo.com/yslow/

Monday, October 3, 11

Page 75: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Page Speed

http://code.google.com/speed/page-speed/

Monday, October 3, 11

Page 76: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Smush.it

http://www.smushit.com/ysmush.it/

Monday, October 3, 11

Page 77: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Sprite.me

http://spriteme.org/

Monday, October 3, 11

Page 78: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Sucesso!

Hora de voltar para aquelas merecidas férias...

Monday, October 3, 11

Page 79: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Finalizando...

Monday, October 3, 11

Page 80: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Seu cliente não liga para isso.

Monday, October 3, 11

Page 81: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Seu cliente não liga nem um pouco

para isso.

Monday, October 3, 11

Page 82: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Ele só quer resposta rápida ao invés de “carregando...”

Monday, October 3, 11

Page 83: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

10s não é rápido o suficiente.

Monday, October 3, 11

Page 84: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

10s não é aceitável.

Monday, October 3, 11

Page 85: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Otimize no frontend.

E 80% dos seus problemas de performance serão resolvidos.

Monday, October 3, 11

Page 86: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

No final, o que ganhamos?

Monday, October 3, 11

Page 87: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Trabalho extra! :)

Monday, October 3, 11

Page 88: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

Uma web melhor!

Monday, October 3, 11

Page 89: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

E lembre-se:

Com grandes poderes vêm grandes responsabilidades.

Uncle Ben

Monday, October 3, 11

Page 90: 1,2,3 live! fronted optimizations @ guru sc - 2011.10.01

@cantoniodasilva blog.plataformatec.com.br

Obrigado!

Monday, October 3, 11