Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Navegadores por de baixo dos panos - Intercon2018

Navegadores por de baixo dos panos - Intercon2018

Ana Luiza Portello

October 06, 2018
Tweet

More Decks by Ana Luiza Portello

Other Decks in Programming

Transcript

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

    View Slide

  2. 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

    View Slide

  3. NAVEGADORES POR DE
    BAIXO DOS PANOS

    View Slide

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

    View Slide

  5. Qual a função do navegador?

    View Slide

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

    View Slide

  7. View Slide

  8. COMPONENTES PRINCIPAIS DO
    NAVEGADOR

    View Slide

  9. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

  10. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

  11. USER INTERFACE

    View Slide

  12. View Slide

  13. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

  14. 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)

    View Slide

  15. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

  16. RENDERING ENGINE

    View Slide

  17. WEBKIT GECKO BLINK TRIDENT

    View Slide

  18. THE MAIN FLOW

    View Slide

  19. anabastos.me

    View Slide

  20. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. O conteúdo requisitado é carregado em
    pequenos chunks.

    View Slide

  25. View Slide

  26. CONCURRENT REQUESTS

    View Slide

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

    View Slide

  28. FLUXO DE
    RENDERIZAÇAO

    View Slide

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

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

    View Slide

  30. 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?


    View Slide

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

    View Slide

  32. 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

    View Slide

  33. 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”

    View Slide

  34. 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”.

    View Slide

  35. CHARACTERS(UTF-8)
    ... Olá
    Intercon
    tudo bem?
    CONSTRUÇÅO DE
    ÁRVORE
    TOKENIZAÇÅO
    ANALISE LEXICA
    ANALISE SINTATICA
    {
    PARSER

    View Slide

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

    View Slide

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

    View Slide

  38. Eu vou no intercon
    Pronome Verbo Contração Substantivo

    View Slide

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

    View Slide

  40. Hello
    startTag Text endTag

    View Slide

  41. Eu vou no intercon Hello
    HTML
    BODY
    ‘Hello’
    ?

    View Slide

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



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

    ImageTag

    View Slide


  43. span { clor: #FFFF }
    consolr.log

    View Slide

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

    View Slide

  45. 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

    View Slide

  46. HTMLHtmlElement
    HTMLBodyElement
    HTMLHeaderElement
    HTMLHeadElement
    Olá


    l
    á
    O

    HTMLImageElement

    View Slide

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

    Olá





    View Slide

  48. HTMLHtmlElement
    HTMLBodyElement HTMLHeadElement
    HTMLHeaderElement
    Olá
    HTMLDivElement
    HTMLImageElement
    HTMLDivElement
    HTMLImageElement

    View Slide

  49. 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.

    View Slide

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

    View Slide

  51. 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

    View Slide

  52. “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.

    View Slide

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

    View Slide

  54. 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.

    View Slide

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

    View Slide

  56. DOM
    CSSDom

    View Slide

  57. 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.

    View Slide

  58. View Slide

  59. DOM
    CSSDom
    Render
    Tree
    ATTACHMENT

    View Slide

  60. BODY
    IMG
    H1
    Color: Red;
    HEAD
    HTML
    RENDER TREE

    View Slide

  61. 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.

    View Slide

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

    View Slide

  63. View Slide

  64. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

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

    View Slide

  66. Olá

    View Slide

  67. View Slide

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

    View Slide

  69. USER INTERFACE
    BROWSER ENGINE
    RENDERING ENGINE
    NETWORKING
    JS
    INTERPRETER
    UI BACKEND

    View Slide

  70. SPIDERMONKEY V8

    View Slide

  71. 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.

    View Slide

  72. 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

    View Slide

  73. OK
    DE QUE ISSO
    IMPORTA?

    View Slide

  74. CRITICAL
    RENDER PATH

    View Slide

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

    View Slide

  76. 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

    View Slide

  77. View Slide

  78. View Slide

  79. 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

    View Slide

  80. View Slide

  81. View Slide

  82. OTIMIZAR?

    View Slide

  83. PRIORIDADES

    View Slide

  84. 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.

    View Slide

  85. 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.

    View Slide

  86. ASYNC vs DEFER

    View Slide


  87. 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.

    View Slide

  88. 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.

    View Slide

  89. MEDIA CSS

    View Slide


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

    View Slide

  91. media=”orientation:portrait”>
    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.

    View Slide

  92. PRELOAD vs
    PREFETCH

    View Slide


  93. 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

    View Slide

  94. INITIAL
    PAYLOAD

    View Slide

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

    View Slide

  96. 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.

    View Slide

  97. Diminuir o tamanho do
    código de bibliotecas

    View Slide

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

    View Slide

  99. Diminuir o tamanho
    dos pacotes a serem
    carregados

    View Slide

  100. WEBPACK

    View Slide

  101. node_modules

    View Slide

  102. DUPLICAÇAO DE CODIGO

    View Slide

  103. 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.

    View Slide

  104. Pra lidar com código
    bloqueante
    Javascript...

    View Slide

  105. CODE SPLITTING
    &
    LAZY LOAD

    View Slide

  106. 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.

    View Slide

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

    View Slide

  108. 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');

    View Slide

  109. View Slide

  110. 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

    View Slide

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

    View Slide