51

Практическое применение HTML5 в Я.Почте

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Практическое применение HTML5 в Я.Почте
Page 2: Практическое применение HTML5 в Я.Почте

Практическое применение HTML5 в Я.ПочтеАлексей АндросовСтарший разработчик интерфейсов

Page 3: Практическое применение HTML5 в Я.Почте

3

Будущее? Реальность!

Page 4: Практическое применение HTML5 в Я.Почте

Как мы тестируем новые технологии?

4

Page 5: Практическое применение HTML5 в Я.Почте
Page 6: Практическое применение HTML5 в Я.Почте

6

Перед внедрением

1. После реализации новой фичи в каком-либо браузере смотрим где она может быть полезна в Почте

2. Изучаем фичу на живом прототипе, смотрим на границы возможностей, проблемы и баги

3. Принимаем решение о внедрении

Page 7: Практическое применение HTML5 в Я.Почте

7

После внедренияfunction errorLog(msg) { new Image().src = '/monitoring.txt?' + 'msg=' + encodeURIComponent(msg)}

window.onerror =function(msg, url, line){ errorLog(msg, url, line)}

try { // опасное или непонятное место} catch(e) { errorLog(e)}

Page 8: Практическое применение HTML5 в Я.Почте

8

После внедрения

Page 9: Практическое применение HTML5 в Я.Почте

WebSocket/SSE,

или как работает автообновление ящика в Я.Почте

9

Page 10: Практическое применение HTML5 в Я.Почте

10

Автообновление почтыЗадача:

— Поддерживать ящик в актуальном состоянии без перезагрузки страницы

— Надо ходить за данными в другой домен

Page 11: Практическое применение HTML5 в Я.Почте

11

Автообновление почтыРешение:

— WebSocket

— Server-Sent Events

— flash-websocket

— В качестве запасного варианта iframe + long-polling + postMessage

Page 12: Практическое применение HTML5 в Я.Почте

12

Что передаётся?{ "operation": "тип операции", "data": "xml-данные", "lcn": "номер ревизии", "connection_id": "id соединения"}

— lcn нужен, чтобы понимать, не пропустили ли мы сообщений, например, при разрыве соединения

— connecton_id нужен, чтобы понимать, откуда произошло изменение

Page 13: Практическое применение HTML5 в Я.Почте

13

Что получилось?— Простая реализация поддержки ящика в

актуальном состоянии на современных клиентских технологиях

— Постоянное соединение с сервером, а значит — минимальные задержки в доставке

Page 14: Практическое применение HTML5 в Я.Почте

WebSocket

14

Page 15: Практическое применение HTML5 в Я.Почте

15

WebSocket— Постоянное соединение

— Честный двухсторонний обмен данными без лишних телодвижений

— Не учитывается в ограничениях на количество одновременных подключений, т.к. другой протокол

— Возможность кроссдоменных запросов

— Chrome 4+, Firefox 6+, IE 10, Safari 5+

Page 16: Практическое применение HTML5 в Я.Почте

16

Автообновление почтыНедостатки

— Протокол и JS API до сих пор не утверждены как стандарт

— В JS API нельзя получить заголовки ответа. Например, вместо 403 надо отвечать специальным сообщением

— При потере интернета не всегда закрывается соединение. Нужны ping-pong события для проверки соединения

— Надо поддерживать много версий протокола: 75, 76 (до принятия в IETF), IETF 07-17

Page 17: Практическое применение HTML5 в Я.Почте

17

WebSocketFAIL— В ноябре 2010 года были опубликованы

исследования протокола. Из-за багов в реализации прозрачных прокси-серверов с помощью протокола можно подменять кэш сервера

— Реализован в Fx 4+ и Opera 11+. По-умолчанию выключен. В Fx 6+ включен по-умолчанию (MozWebSocket)

— Блокируется некоторыми антивирусами (например, Avast)

Page 18: Практическое применение HTML5 в Я.Почте

Server-Sent Events(EventSource)

18

Page 19: Практическое применение HTML5 в Я.Почте

19

Server-Sent Events

— Одностороннее постоянное соединение server→client

— Простейший text-based протокол поверх HTTP

— Обработчики onopen, onmessage, onerror

— Умеет сам переустанавливать соединение

— Поддержка: Chrome 6+, Fx 6+, Opera 11+, Safari 5+

Page 20: Практическое применение HTML5 в Я.Почте

20

Server-Sent Events

HTTP/1.1 200 OKCache-Control: no-cacheContent-Type: text/event-stream

: this is comment\n\n

data: some text\n\n

data: another message\ndata: with two lines\n\n

event: named_event\ndata: yet another message\n\n

Page 21: Практическое применение HTML5 в Я.Почте

21

Server-Sent EventsПроблемы:

— Стандарт находится в статусе «черновик»

— Нет поддержки CORS

— Если сервер не ответил HTTP 200 или Content-type: text/event-stream → onerror без дополнительных сведений

— В Fx и Opera onopen случается не сразу, надо отправить фейковые данные. Можно, например, комментарий

— Надо следить за readyState, чтобы отличить переподключение от закрытия соединения

Page 22: Практическое применение HTML5 в Я.Почте

22

Server-Sent EventsПроблемы:

— Именованное событие приходит в обработчик sse.addEventListener('event_name', cb)

— Если имени нет, пустое или 'message', то приходит в sse.addEventListener('message', cb)

— Как получать все именованные события в один обработчик - непонятно

Page 23: Практическое применение HTML5 в Я.Почте

Cross-site XHR + localStorage,

или как грузится Я.Почта

23

Page 24: Практическое применение HTML5 в Я.Почте

24

Кэширование статикиПроблема

— Для инициализации надо загрузить 1Мб (gzip - 350кб) статики (css+js+xsl)

— Браузерное кэширование работает, но возникают задержи, т. к. браузер пытается понять, надо ли обновить файл

— Браузерный кэш может вытесниться другими файлами

Page 25: Практическое применение HTML5 в Я.Почте

25

Кэширование статикиРешение

— Выносим логику инвалидации кэша на сторону JavaScript

— Для этого нужны кроссдоменный XHR, чтобы получить содержимое файлов, и localStorage, чтобы их хранить

Page 26: Практическое применение HTML5 в Я.Почте

26

Кэширование статикиПолучаем

— Данные из localStorage не удалятся, пока мы этого не захотим или пользователь их не очистит

— Нет задержек при обращении к кэшу

— Разгружаем статический кластер

Page 27: Практическое применение HTML5 в Я.Почте

localStorage

27

Page 28: Практическое применение HTML5 в Я.Почте

28

localStorage— Локальное постоянное key-value хранилище

текстовых данных

— Простое API: getItem(), setItem(), key(), clear()

— Chrome 4+, Firefox 3.5+, IE8+, Opera 10.5+, Safari 4+.

Page 29: Практическое применение HTML5 в Я.Почте

29

localStorageГлавное правило

Page 30: Практическое применение HTML5 в Я.Почте

30

localStorageГлавное правило

Все обращения к методам и свойствам надо оборачивать

в try-catch!

github.com/doochik/SafeLS

Page 31: Практическое применение HTML5 в Я.Почте

31

localStorage… а в IPad

try { ls.setItem(key, data);} catch(e) { ls.removeItem(key); ls.setItem(key, data)}

Page 32: Практическое применение HTML5 в Я.Почте

32

localStorageОграничения на домен

Все браузеры следуют этой рекомендации, но…

A mostly arbitrary limit of fve megabytes per origin is recommended.

dev.w3.org/html5/webstorage/#disk-space

Page 33: Практическое применение HTML5 в Я.Почте

33

localStorageОграничения на домен

— Chrome, Safari используют SQLite и UTF-16, поэтому записать можно ~2,5 млн. символов

— Fx, — SQLite + UTF-8, ~5 млн. символов

— IE — xml, ~5 млн. символов

— Opera — xml + base64, ~2 млн. символов, появляется сообщение с просьбой увеличить размер

— Если сделать hosted app для Chrome, то можно получить разрешение на безлимитный storage :)

