Publicité
Publicité

Contenu connexe

Publicité

Dernier(20)

Speed up! Critical css to the rescue

  1. Speed up! TO THE RESCUE CRITICAL CSS TO THE RESCUE CRITICAL CSS Speed up!
  2. Oi!Oi!
  3. Oi!Oi! Sou Ami ReynosoSou Ami Reynoso
  4. Sou Ami ReynosoSou Ami Reynoso Engenheira frontend no Mercado Livre Engenheira frontend no Mercado Livre Oi!Oi!
  5. - A Front End Engineer’s EM PRIMEIRO LUGAREM PRIMEIRO LUGAR USUÁRIOUSUÁRIO sobre as minhas próprias necessidades como desenvolvedor. Mais importante ainda, e acima de tudo, vou colocar as necessidades do - A Front End Engineer’s Mais importante ainda, e acima de tudo, vou colocar as necessidades do sobre as minhas próprias necessidades como desenvolvedor.
  6. usuários felizesusuários felizes
  7. usuários felizesusuários felizes
  8. WEBSITE RÁPIDO usuários felizesusuários felizes WEBSITE RÁPIDO
  9. WEBSITE RÁPIDO ?WEBSITE RÁPIDO ?
  10. WEBSITE RÁPIDO ?WEBSITE RÁPIDO ? carrega literalmente rápidocarrega literalmente rápido
  11. carrega literalmente rápido usuário percebe que carrega rápido carrega literalmente rápido usuário percebe que carrega rápido WEBSITE RÁPIDO ?WEBSITE RÁPIDO ?
  12. percepçaopercepção
  13. 1993 · Jakob Nielsen1993 · Jakob Nielsen
  14. LIMITES NA PERCEPÇAO 1993 · Jakob Nielsen1993 · Jakob Nielsen LIMITES NA PERCEPÇÃO
  15. 0.1 segundos0.1 segundos
  16. 0.1 segundos 1 segundo 0.1 segundos 1 segundo
  17. 0.1 segundos 1 segundo 10 segundos10 segundos 1 segundo 0.1 segundos
  18. Rendering pathRendering path
  19. Rendering pathRendering path
  20. Do que estamos falando? Do que estamos falando?
  21. clique aqui!
  22. clique aqui! digite a URL
  23. clique aqui! digite a URL
  24. clique aqui! digite a URL
  25. clique aqui! digite a URL eventoseventos
  26. O que é realmente? O que é realmente?
  27. 1 NETWORK REQUESTNETWORK REQUEST1 ~ 600 milliseconds~ 600 milissegundos 2 RESPOSTA DO SERVIDOR 2 RESPOSTA DO SERVIDOR
  28. PROCESSAMENTO DE HTML & CONSTRUÇÃO DE DOM 33 PROCESSAMENTO DE HTML & CONSTRUÇÃO DE DOM
  29. PROCESSAMENTO DE CSS & CONSTRUÇÃO DE CSSOM 44 PROCESSAMENTO DE CSS & CONSTRUÇÃO DE CSSOM
  30. 5 RENDER TREERENDER TREE5
  31. 6 LAYOUTLAYOUT6
  32. 7 PINTADO7 PINTADO
  33. Como podemos otimizar isso? Como podemos otimizar isso?
  34. ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização! ➔Minify e gzip ➔Embale seus recursos!
  35. ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização! ➔Minify e gzip ➔Embale seus recursos! ➔Utilize resource hints
  36. ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização! ➔Minify e gzip ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização!
  37. ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização! ➔Minify e gzip ➔Embale seus recursos! ➔Utilize resource hints ➔Não bloqueie o caminho de renderização! ➔Minify e gzip
  38. ✔ Critical Rendering Path✔ Critical Rendering Path
  39. ✔ Critical Rendering Path ✔ Como otimizá-lo ✔ Critical Rendering Path ✔ Como otimizá-lo
  40. ✔ Critical Rendering Path ✔ Como otimizá-lo CSS? ✔ Critical Rendering Path ✔ Como otimizá-lo CSS?
  41. Percepção do usuário ✔ Critical Rendering Path ✔ Como otimizá-lo CSS? ✔ Critical Rendering Path ✔ Como otimizá-lo CSS? Percepção do usuário
  42. para o resgate!para o resgate! Critical CSSCritical CSS
  43. O que é Critical CSS? O que é Critical CSS?
  44. O que é Critical CSS? O que é Critical CSS?
  45. necessário para nosso above the fold necessário para nosso above the fold
  46. .my-awesome-header { background-color: #eee; font-size: 1.5em; color: #111; } .my-awesome-container { max-width: 90%; font-size: 1.2em; color: #333; } .my-awesome-title { font-size: 1.3em; font-weight: bold; }
  47. <head><head> .my-awesome-header { background-color: #eee; font-size: 1.5em; color: #111; } .my-awesome-container { max-width: 90%; font-size: 1.2em; color: #333; } .my-awesome-title { font-size: 1.3em; font-weight: bold; }
  48. Mas, e quanto ao resto dos meus estilos? Mas, e quanto ao resto dos meus estilos?
  49. Javascript mágica!Javascript mágica! Mas, e quanto ao resto dos meus estilos? Mas, e quanto ao resto dos meus estilos?
  50. O que vamos alcançar? O que vamos alcançar?
  51. de carregamento da página percepçãopercepção de carregamento da página
  52. O que ter em mente? O que ter em mente?
  53. 1 DEPENDE DE JAVASCRIPT 1 DEPENDE DE JAVASCRIPT
  54. 2 BROWSER CACHEBROWSER CACHE2
  55. Conservar se o usuário já tem os estilos Conservar se o usuário já tem os estilos 2 BROWSER CACHEBROWSER CACHE2
  56. Como...Como...
  57. Como... carregar os estilos Como... carregar os estilos
  58. ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar ➔<noscript> fallback! ➔Script de carregamento
  59. window.addEventListener("load", function(event) { // create element var elem = document.createElement("link"); // make it a stylesheet link elem.setAttribute("rel", "stylesheet"); elem.setAttribute("type", "text/css"); elem.setAttribute("href", "styles.css"); // append to head document.querySelector("head").appendChild(elem); });
  60. ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar ➔<noscript> fallback! ➔Script de carregamento ➔Resource hint: preload
  61. <link rel="preload" href="path/to/full/styles.css" as="style" onload="this.rel='stylesheet'">
  62. ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar ➔<noscript> fallback! ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar
  63. <?php if(isset($_COOKIE["css"]) && $_COOKIE["css"] = $version): ?> <link href="styles.<?php $version; ?>.css" rel="stylesheet"> <?php else : ?> <style> /* inlined Critical CSS */ </style> <script> var version = <?php $version; ?>; function cookie(key, value, expires) { … } if(!cookie("css") || cookie("css") !== version) { // load styles cookie("css", version); } </script> <?php endif; ?>
  64. ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar ➔<noscript> fallback! ➔Script de carregamento ➔Resource hint: preload ➔Verificar a existência de cookie e salvar ➔<noscript> fallback!
  65. <style> /* inline Critical CSS */ </style> <noscript> <link rel="stylesheet" type="text/css" href="styles.css"> </noscript>
  66. Como... gerar os estilos Como... gerar os estilos
  67. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas
  68. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas
  69. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas
  70. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas
  71. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas pré-processador + boa base de código
  72. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas pré-processador + boa base de código
  73. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas pré-processador + boa base de código
  74. pré-processador + boa base de código ferramentas auto-mágicas ferramentas auto-mágicas pré-processador + boa base de código
  75. em Mercado Livreem Mercado Livre Critical CSSCritical CSS
  76. Onde o fizemos Onde o fizemos
  77. Mercado LivreMercado Livre
  78. Search listingsSearch listings Mercado LivreMercado Livre
  79. Search listingsSearch listings Web mobileWeb mobile Mercado LivreMercado Livre
  80. Search listingsSearch listings Web mobileWeb mobile Mercado LivreMercado Livre
  81. Mercado LivreMercado Livre Search listingsSearch listings Web mobileWeb mobile
  82. Mercado LivreMercado Livre Search listingsSearch listings Web mobileWeb mobile
  83. Mercado LibreMercado Libre Search listingsSearch listings Web mobileWeb mobile
  84. Como fizemos Como fizemos
  85. gerado on-linegerado on-line
  86. ++ proceso artesanal gerado on-line proceso artesanal gerado on-line
  87. ~20 bundles diferentes proceso artesanal gerado on-line ~20 bundles diferentes proceso artesanal gerado on-line ++ ++
  88. ==
  89. grande bagunçagrande bagunça ==
  90. a longo prazoa longo prazo == grande bagunçagrande bagunça
  91. O que isto significou para nós O que isto significou para nós
  92. resultados impressionantes! * resultados impressionantes! *
  93. * mesmo vindo de uma má experiência!* mesmo vindo de uma má experiência! resultados impressionantes! * resultados impressionantes! *
  94. -56%
  95. percepção do tempo de carga -56%
  96. +2%-56% percepção do tempo de carga
  97. -56% +2% taxa de conversão percepção do tempo de carga
  98. critical csscritical css
  99. otimizações de velocidadeotimizações de velocidade critical csscritical css
  100. SUCESSO!SUCESSO! critical csscritical css otimizações de velocidadeotimizações de velocidade
  101. Obrigada!Obrigada! amireynoso@gmail.comamireynoso@gmail.com @bakery@bakery

Notes de l'éditeur

  1. Más de un año Plataforma líder de e-commerce en Latinoamérica. Lo que hacemos impacta a muchísimos usuarios / nuestra misión es mejorar su experiencia
  2. Respuesta instantánea
  3. Atención completa. Pasado el segundo, comienza a sentir que pierde el control. Empieza a desenfocarse.
  4. Acá perdió completamente la atención. Diferentes matices, puntos de quiebre. Feedback visual dentro del 1er segundo. Historia del usuario en el tiempo. Out: ¿qué podemos hacer para mejorar? Veamos que pasa detrás de escena.
  5. La forma que tenemos de mejorar la percepción del usuario es optimizar el rendering path.
  6. ¿Quiénes acá escucharon hablar del rendering path?
  7. Hasta que la página termina de renderizarse en pantalla.
  8. Términos simplistas. Serie de eventos que desarrolla el browser para cumplir este objetivo.
  9. En el camino hay un trayecto crítico. Repasemos en detalle el camino.
  10. Un poco más de control. Caso: HTML sencillo, algunas imágenes, una hoja de estilos y un archivo JS. Respuesta “pequeña”.
  11. El navegador procesa la respuesta de manera progresiva. Lo va traduciendo a nodos en un árbol que conocemos como DOM. “Viene parseando, se encuentra con un title, algunos tags meta, y un link con una referencia externa a un CSS”. Render blocking.
  12. Frena el renderizado porque entiende que necesita este recurso renderizar la página en pantalla. Con el CSS arma el CSSOM. También es un mapa de nodos. Continúa con el procesamiento del HTML y la construcción del DOM.
  13. Ambos modelos completos, se relacionan en el render tree. Combinación de todos los nodos con sus reglas computadas de estilos. No son todos los nodos, sólo los visibles en pantalla (por CSS o por tipo de tag).
  14. Layout o reflow. Calcula el tamaño y posición de cada elemento en el viewport.
  15. Instancia final, pintado o paint. Traducción de toda la información recopilada en pixeles en pantalla. El tiempo depende de lo que se pinta. Reglas de estilos más costosas que otras. Out: Página web visible en el browser.
  16. Todo esto nos perjudica en performance. Veamos cómo hacerlo mejor.
  17. Evitemos tener múltiples requests. Cambia el paradigma con HTTP2
  18. Si pueden usar resource hints, sería un golazo. Preconnect y DNS-Prefetch.
  19. Cargar los scripts antes del cierre del body. Usar atributos defer o async. Traer dependencias asincrónicamente después del on load. Mundo ideal: JS sólo como mejora.
  20. Achiquemos el tamaño de nuestros assets. Soluciones básicas a problemas básicos. Excavar más profundo. Usar estos conocimientos para mejorar la experiencia. Nuevo slide: Ya sabemos q es el rendering path, como lo podemos optimizar, ahora como entra css? Percepcion del usuario
  21. Ya sabemos que es el rendering path, como lo podemos optimizar, ahora como entra CSS? Percepción del usuario
  22. Ahora sí, lo que vinieron a escuchar. Seguramente con las mejoras anteriores ya bajaron tiempos de render. ¿Pero el usuario sigue esperando para tener feedback visual?
  23. Les presento una técnica. Sabemos lo que es el critical rendering path, y el CSS critical path. Camino que toma el navegador para interpretar nuestros estilos en pantalla. Estamos bloqueando el render de la manera en que lo solemos hacer. Out: Acá entra Critical CSS. ¿Qué es?
  24. Diferencia entre CSS Critical Path y Critical CSS. Critical CSS: CSS indispensable. No es negativo, es lo vital e importante. Para entender mejor la diferencia, pensar Critical CSS como una optimización sobre el CSS Critical Path.
  25. Declaraciones de estilos necesarias para renderizar lo que el usuario tiene que ver sí o sí. El usuario no va a ver todo enseguida. Sólo el primer pantallazo. Mundo editorial: “above the fold”.
  26. Estos son mis estilos críticos. Sólo cargamos esto en el head. No debería ser externo.
  27. Hay que hacer algo que nos dijeron siempre que no hagamos. Ponerlos en línea.
  28. Nos aseguramos que el navegador tiene todo lo que necesita en la primer respuesta del servidor.
  29. Escuchamos el evento on load e insertamos el tag link con nuestros estilos completos. El navegador entiende el cambio y va a buscar los estilos. No bloqueamos el render inicial. El usuario ya tiene feedback visual. Ejemplo de como hacerlo.
  30. Mejoramos la percepción del tiempo de carga. El usuario ve contenido casi final mucho tiempo antes. Él entiende que la página cargó más rápido. Los tiempos de carga reales son casi los mismos. Umbrales de Nielsen: esta mejora + otras optimizaciones = nos puede salvar de perder un usuario.
  31. Buscar en cache los recursos luego de la primer visita. Acelera muchísimo las visitas posteriores.
  32. Guardar en una cookie después de mostrar los estilos críticos. Estilos versionados: cookie = valor de la versión. Sin versionado: cookie = auto expirable a cantidad de tiempo de actualización. Reever con lo q se repite abajo.
  33. Hasta ahora sólo teoría. La práctica depende del contexto. Necesidades y usuarios son diferentes.
  34. Adaptar a nuestras propias necesidades. Cualquiera de estos dos scripts no debería bloquear el render.
  35. Nuevo resource hint preload. Indica al browser que cargue paralelamente nuestra hoja completa de estilos. Tiene evento de on load. Cuando carga el recurso, le indicamos al browser que es una hoja de estilos para que lo interprete normalmente. Versiones más recientes de Chrome.
  36. Adaptar a nuestras propias necesidades. Cualquiera de estos dos scripts no debería bloquear el render.
  37. Condicionar estilos críticos en base a lo que guardamos en la cookie. Server side. Si no existe o tiene un valor diferente a la versión que queremos, mostramos estilos críticos. Sino, el link a los estilos completos.
  38. Tag <noscript> traemos los estilos completos.
  39. Diferentes maneras de generarlos. Depende del contexto y tamaño del proyecto.
  40. Herramientas automatizadas. Sumar a nuestro workflow. Task runner: Gulp, Grunt. Stand alone.
  41. También tiene un generador online.
  42. Critical de Addy Osmani. Out: mayor o menor medida, estas herramientas toman parámetros configurables, y extraen estilos que se renderizan en pantalla.
  43. Si trabajamos con un preprocesador. Nuestro código está bien organizado.
  44. Estilos bien componentizados + módulos extraíbles = bundle con lo necesario con criterio. Out: Experiencia personal. Armado con preprocesador es lo que mejor escala. Más flexible. Sólo necesita armado inicial. Modularizar y pensar bien los estilos críticos. Herrmientas automáticas Sirven para un contexto chico, estático. Atadas al tamaño del viewport: limitante.
  45. Finales del año pasado. Primer experiencia: desastrosa pero beneficiosa. Hermosa contradicción.
  46. Primera implementación. Más palos. Mejores resultados. Implementación en otros lados, experiencias más felices.
  47. Mejor experiencia basándonos en performance.
  48. A simple vista parece sencillo.
  49. Codebase viejo. A punto de arrancar el diseño actual. No teníamos buena modularización. Workflow de Gulp débil.
  50. Lo que sí teníamos era un deadline.
  51. Los generamos online.
  52. De manera artesanal. Dependencias: Estilos propios Librería UI Vendors
  53. Más de 20 compilaciones para todas las combinaciones. Siguieron apareciendo casos de uso.
  54. Se imaginarán el lío. Hasta acá todo más o menos bien. Hasta que se comenzaron a agregar fixes y features.
  55. Mantener los bundles de estilos críticos se tornó imposible. “mírame y no me toques”.
  56. Sin embargo...
  57. Excelentes resultados.
  58. Para una experiencia desastrosa.
  59. Usuario ahora comienza a ver contenido a los 1.4 segundos. Antes veía alrededor de los 2.5 segundos. Mejora del 56% en el first render.
  60. Usuarios percibían la carga de la página, en promedio, un segundo entero antes.
  61. Percibir Tiempo de carga total bajó solo 8,5%. “Visually complete”, de 4.9 a 4.5 segundos. 2 tipos de hacer rapido el sitio
  62. Punto de vista de negocio.
  63. Un poco más del 2% en la tasa de conversiones. Parece poco pero es muchísimo.
  64. Acelear significativamente la carga. Brindar mejor experiencia a nuestros usuarios.
  65. Les conté: Nuestros errores. Nuestra victoria. Espero que puedan: Llevarse el aprendizaje. Sacarle lo mejor a la técnica en sus proyectos. Me gustaría que se lleven: No sólo el conocimiento de la técnica. Sino el foco puesto en performance. Siempre en la experiencia final de nuestros usuarios.
Publicité