Баба-Яга против! — Роман Дворнов, ostrovok.ru

114
Баба-яга против! Екатеринбург, 19 cентября 2014 Роман Дворнов

Upload: yandex

Post on 05-Dec-2014

521 views

Category:

Technology


2 download

DESCRIPTION

В последнее время во фронтенде появляется столько нового и внедряется настолько быстро, что не все успевают осознать последствия. Хорошо это или плохо? Рассмотрим некоторые новинки с точки зрения «за», а главное – «против».

TRANSCRIPT

Page 1: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Баба-яга против!

Екатеринбург, 19 cентября 2014

Роман Дворнов

Page 2: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

О себе• Работал в ostrovok.ru, Единный кошелек

• Автор basis.js

2

Page 3: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

О себе

3

• Работал в ostrovok.ru, Единный кошелек

• Автор basis.js

Page 4: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Сказка4

Page 5: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Сначала был Интернет…

5

Page 6: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Microsoft vs. Netscape

6

Page 7: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

7

Page 8: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

IE68

Page 9: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

9

IE, ты все делаешь не так – уходи!

Page 10: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

10

Page 11: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Победила дружба…

11

любовь к стандартам

Page 12: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

12

* …зуда, запора, вопросов о смысле жизни

Стандарты Средство от мигреней*

Page 13: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

“Проприетарные фичи, которые не прошли процесс стандартизации обычно имеют плохой дизайн,

даже когда идея была хорошей.”

13

– Lea Verou

http://habrahabr.ru/post/138252/Каждый раз, когда вы выдаете проприетарную фичу за CSS3 — умирает котенок

Page 14: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В идеале• предложение и обсуждение

• черновик стандарта

• пробные реализации

• стандарт

• официальные реализации

14

Page 15: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В идеале• предложение и обсуждение

• черновик стандарта

• пробные реализации

• стандарт

• официальные реализации

14

с префиксом или «за флагом»

Page 16: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В идеале• предложение и обсуждение

• черновик стандарта

• пробные реализации

• стандарт

• официальные реализации

14

с префиксом или «за флагом»

можно безопасно

использовать

Page 17: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В действительности• предложение и обсуждение

• черновик стандарта

• пробные реализации

• стандарт

• официальные реализации

15

Page 18: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

16

Page 19: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Promise Я обещаю быть лапочкой

17

Page 20: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Promise – "лекарство" от callback-hell

18

fronttalks.ru/events/2013-07/presentations/davydov/index.html Михаил Давыдов «Promise – это не больно»

Page 21: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Множество реализаций

19

Page 22: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Официальная спецификация

Promises/A+ promisesaplus.com

20

Page 23: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Давайте сделаем частью JavaScript!

21

* стало частью ES6

Page 24: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Мы знаем как надо – префиксы не нужны!

22

Page 25: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Должно было быть

23

!

var promiseSupported = 'Promise' in window;

Page 26: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В действительности

24

var NativePromise = window['Promise']; var nativePromiseSupported = NativePromise && // Some of these methods are missing from // Firefox/Chrome experimental implementations 'resolve' in NativePromise && 'reject' in NativePromise && 'all' in NativePromise && 'race' in NativePromise && // Older version of the spec had a resolver object // as the arg rather than a function (function(){ var resolve; new NativePromise(function(r){ resolve = r; }); return typeof resolve === 'function'; })();

Page 27: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

– Bill Gates

“Успех – паршивый учитель. Он заставляет умных людей думать, что они не могут

проиграть.”

25

Page 28: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Хотите использовать сегодня – готовьте полифил

26

Например, github.com/lahmatiy/es6-promise-polyfill

Page 29: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Зато нативные реализации лучше!

27

Page 30: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Правда?

28

BrowserTime, ms Memory, MB

Native Polyfill Native Polyfill

Chrome 35 162 50 10,5 2,7

Firefox 30 161 39 – –

IE11 – 12 – 2,8

gist.github.com/lahmatiy/d4d6316418fe349537dc

Page 31: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Promise-истерия

29

Page 32: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Применяй с умом!

Promise anti-patterns taoofcode.net/promise-anti-patterns/

30

Page 33: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Promise проникают в стандарты

31

Page 34: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

DOM4

32

Page 35: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

DOM4• декабрь 2013:

