Slide 1

Slide 1 text

ANA LUIZA BASTOS github.com/anabastos @naluhh @anapbastos Software Developer na Quanto e cientista da computação pela PUC-SP anabastos.me

Slide 2

Slide 2 text

JSLADIES fb.com/jsladiesbr twitter.com/jsladiessp meetup.com/JsLadies-BR LAMBDA.IO t.me/lambdastudygroup github.com/lambda-study-group meetup.com/Lambda-I-O-Sampa- Meetup

Slide 3

Slide 3 text

NAVEGADORES POR DE BAIXO DOS PANOS

Slide 4

Slide 4 text

Estrutura high level do navegador Fluxo renderização de paginas web Otimizações de critical render path

Slide 5

Slide 5 text

Qual a função do navegador?

Slide 6

Slide 6 text

Apresentar o conteúdo requisitado de um servidor de acordo com a especificação do HTML CSS(W3C) e servindo em uma janelinha

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

COMPONENTES PRINCIPAIS DO NAVEGADOR

Slide 9

Slide 9 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 10

Slide 10 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 11

Slide 11 text

USER INTERFACE

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 14

Slide 14 text

BROWSER ENGINE Intermedia UI e a engine de renderização Responsavel por persistência dados(Cookies, LocalStorage, IndexedDB). Web APIs(canvas, WebSocket, Animation, WebWorkers, WebGL)

Slide 15

Slide 15 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 16

Slide 16 text

RENDERING ENGINE

Slide 17

Slide 17 text

WEBKIT GECKO BLINK TRIDENT

Slide 18

Slide 18 text

THE MAIN FLOW

Slide 19

Slide 19 text

anabastos.me

Slide 20

Slide 20 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 21

Slide 21 text

Parsear o URL(procolo, dominio) Request DNS (anabastos.me => 63.245.208.161) Abre uma conexão TCP Envia uma requisição HTTP

Slide 22

Slide 22 text

SERVERZINHO HTTP/1.1 200 OK Content-Type: text/html RESPONSE

Slide 23

Slide 23 text

SERVERZINHO HTTP/1.1 200 OK Content-Type: text/css RESPONSE

Slide 24

Slide 24 text

O conteúdo requisitado é carregado em pequenos chunks.

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

CONCURRENT REQUESTS

Slide 27

Slide 27 text

style.css index.html dog.png britneySpears- toxic.mp3 ?????

Slide 28

Slide 28 text

FLUXO DE RENDERIZAÇAO

Slide 29

Slide 29 text

h1 [] [ text “Olá mundo”] p [ class =”alert”] [ text “tudo bem?”]

Olá

h1 [] [ text “Olá mundo”] p [ class =”alert”] [ text “tudo bem?”] h1 { color: red; }

Slide 30

Slide 30 text

BYTES 3C 62 6F 64 79 3E 48 65 6C 6C 6F 2C 20 3C 73 70 61 6E 3E 77 6F 72 6C 64 21 3C 2F 21 73 70 61 6E E 77 6F 72 6C 64 21 3C 2F 21 73 70 61 6E E 77 6F 72 6C 64 21 3C 2F 21 73 70 61 6E 3C 62 6F 64 79 3E 48 65 6C 6C 6F 2C 20 3C 73 70 E 77 6F 72 6C 64 21 3C 6E E 77 6E E8 77 B2 6E E 77 6E E8 77 B2 B1 CHARACTERS(UTF-8)

Olá

tudo bem?

Slide 31

Slide 31 text

PARSER Construção da árvore de renderização

Slide 32

Slide 32 text

PARSEAR Parsear significa traduzir uma estrutura para algo que o código possa usar. O resultado geralmente é um árvore de nós que representam a estrutura dos documentos

Slide 33

Slide 33 text

GRAMMARS REGRAS DE SYNTAX QUE O DOCUMENTO DEVE SEGUIR DE ACORDO COM A LINGUAGEM TODA LINGUAGEM TEM UMA GRAMATICA DETERMINISTICA(VOCABULARIO) ISSO SE CHAMA “CONTEXT FREE GRAMMAR”

Slide 34

Slide 34 text

A engine começa a parsear o HTML e converte-lo a “Nós da DOM” Esses DOM nós se tornam uma arvore chamada “content tree”.

Slide 35

Slide 35 text

CHARACTERS(UTF-8) ...

Olá Intercon

tudo bem?

