81
Суперсилы Chrome Developer Tools Роман Сальников, 2ГИС [email protected] 1

Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

  • Upload
    yandex

  • View
    1.288

  • Download
    7

Embed Size (px)

DESCRIPTION

В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом. Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.

Citation preview

Page 1: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Суперсилы Chrome Developer Tools

Роман Сальников, 2ГИС

[email protected]

1

Page 2: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Page 3: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Код проекта - черный ящик

События ➔

?➔ Отрисовка

Внешние API ➔ ➔ Данные

Время ➔ ➔ Внешние API

3

Page 4: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

4

Page 5: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

DevTools обывателя

5

Page 6: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

DevTools профессионала

6

Page 7: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Тренировочная площадка

7

Page 8: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

1. Отладка

Page 9: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Баг - элемент добавляется дважды

9

Page 10: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Хардкорная обычная отладка1. Ищем по проекту что-то похожее

2. Читаем код

3. Ставим console.log и/или брэйкпоинт

4. Повторяем

10

Page 11: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Есть кое-что

мощнее

Page 12: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Умные брэйкпоинты— Изменения DOM

— XHR запросы

— Event Listeners

— Workers

12

Page 13: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Event Listeners

13

Page 14: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

DOM breakpoint

14

Page 15: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Асинхронные коллстэкиПробивают сквозь пространство и время

— setInterval

— setTimeout

— XMLHttpRequest

— promises

— requestAnimationFrame

— и т.д, и т.п

15

Page 16: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Обычный vs. Async коллстэкКоллстэк курильщика Коллстэк здорового человека

16

Page 17: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Async + breakpoints = ❤1. Включаем Async call stack

2. Ловим результат бага (DOM, XHR breakpoints)

3. Можем вернуться к истокам проблемы

4. ???

5. Profit

17

Page 18: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Async + breakpoints = ❤

18

Page 19: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Async + breakpoints = ❤

19

Page 20: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Console

Page 21: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

$0 + getEventListeners

21

Page 22: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Events

22

Page 23: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Отладка объектов JavaScriptvar watchMe = {};

Object.observe(watchMe, function() {

debugger;

});

watchMe.foo = 'bar'; // выполнение останавливается

01.

02.

03.

04.

05.

06.

23

Page 24: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Snippets

24

Page 25: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Инструменты для отладки— Умные брэйкпоинты

— Async call stack

— Console API

25

Page 26: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

2. FPS

Page 27: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Страница заметно

тормозит

Page 28: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

FPS meter

28

Page 29: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline

29

Page 30: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline

30

Page 31: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline

31

Page 32: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline— JavaScript

— Recalculate Style , Layout

— Paint

32

Page 33: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Recalculate Style— Собирает все стили

— Находит соответствие между элеметами DOM и селекторами

— Высчитывает Calculated Style для каждого элемента

33

Page 34: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Layout— Высчитывает геометрии элементов на основе стилей

34

Page 35: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Paint— Преобразует все, что было подсчитано, в пиксели

— Отрисовывает на экране

35

Page 36: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline

36

Page 37: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

37

Page 38: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

CPU profiler

38

Page 39: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

CPU profiler (Heavy)

39

Page 40: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

CPU profiler (Chart)

40

Page 41: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

CPU profiler (Chart)

41

Page 42: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Диагностика FPS JavaScript— CPU Profiler Tree - дает снимок, не дает понимания динамики

— CPU Profiler Chart - лучше, но сложно синхронизировать с Timeline

42

Page 43: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

43

Page 44: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Прокачанный Timeline— Включить режим экспериментов DevTools в chrome://flags

— Включить дополнительные настройки

— Наслаждаться результатом

44

Page 45: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Прокачанный Timeline

45

Page 46: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Прокачанный Timeline

46

Page 47: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Прокачанный Timeline

47

Page 48: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Прокачанный Timeline

48

Page 49: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Диагностика FPS Styles

49

Page 50: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Forced synchronous layout StylesBad way

Изменяемразмеры A

➔Invalidate

layout➔

Получаемразмеры

➔ Layout ➔Изменяемразмеры B

➔ . . .

Good way

Получаемвсе размеры

➔Изменяем

все размеры➔

Invalidatelayout

➔ Layout ➔ . . .

50

Page 51: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Диагностика FPS Styles

51

Page 52: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Мы поняли:— updateHeaderPosition - корень всех проблем

— Из нее вызывается много тяжелого кода jQuery

— Есть проблема с инвалидацией лэйаута

52

Page 53: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

function getHeaderOffset() {

return $(window).scrollTop()

- $('#pageHeader').offset().top;

}

01.

02.

03.

04.

53

Page 54: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

$('#pageHeaderText').css({

top: headerHeight/2 - (getHeaderOffset() / 2)

});

...

$('.letter').animate({

paddingLeft: getHeaderOffset() / 10,

paddingRight: getHeaderOffset() / 10

}, 0);

01.

02.

03.

04.

05.

06.

07.

08.

54

Page 55: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

var headerOffset = getHeaderOffset();

var destPadding = headerOffset / 10;

...

$('#pageHeaderText').css({

top: headerHeight/2 - (headerOffset / 2)

});

$('.letter').css({

paddingLeft: destPadding,

paddingRight: destPadding

});

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

55

Page 56: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

После исправления анимации

56

Page 57: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Диагностика FPS Paint— Paint Rectangles - показывает, какая область экрана перерисовывается

на каждом кадре.

— Чем реже требуется перерисовка, тем лучше

— Чем меньше область перерисовки, тем лучше

57

Page 58: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Paint Rectangles

58

Page 59: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Решение проблемы с перерисовкой

59

Page 60: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Решение проблемы с перерисовкой

60

Page 61: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline после всех изменений

61

Page 62: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

62

Page 63: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Так что же всё-таки делать с FPS?— FPS meter

— Timeline

— JavaScript CPU Profiler / Canary Timeline

— Styles Обращаем внимание на предупреждения

— Paint Paint Rectangles, скрываем подозрительные элементы

63

Page 64: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

3. Память

Page 65: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Page 66: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Timeline умеет показывать расходуемуюпамять

66

Page 67: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Heap snapshots

67

Page 68: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Heap snapshots

68

Page 69: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Heap snapshots

69

Page 70: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Detached nodes

70

Page 71: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

71

Page 72: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

После устранения проблемы

72

Page 73: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Память— Изолируем проблему

— Проверяем с помощью Timeline (forced GC)

— Определяем, что искать

— Сравниваем до/после через Heap Snapshots

73

Page 74: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Итоги

Page 75: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Chrome DevTools помогает— Отлаживать

— Изучать незнакомый код

— Искать проблемы с производительностью

75

Page 76: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Пример из этой презентацииhttps://github.com/bardt/devtools_training_app

Пул-реквесты приветствуются. Сделаем этот проект еще хуже!

76

Page 77: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Если хочется еще deeperОтладка

— Debugging Asynchronous JavaScript with Chrome DevTools - Pearl Chen

— Using the Console

— Breakpoints on JavaScript Event Listeners

77

Page 78: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Если хочется еще deeperFPS и память

— Advanced performance tooling in Chrome DevTools - Paul Irish

— Parallax Performance [CSSConfUS2014] - Paul Irish

— JavaScript Memory Management - Addy Osmani

— GPU boundedness - Nat Duca

78

Page 80: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

К чему это все?— Осваивайте инструменты, упрощающие вам жизнь

— Не растрачивайте время впустую

— Пишите больше фич и получайте от этого кайф

80

Page 81: Суперсилы Chrome DevTools — Роман Сальников, 2ГИС

Спасибо!