«Черновик стандарта DOM4 включает в себя Promises как примитив языка...»WSD: Сергей Константинов — Что интересного готовит нам W3Cwww.slideshare.net/yandex/w3c-28967881

32

Page 36: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

DOM4• декабрь 2013:

«Черновик стандарта DOM4 включает в себя Promises как примитив языка...»WSD: Сергей Константинов — Что интересного готовит нам W3Cwww.slideshare.net/yandex/w3c-28967881

• январь 2014: Promise исключены из DOM4 – теперь просто часть ES6

32

Page 37: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Ссылаются на DOM4• Web NFC

• Quota Management

• Web Cryptography

• Web MIDI

• Device Capabilities

• Messaging

• Contacts Manager

• Web Telephony

33

Вот так одна спецификация может

"отравить" другие

Page 38: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Ссылаются на ES6

34

• CSS Font Loading

• Web animations (с июля 2014)

• Service Workers

• TCP and UDP Socket

• Streams

• Battery Status

• Task Scheduler

Page 39: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Народное творчество:

FontStatusPromise ResponsePromise

AbortableProgressPromise …

35

Page 40: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

“Promises should be for one-and-done, non-interruptible,

atomic-ish operations.”

36

– Domenic DenicolaАвтор Q, Promises/A+, ES6 promise spec

Page 41: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Да вы упоролись!

“Promises should be for one-and-done, non-interruptible,

atomic-ish operations.”

36

– Domenic DenicolaАвтор Q, Promises/A+, ES6 promise spec

Page 42: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

37

Page 43: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Один подход не может быть применен везде и всегда.У каждой задачи – свое

решение.

Insight #1

38

Page 44: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

element.animate() Я заанимирую все

39

Page 45: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Часть крутой спеки

Web Animations dev.w3.org/fxtf/web-animations/

40

Page 46: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

41

Интерфейсы ! AnimationTimeline AnimationPlayer AnimationNode AnimationTimingReadOnly AnimationTiming ComputedAnimationTiming AnimationGroup AnimationNodeList AnimationSequence Animation Animatable AnimationEffect KeyframeEffect MotionPathEffect

Расширения ! Document timeline Element animate() getCurrentAnimations() getAnimationPlayers() ! PseudoElement (возможно) animate() getCurrentAnimations() getAnimationPlayers()

Web animations

Page 47: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

42

Интерфейсы ! AnimationTimeline AnimationPlayer AnimationNode AnimationTimingReadOnly AnimationTiming ComputedAnimationTiming AnimationGroup AnimationNodeList AnimationSequence Animation Animatable AnimationEffect KeyframeEffect MotionPathEffect

Расширения ! Document timeline Element animate() getCurrentAnimations() getAnimationPlayers() ! PseudoElement (возможно) animate() getCurrentAnimations() getAnimationPlayers()

Реализация в Blink AnimationPlayer ! source timeline startTime currentTime playbackRate playState ready finished cancel()! finish() play() pause() reverse() onfinish (уже нет в спеке)

Page 48: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

43

caniuseчто ты делаешь?

прекрати!

Page 49: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Какой будет стиль?

44

<div id="wat" style="background: green !important"> ... </div>

Page 50: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Добавим непредсказуемости

45

document.getElementById('wat').animate([ { backgroundColor: 'red' }, { backgroundColor: 'blue' }], { duration: 123});

А теперь и ты испытай неизведанное ...

Page 51: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Проблемы

• нет реализации остальной части спецификации (достаточно критичной)

• нет инфраструктуры

• нет инструментов

46

Page 52: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

47

Page 53: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Запилить новую штуку – мало! Нужны: завершенность, контроль и инструменты.

48

Insight #2

Page 54: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Web Components Я переверну веб

49

Page 55: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Совокупность технологий

• HTML imports

• <template>

• Custom elements

• Shadow DOM

50

Page 56: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Html imports w3c.github.io/webcomponents/spec/imports/

51

Page 57: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

<link rel="import" href="foo.html">

52

Page 58: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

53

Page 59: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Кажется хорошей идеей, но сложно, проблемы с

производительностью…

54

Page 60: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

<template>www.w3.org/TR/html5/scripting-1.html#the-template-element

55

Page 61: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Часть HTML5, самое безобидное в

Web Components

56

Page 62: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Название вводит в заблуждение

57

Page 63: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

“<template> provide a method for declaring inert

