Алексей Андросов "html5 в Я.Почте (websocket, localstorage, cross-site...

22
HTML5 в Я.Почте Алексей Андросов Старший разработчик интерфейсов Я.Субботник, Киев, 28 мая 2011 года

Upload: yandex

Post on 22-Nov-2014

1.521 views

Category:

Technology


7 download

DESCRIPTION

28 мая 2011, Я.Субботник в Киеве Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)" О докладе: Вопросы практического применения современных технологий передачи и хранения данных в браузере на примере Яндекс.Почты, проблемы и ограничения, с которыми можно столкнуться, а также способы их решения. Для чего нужны WebSocket, localStorage и кроссдоменные AJAX запросы? Как реализовать их поддержку с учетом старых браузеров, которые не поддерживают эти технологии? Как обойти проблемы и баги в этих технологиях?

TRANSCRIPT

Page 1: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

HTML5 в Я.Почте

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

Я.Субботник, Киев, 28 мая 2011 года

Page 2: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

2

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

Page 3: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

3

WebSocket— Забудьте про polling, long-polling и

comet!

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

— Идеально для любых push-уведомлений (например, чат)

— Chrome 4+, Safari 5+, Firefox 4+, Opera 11+.

FAIL! 14% пользователей

— 50% пользователей Я.Почты

Page 4: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

4

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

текстовых данных в браузере

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

— 88% пользователей Я.Почты

Page 5: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

5

Cross-site XHR with CORS— Забудьте про проблемы междоменного

общения!

— Разносим службы по разным доменам — эффективная балансировка нагрузки

— Обычный XMLHttpRequest, но с возможностью делать запросы в другой домен

— Chrome 3+, Firefox 3.5+, IE8+, Safari 4+

— 70% пользователей Я.Почты

Page 6: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

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

6

Page 7: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

7

Автообновление почтыСервер: Xiva (HTTP Extended Event Automata)

Лицензия GPL, github.com/highpower/xiva

— Специально написан, чтобы держать много подключений

— Занимается только доставкой push-уведомлений

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

Page 8: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

8

Автообновление почтыТри варианта работы в браузере:

— WebSocket (Chrome 4+, Safari 5+)

— Flash WebSocket (на основе web-socket-js)

— Iframe + long-polling + postMessage

Page 9: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

9

Автообновление почтыНедостатки Flash— Плохая реализация для не-Windows ОС

— После реализации WSS размер возрастает до 200кб

— Если что-то пошло не так, то flash сразу падает

— Отказываемся в пользу XDR + long-polling или comet

Page 10: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

10

Автообновление почтыПреимущества WebSocket— Не учитывается в ограничениях на

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

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

Page 11: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

11

Автообновление почтыНедостатки WebSocket— Протокол и API до сих пор не

утверждены как стандарт

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

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

Page 12: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

12

Автообновление почтыFAIL WebSocket— В ноябре 2010 года были опубликованы

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

— Как и когда это будет исправлено — непонятно

— WebSocket по-умолчанию отключен в Firefox и Opera

Page 13: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

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

13

Page 14: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

14

localStorage + Cross-site XHR

С помощью кроссдоменных запросов забираем CSS, JS, XSL (~1Мб) со статического кластера и записываем ее в localStorage.

В ключи к данным добавляется текущая версия, чтобы точно понять, когда нам надо обновить статику.

Итог: ускорение загрузки Я.Почты на 1,5-3 секунды.

Page 15: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

15

localStorage

Методы: getItem, setItem, key, clear

Свойства: length, remainingSpace (IE)

<!–- Определение поддержки localStorage © Modernizr -->try { return !!localStorage.getItem;} catch(e) { return false;}

Все методы надо оборачивать в try-catch!

Page 16: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

16

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

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

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

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

Page 17: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

17

localStorageОграничения на домен— Chrome, Safari используют SQLite и UTF-

16, поэтому записать можно ~2,5 млн. символов

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

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

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

Page 18: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

18

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

— Chrome, Safari — нет

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

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

User agents should guard against sites storing data under the origins other affiliated 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 19: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

19

Cross-site XHR with CORS

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

CORS — Cross-Origin Resource Sharing

(http://www.w3.org/TR/access-control/)

Браузер отправляет дополнительный заголовок «Origin: http://mail.yandex.ru»

Сервер отвечает «Access-Control-Allow-Origin: *»

Page 20: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

20

Cross-site XHR with CORSПроблемы— Не все прокси-сервера пропускают

заголовки Access-Control-Allow-Origin

— XDomainRequest не является заменой XHR, имеет ограниченный функционал

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

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

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

Page 21: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

Вопросы?

21

Page 22: Алексей Андросов "HTML5 в Я.Почте (WebSocket, localStorage, Cross-site XHR)"

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

[email protected]