Slide 1

Slide 1 text

ブラウザの気持ち勉強会 Kenju Wagatsuma Cookpad Inc. August 22th, 2019

Slide 2

Slide 2 text

Elementary ● Modern Browser Components ○ Rendering Engine ○ JavaScript Engine ● Rendering Process ○ Loading (Downloading + Parsing) ○ Scripting ○ Rendering (Calculating Style + Layout) ○ Painting (Painting + Rasterizing) ● Render Tree ○ Document Object Model (DOM) ○ CSS Object Model (CSSOM) ● Metrics ○ Time-To-First-Byte (TTFB) ○ First Meaningful Paint (FMP) ○ First Contentful Paint (FCP) ● iframe ● Shadow DOM ○ Super Tree ○ Light Tree & Shadow Tree ○ Divide and Conquer ○ CSS Selector Matching ○ Incremental Shadow DOM ● Web Workers API ○ Web Worker ○ Service Worker ● Resource Hint ○ preload ○ preconnect ○ prefetch Advanced

Slide 3

Slide 3 text

Elementary

Slide 4

Slide 4 text

Modern Browser Components ● Rendering Engine ○ HTML/CSS の描画エンジン ○ メールクライアント等ブラウザ以外の場面でも利用 ○ Graphic Engine を利用し画面に描画 ● JavaScript Engine ○ JavaScript の字句解析・パース・AST 生成・最適化・実 行などの機能を持つ

Slide 5

Slide 5 text

Rendering Engine Browser Rendering Engine Graphic Engine Google Chrome Blink Skia Mozilla Firefox Gecko Skia Safari WebKit CoreGraphics Microsoft Edge EdgeHTML -> Blink -

Slide 6

Slide 6 text

JavaScript Engine Browser JavaScript Engine Google Chrome V8 Mozilla Firefox SpiderMonkey Safari JavaScriptCore Microsoft Edge Chakra

Slide 7

Slide 7 text

Rendering Process ● Loading (Downloading + Parsing) ● Scripting ● Rendering (Calculating Style + Layout) ● Painting (Painting + Rasterizing)

Slide 8

Slide 8 text

Rendering Process Loading Scripting Rendering Painting

Slide 9

Slide 9 text

Rendering Process Loading Scripting Rendering Painting ● Download ● Parse ● Scripting ● Calculate Style ● Layout ● Painting ● Rasterizing ● Composite Layers

Slide 10

Slide 10 text

Loading (Download) ● 指定された URL から、HTML をダウンロード ● HTML に記載されている関連リソースもダウンロード ○ CSS ○ JavaScript ○ Media

Slide 11

Slide 11 text

Loading (Download) 各リソースを取得するまでの流れ ● DNS Lookup ● TCP Handshake (3-way handshake) ● TLS Handshake (if https://, wss://, etc.) ● HTTP Request ● HTTP Response

Slide 12

Slide 12 text

Loading (Parse) ● HTML or XML および CSS ファイル(バイト文字列)をパー スして DOM / CSSOM に変換 ○ “W3C HTML5 standard” に準拠 ● 木構造(Nodes, Edges) で表現することでプログラミングし やすい ○ 探索、クローン、更新といった操作

Slide 13

Slide 13 text

Render Tee ● Render Tree ○ Document Object Model (DOM) ■ <- HTML/XML ■ 文書の構造を表現 ○ CSS Object Model (Model) ■ <- CSS ■ 文書の見た目を表現

Slide 14

Slide 14 text

Link: Ilya Grigorik, “Constructing the Object Model”, Google Web Fundamentals

Slide 15

Slide 15 text

Link: Ilya Grigorik, “Constructing the Object Model”, Google Web Fundamentals

Slide 16

Slide 16 text

Scripting ● JavaScript 実行フェーズ ○ Download => JavaScript ファイル(バイト文字列) ○ 字句解析 => Token ○ 構文解析 => AST ○ コンパイル => machine code

Slide 17

Slide 17 text

Rendering (Calculate Style) ● DOM の全ての Nodes に対して Style を計算する ○ ある特定の Node に対して ○ CSSOM を参照し ○ 最終的な CSS Properties を計算する

Slide 18

Slide 18 text

Rendering (Calculate Style)

Slide 19

Slide 19 text

CSS Selector Matching 探索は Right-to-Left / Bottom-to-Top ● CSS Selector は Right-to-Left ○ 内部表現は Singly Linked List ● CSSOM は Bottom-to-Top ○ つまり木構造の下側から探索が開始される

Slide 20

Slide 20 text

@hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM”

Slide 21

Slide 21 text

Rendering (Layout) ● DOM の各 Nodes に当たる CSS Properties が分かったの で、レイアウト情報を決定する ○ size / margin / padding / position / z-index

Slide 22

Slide 22 text

Link: Ilya Grigorik, “Render-tree Construction, Layout and Paint”

Slide 23

Slide 23 text

Painting ● Render Tree の情報から、利用する Graphic Engine 向け の命令を生成する ○ ex) Skit は C++ のライブラリなので、C++ ソースコードと して命令する