Page 34: Практическое применение HTML5 в Я.Почте

34

localStorageГлобальные ограничения

— Chrome, Safari — нет

— Fx, IE ~5 млн. символов на домен 2-го уровня

— Opera — ~35 млн. символов на всё

User agents should guard against sites storing data under the origins other afliated sites, e.g. storing up to the limit in a1.example.com, a2.example.com, etc, circumventing the main example.com storage limit.

dev.w3.org/html5/webstorage/#disk-space

Page 35: Практическое применение HTML5 в Я.Почте

Кроссдоменный XHR

35

Page 36: Практическое применение HTML5 в Я.Почте

36

Cross-site XHR with CORS— Обычный XMLHtpRequest, но с возможностью

делать запросы в другой домен

— В ответе сервера должен появиться HTTP-заголовок «Access-Control-Allow-Origin: *»

— Chrome 3+, Firefox 3.5+, IE8+ (XDomainRequest), Safari 4+

<!–- Определение поддержки -->!!(window['XDomainRequest'] ||(window['XMLHttpRequest'] && 'withCredentials' in new XMLHttpRequest()));

Page 37: Практическое применение HTML5 в Я.Почте

37

Cross-site XHR with CORSПроблемы

— Не все прокси-сервера пропускают заголовки Access-Control-Allow-Origin