DOM subtrees…”

58

– HTML5

Page 64: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В действии

59

<template id="row"> <tr><td><td></template>!

var template = document.querySelector('#row');var row = template.content.cloneNode(true);

Page 65: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

С <template> не нужно

• ... костылей вроде:<script type="text/template" id="foo">..</script>

• ... делать преобразование:innerHTML → DOM

60

Page 66: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Custom elementsw3c.github.io/webcomponents/spec/custom/

61

Page 67: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

document.registerElement('custom-tag', { .. })

<custom-tag></custom-tag>

62

Page 68: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

В простых случаях может быть полезно,

хорошо полифилится

63

Page 69: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

асинхронность, бесконечное наследование

= мерцания при загрузке*

64

* FOUC (flash of unstyled content )

Page 70: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Shadow DOMw3c.github.io/webcomponents/spec/shadow/

65

Page 71: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Кажется все начиналось с<style scoped>

66

* пока только в Firefox, удалено в Chrome 35

Page 72: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Инкапсуляция DOM-фрагментов

67

Page 73: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

68

Shadow treeИмеют собственные стили, которые не пересекаются с другими shadow tree и с основным документом

Page 74: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

ад, ад, ад... и еще немного ада!

69

Page 75: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Например – события

70

Page 76: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

71

Shadow root

Node

Insertion point

Берем «обычное» дерево

Page 77: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

72

То же дерево «в профиль»

Page 78: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

73

Путь события

Page 79: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

73

Путь события

Page 80: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

73

Путь события

Поэтому теперь есть event.path

Page 81: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Все тривиально!

74

* на самом деле нет

Page 82: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Web Components кажутся очень сложными

75

Page 83: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

76

Page 84: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Веб-технологии всегда стремились быть простыми – это обеспечило им развитие

и популярность.77

Insight #3

Page 85: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

и тд и тп…

78

Page 86: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Почему это имеет значение?

79

Page 87: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Все, что попадает в веб-платформу остается в

веб-платформе

80

Page 88: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Цена ошибки очень высока

81

Page 89: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

<!doctype HTML>

82

Page 90: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

<blink>, <marquee>, <font>, …

83

Page 91: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

"FrontTalks".bold().italics()

> "<i><b>FrontTalks</b></i>"

84

Page 92: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Flexbox

85

3 спецификации

.block { display: -webkit-box; /* OLD */ display: -moz-box; /* OLD */ display: -ms-flexbox; /* TWEENER - IE 10 */ display: -webkit-flex; /* NEW - Chrome */ display: flex; /* NEW, Spec */}

.block { display: flex;}

Должно быть Реальность

Page 93: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Прогресс!

86

Page 94: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Больше API, больше функций, больше возможностей!

87

Page 95: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

А что же с тем что есть?

88

Page 96: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

border-radius

89

Chrome 5 Firefox 3.6 Opera 10.5 IE 8

2009

Page 97: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Угадай браузер

90

2010

3 4

1 2

Page 98: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Угадай браузер

90

Opera IE9

Firefox Chrome, Safari

2010

Page 99: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Проходят годы…

91

IE

FirefoxChrome, Safari, Opera

2014

Page 100: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

SVG – баг на баге и багом погоняет

92

Page 101: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

DOM Level 2 Traversal and Range

• 2000й год выпуска! • основа для работы с текстом • все браузеры ведут себя по разному, свои баги • не используется из-за нестабильности и неконсистености

• лучшая альтернатива – <canvas>93

Page 102: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

80/20

94

Page 103: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

80% задачи – 20% времени 20% задачи – 80% времени

95

Page 104: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

80% задачи – 20% времени 20% задачи – 80% времени

96

никогда

Page 105: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

97

Page 106: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

К чему все это?

98

Page 107: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Интересуйтесь новым

99

Читайте твитеры докладчиков, блоги браузеров, новости W3C

Page 108: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Пробуйте

100

Page 109: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Формируйте свое мнение

101

Page 110: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Будьте осторожны

102

Page 111: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Критикуйте ;)

103

Page 112: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

No bullshit!104

Page 113: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Save the Web!105

Page 114: Баба-Яга против! — Роман Дворнов, Ostrovok.ru

Спасибо!

106

Роман Дворнов @rdvornov [email protected]

basis.js basisjs.com

github.com/basisjs