Slide 24

Slide 24 text

Painting (Rasterizing) ● Render Tree の情報を、Graphic Engine を利用し、Raster Representation に変換する ○ 2 次元画像を表現する方式の一つ。Raster はブラウン 管式のテレビやディスプレーの水平方向の走査線 ○ いわゆる「Bitmap」

Slide 25

Slide 25 text

@kosamari, “Inside look at modern web browser (part 3)”

Slide 26

Slide 26 text

Metrics ● First Paint (FP) ● First Meaningful Paint (FMP) ● First Contentful Paint (FCP) ● DOMContentLoaded (DCL) ○ DOM の解析が終了 ● OnLoad (L) ○ 画像などすべてのリソースの読み込みが完了

Slide 27

Slide 27 text

https://cookpad.com Peformance Metrics via Google Chrome

Slide 28

Slide 28 text

Navigatoin Timing API ● ブラウザで発生する一連のイベントを取得できる ● JavaScript から取得できる ● 単位は milliseconds ○ 詳細は “DOMHighResTimeStamp” の仕様まで

Slide 29

Slide 29 text

W3C “Navigation Timing” W3C Recommendation 17 December 2012

Slide 30

Slide 30 text

RAIL https://developers.google.com/web/fundamentals/performance/rail

Slide 31

Slide 31 text

Advanced

Slide 32

Slide 32 text

Shadow DOM ● Web の世界に “scope” の概念を導入 ○ DOM を標準 API レベルで「カプセル化」 ● メリット ○ 実装の詳細を隠蔽できる ○ 相互に干渉しあわない styles markup ○ vanilla JavaScript で表現できる

Slide 33

Slide 33 text

Shadow DOM ● 例えば。。。 ○ id / className の衝突でレイアウトが壊れない ○ 実装の詳細を知らなくても安心して外部コンポーネント が利用できる

Slide 34

Slide 34 text

Shadow DOM ● 達成できる成果 ○ チームの責任分界点を意識したフロントエンド開発 ○ “Microfrontends” ?

Slide 35

Slide 35 text

http://w3c.github.io/webcomponents/spec/shadow/

Slide 36

Slide 36 text

https://caniuse.com/#feat=shadowdomv1

Slide 37

Slide 37 text

DevBytes: Web Components - Shadow Dom document HTMLElement (shadow host) shadow root shadow content

Slide 38

Slide 38 text

Shadow DOM ● Browser support check ○ const supportsShadowDOMV1 = !!HTMLElement.prototype.attachShadow; ● Polyfill あり ○ https://github.com/webcomponents/polyfills/tree/master/packages/shadydom ○ https://github.com/webcomponents/polyfills/tree/master/packages/shadycss

Slide 39

Slide 39 text

Web Components 再利用可能な Component based development を実現する一 連の技術の総称 ● HTML Templates ● HTML Imports ● Shadow DOM ● Custom Elements

Slide 40

Slide 40 text

https://pwd-minesweeper.netlify.com

Slide 41

Slide 41 text

https://pwd-minesweeper.netlify.com

Slide 42

Slide 42 text