— XdomainRequest в IE не является полноценной заменой XHR, имеет ограниченный функционал (htp://clck.ru/QBRe)

— В IE9 в режиме IE9 виснут запросы

xdr['onprogress'] = function() {};

xdr['onerror'] = function(){ // fallback до обычный системы загрузки}

Page 38: Практическое применение HTML5 в Я.Почте

postMessage

38

Page 39: Практическое применение HTML5 в Я.Почте

39

postMessage— Асинхронный обмен данными между разными

window и origin (IE8 синхронный sic!)

— Поддержка в Chrome 4+, Firefox 3+, IE8+, Opera 9.5+, Safari 4+

— В Chrome, Fx 6+, Opera 10.5+, Safari можно отправлять объекты, в остальных — только строки

— Быстрее, чем window.setTimeout(cb, 0)

Page 40: Практическое применение HTML5 в Я.Почте

HTML5 data-* атрибуты

40

Page 41: Практическое применение HTML5 в Я.Почте

41

data-*

— element.dataset['name'] в 10 раз медленнее element.getAtribute('data-name')

— $('div').data('ids') === 2080000000089839400. Потому что слишком большое число :)

<div data-name="alexey" data-ids="2080000000089839302"> <!--- ... ---></div>

Page 42: Практическое применение HTML5 в Я.Почте

online/offline events

42

Page 43: Практическое применение HTML5 в Я.Почте
Page 44: Практическое применение HTML5 в Я.Почте

44

online/offline— Браузер может говорить, что поддерживает

события, а событий отсылать не будет

— Браузер может говорить, что поддерживает события, а события отправит только при ручном переключении в «Автономный режим»

— События могут быть в window и document

— Нужно полить свойство navigator.onLine

Page 45: Практическое применение HTML5 в Я.Почте
Page 46: Практическое применение HTML5 в Я.Почте

46

online/offline— Если ofine, значит нет ни одного активного

сетевого соединения

— Если online, есть хотя бы одно любое активное сетевое соединение. Это не означает, что есть доступ в интернет или до нужного ресурса

— Надо проверять реальный доступ до нужного ресурса (ajax, img, ...)

Page 47: Практическое применение HTML5 в Я.Почте

Cache manifest

47

Page 48: Практическое применение HTML5 в Я.Почте

48

Cache manifest— Нужен для ofine-кэширования веб-приложения

— Можно рассказать браузерам, какие именно файлы можно закэшировать, а за какими надо всегда ходить на сайт

— Обновили manifest — значит, вышла новая версия

— Все бы хорошо, но … Firefox до 4 версии не реагирует на обновление manifest

— дальше можно не тестировать :)

Page 49: Практическое применение HTML5 в Я.Почте

— После обновления версии надо перезагружать страницу

— Кэшируется страница, в которой указан manifest. А у нас там логин! Но это можно обойти с помощью Cache-Control: no-store

— В Firefox есть предупреждение о том, что сайт собирается что-то кэшировать

— Fallback-секция не работает

49

А если серьезно, то...

Page 50: Практическое применение HTML5 в Я.Почте

Вопросы?

50

Page 51: Практическое применение HTML5 в Я.Почте

Алексей АндросовСтарший разработчик интерфейсов

[email protected]

@doochik