CONSTRUÇÅO DE ÁRVORE TOKENIZAÇÅO ANALISE LEXICA ANALISE SINTATICA { PARSER

Slide 36

Slide 36 text

ANALISE LEXICA (SE O VOCABULARIO FAZ SENTIDO) ANALISE SINTATICA (SE FAZ SENTIDO) Oi Ash87h12d Oi tudo bom? ? oi tudo

Slide 37

Slide 37 text

ANALISE LEXICA Com as regras da gramática quebra o código em tokens internamente que definem suas propriedades e regras.

Slide 38

Slide 38 text

Eu vou no intercon Pronome Verbo Contração Substantivo

Slide 39

Slide 39 text

Dentro do HTML tenho inicio de tags, fim de tags, nomes de tributos e valores de atributos

Slide 40

Slide 40 text

Hello startTag Text endTag

Slide 41

Slide 41 text

Eu vou no intercon Hello HTML BODY ‘Hello’ ?

Slide 42

Slide 42 text

h1 [] [ text “Olá mundo”] p [ class =”alert”] [ text “tudo bem?”]

Olá

l á StartTag: h1 EndTag: h1 Character Character Character O TOKENS ImageTag

Slide 43

Slide 43 text

span { clor: #FFFF } consolr.log

Slide 44

Slide 44 text

Esses tokens são enviados para o construtor da árvore que os reconhece e monta a nossa DOM.

Slide 45

Slide 45 text

ANALISE SINTATICA É responsável por construir uma árvore de nós analisando se a estrutura do documento está de acordo com as regras sintáticas

Slide 46

Slide 46 text

HTMLHtmlElement HTMLBodyElement HTMLHeaderElement HTMLHeadElement Olá

l á O HTMLImageElement

Slide 47

Slide 47 text

h1 [] [ text “Olá mundo”] p [ class =”alert”] [ text “tudo bem?”]

Olá

Slide 48

Slide 48 text

HTMLHtmlElement HTMLBodyElement HTMLHeadElement HTMLHeaderElement Olá HTMLDivElement HTMLImageElement HTMLDivElement HTMLImageElement

Slide 49

Slide 49 text

O resultado final de todo esse processo é o Document Object Model, ou "DOM", da nossa página simples, que é usado pelo navegador para todos os demais processamentos da página.

Slide 50

Slide 50 text

BYTES CHARACTERS CONSTRUÇÅO DE ÁRVORE TOKENIZAÇÅO

Slide 51

Slide 51 text

Enquanto a DOM estava sendo renderizada nosso style.css é encontrado referenciado em nosso head. Assim como o HTML precisamos converter o CSS pelo mesmo processo desta vez criando um “CSS Object Model” ou CSSOM

Slide 52

Slide 52 text

“Flex” e o”Bison” são parser generators do WebKit para parsear automaticamente de arquivos com gramática CSS. As regras de objetos CSS contêm seletores e a declaração dos objetos correspondentes a gramática CSS.

Slide 53

Slide 53 text

h1 [] [ text “Olá mundo”] p [ class =”alert”] [ text “tudo bem?”] h1 { color: red } CSSStyleElement CSSRule Selectors h1 Declaration Color red

Slide 54

Slide 54 text

No momento de calcular os estilos da página o navegador começa com a regra mais aplicável(body) e logo em seguida vai refinando para as regras mais específicas.

Slide 55

Slide 55 text

BYTES CHARACTERS CONSTRUÇÅO DE ÁRVORE TOKENIZAÇÅO JAVASCRIPT CSS

Slide 56

Slide 56 text

DOM CSSDom

Slide 57

Slide 57 text

Com a DOM e a CSSOM juntos o navegador consegue criar a árvore de renderização. O navegador pinta cada nó da pagina. Todo esse processo toma tempo e pode impactar na performance da pagina web.

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

DOM CSSDom Render Tree ATTACHMENT

Slide 60

Slide 60 text

BODY IMG H1 Color: Red; HEAD HTML RENDER TREE

Slide 61

Slide 61 text

LAYOUT / REFLOW Layout é o processo recursivo que começa da raiz da arvore() e continua recursivamente por toda a hierarquia do HTML computando informação geométrica de que cara render requer Dando as exatas coordenadas de onde cada nó deve aparecer na tela.

Slide 62

Slide 62 text

BODY IMG H1 Color: Red; HEAD HTML RENDER TREE Posição: (0,0) Dimensão: Viewport Dimensão: Block

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 65

Slide 65 text

PAINTING A camada UI Backend tem o papel de atravessar cada elemento da render tree desenhando usando toda a UI da página.

Slide 66

Slide 66 text

Olá

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

BYTES CHARACTERS CONSTRUÇÅO DE ÁRVORE TOKENIZAÇÅO JAVASCRIPT

Slide 69

Slide 69 text

USER INTERFACE BROWSER ENGINE RENDERING ENGINE NETWORKING JS INTERPRETER UI BACKEND

Slide 70

Slide 70 text

SPIDERMONKEY V8

Slide 71

Slide 71 text

O javascript pode criar e modificar todo o DOM ou o CSSOM. Quando o analisador do HTML encontra uma tag “script” ela para toda a construção da DOM e só retoma quando conclui a execução.

Slide 72

Slide 72 text

Para melhorar a experiencia do usuario o engine de renderização vai tentar mostrar o conteúdo na tela assim que possível então não espera que outro HTML seja parseado até começar a construir a página

Slide 73

Slide 73 text

OK DE QUE ISSO IMPORTA?

Slide 74

Slide 74 text

CRITICAL RENDER PATH

Slide 75

Slide 75 text

Série de eventos envolvendo baixar resources html css e scripts, processar e renderizar o primeiro pixel na tela.

Slide 76

Slide 76 text

Se a pagina html contêm algum script altamente bloqueante o render start, o tempo levado para receber o primeiro byte de dados para o URL primário, vai ser atrasado

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

A primeira visualização da página ou o que o usuário vê é crítica para experiência do usuário. Tentar otimizar cada passo no critical render path vai acelerar o processos de renderização

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

OTIMIZAR?

Slide 83

Slide 83 text

PRIORIDADES

Slide 84

Slide 84 text

Otimizando a ordem de cada recurso crítico baixado e fazendo lazy-loading recursos não críticos podemos minimizar o tempo de total do critical render path.

Slide 85

Slide 85 text

Digamos que você tem um arquivo Javascript: Esse script também é bloqueante na renderização do navegador pois aguarda até que o recurso seja retornado.

Slide 86

Slide 86 text

ASYNC vs DEFER

Slide 87

Slide 87 text

Indica que é um asset não bloqueante então deve ser executado de forma assíncrona(coisas pequenas ou prioritárias). Indica que o script só deve ser executado depois de toda a DOM ser parseada.

Slide 88

Slide 88 text

Tanto o HTML quanto o CSS são recursos bloqueantes, ou seja, não existe sem renderização sem que ambos tenham uma arvore de renderização.

Slide 89

Slide 89 text

MEDIA CSS

Slide 90

Slide 90 text

Bloqueia a renderização do navegador até que o recurso seja retornado.

Slide 91

Slide 91 text

Dependendo da orientação do dispositivo bloqueia a renderização do navegador até que o recurso seja retornado. Só aplica o CSS quando a página está sendo já gravada. Portanto é não bloqueante.

Slide 92

Slide 92 text

PRELOAD vs PREFETCH

Slide 93

Slide 93 text

Força o navegador a priorizar recursos que não devem ser bloqueados Avisa o navegador que recurso até é importante em futuras navegações mas não deve ser priorizado

Slide 94

Slide 94 text

INITIAL PAYLOAD

Slide 95

Slide 95 text

Minimizar o tamanho dos bytes de resources críticos pode reduzir o overhead no processo de renderização

Slide 96

Slide 96 text

IMAGENS Existem técnicas de otimização de imagens para reduzir o load time da página(compressão, escala, CSS sprites) Prefira efeitos CSS como sombras ou gradientes para evitar imagens.

Slide 97

Slide 97 text

Diminuir o tamanho do código de bibliotecas

Slide 98

Slide 98 text

React -> Preact Ramda -> Rambda Lodash -> UnderWater Immutable -> Immutable-Light

Slide 99

Slide 99 text

Diminuir o tamanho dos pacotes a serem carregados

Slide 100

Slide 100 text

WEBPACK

Slide 101

Slide 101 text

node_modules

Slide 102

Slide 102 text

DUPLICAÇAO DE CODIGO

Slide 103

Slide 103 text

SplitChunksPlugin Separa código que é da aplicação e o que é utilitário Listando bibliotecas como “vendor” faz com que se crie um arquivo individual que o browser consegue cachear o conteúdo com mais facilidade.

Slide 104

Slide 104 text

Pra lidar com código bloqueante Javascript...

Slide 105

Slide 105 text

CODE SPLITTING & LAZY LOAD

Slide 106

Slide 106 text

O code splitting permite que você divida seu código em pequenos bundles que podem ser carregados sob demanda ou em paralelo. Com isso você tem bundles menores e controle de prioridade sobre seus recursos.

Slide 107

Slide 107 text

/home /about /contact Pagina Inicial () => import('./About') () => import('./Contact)

Slide 108

Slide 108 text

ensure Dynamic Import está em stage3 da proposal para o js Plugin Babel (syntax-dynamic-import) require.ensure([/* dependencies */], require => { const Foo = require('foo'); }, error => { // handle error }, 'custom-bundle-name');

Slide 109

Slide 109 text

No content

Slide 110

Slide 110 text

Web Developers Google - Critical Rendering Path developers.google.com/web/fundamentals/performance/critical-re ndering-path/ How browsers work internally - Tali Garsiel - Front-Trends 2012 vimeo.com/44182484 How Browsers Work: Behind the scenes of modern web browsers html5rocks.com/en/tutorials/internals/howbrowserswork

Slide 111

Slide 111 text

OBRIGADA :) speakerdeck.com/anabastos anabastos.me github.com/anabastos @naluhh @anapbastos