https://pwd-minesweeper.netlify.com

Slide 43

Slide 43 text

Google Chrome Developer Tool

Slide 44

Slide 44 text

MDN web docs “: The Video Embed element”

Slide 45

Slide 45 text

Shadow DOM Terminology ● Light Tree ○ shadow host 側の Tree(使い手から見える、光) ● Shadow Tree ○ 使い手から見えない(実装の詳細、影) ● Super Tree ○ 複数の DOMTree から構成される Tre

Slide 46

Slide 46 text

@hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM”

Slide 47

Slide 47 text

@hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM”

Slide 48

Slide 48 text

@hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM”

Slide 49

Slide 49 text

(再)CSS Selector Matching 探索は Right-to-Left / Bottom-to-Top ● CSS Selector は Right-to-Left ○ 内部表現は Singly Linked List ● CSSOM は Bottom-to-Top ○ つまり木構造の下側から探索が開始される

Slide 50

Slide 50 text

@hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM”

Slide 51

Slide 51 text

Web Workers API ● Dedicated Worker ○ コンテキスト別(タブ別) ● Shared Worker ○ コンテキスト共有型(タブ間共有) ● Service Worker ○ ページとは独立して動く JavaScript コンテキスト

Slide 52

Slide 52 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 53

Slide 53 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 54

Slide 54 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 55

Slide 55 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 56

Slide 56 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 57

Slide 57 text

@kenju_wagatsuma, “TechBuzz 第17回 HTML5+JS 講演資料”

Slide 58

Slide 58 text

Usage ● Canvas を用いた画像処理 ● 動画や音声の解析処理 ● IndexedDB API や Web Storage API を用いた処理 ● その他 heavy load な処理 ○ スペルチェックなどの構文解析 ○ JSON や文字列の処理

Slide 59

Slide 59 text

Warning!!! ● DOM は触れません ○ https://github.com/ampproject/worker-dom などの動きはあります ● Memory Usage に注意してください ○ worker pool のライブラリは多数あります ● データの受け渡し時の空間計算量は意識してください ○ postMessage / onmessage のメッセージは clone されます!!! ○ ArrayBuffer の所有権 (Transferable Objects) を受け渡す実装が王道 ■ つまり参照渡し

Slide 60

Slide 60 text

Service Worker a.k.a. ● “Better AppCache” ● “Browser built-in HTTP Proxy” ● “Background JavaScript context”

Slide 61

Slide 61 text

Matt Gaunt, “Service Workers: an Introduction”, Google Web Fundamentals

Slide 62

Slide 62 text

Service Worker ● Use “Workbox” library for production ready app ○ Caching Strategy ○ Background Sync API ○ Debugging ○ Plugins (e.g. Google Analytics, Google Fonts API)

Slide 63

Slide 63 text

https://developers.google.com/web/tools/workbox/

Slide 64

Slide 64 text

https://pwd-minesweeper.netlify.com

Slide 65

Slide 65 text

Resource Hint + Preload ● Resource Hint ○ dns-prefetch ○ preconnect ○ prefetch ○ prerender ● preload

Slide 66

Slide 66 text

Refereces ● 久保田 光則『Webフロントエンド ハイパフォーマンス チューニング』 ● @hayatoito “ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM” ● @nhiroki “Service Worker スクリプトのインストールと更新処理” ● @kosamari “Inside look at modern web browser (part 1 ~ 4)” ● Ilya Grigorik “Constructing the Object Model”, Google Web Fundamentals ● Ilya Grigorik “Render-tree Construction, Layout, and Paint”, Google Web Fundamentals ● Eric Bidelman, “Shadow DOM v1: Self-Contained Web Components”, Google Web Fundamentals ● Matt Gaunt, “Service Workers: an Introduction”, Google Web Fundamentals ● W3C “Navigation Timing” W3C Recommendation 17 December 2012 ● 69log, “resouce hintsとpreloadを使ってリソースの取得を最適化する” ● [email protected], “Incremental Shadow DOM” ● Kenju “Web Workers +α” http://bit.ly/2ZhpMCB

Slide 67

Slide 67 text

Thank you!