1. yandex maps

66
JS API Яндекс.Карт 2.1 Почему и зачем мы меняем API? Сергей Константинов руководитель службы разработки API Яндекс.Карт

Upload: ontico

Post on 15-May-2015

336 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1. yandex maps

JS API Яндекс.Карт 2.1Почему и зачем мы меняем API?

Сергей Константиновруководитель службы разработки API Яндекс.Карт

Page 2: 1. yandex maps

Обратная совместимость• Экономит деньги• Держит карму

в чистоте• Клиенториентировано!

Page 3: 1. yandex maps

API 2.1Встречайте: JS API 2.1:• Мы сломали обратную

совместимость*

Page 4: 1. yandex maps

API 2.1*На самом деле, нет

Page 5: 1. yandex maps

API 2.1*На самом деле, нет• Мы продолжаем поддерживать

предыдущие мажорные версии• Мы не озвучиваем сроки

прекращения поддержки, потому что их нет

Page 6: 1. yandex maps

API 2.1

Page 7: 1. yandex maps

Зачем?• Новые технологии• Новые тренды в дизайне• Новые времена• Нам надоело поддерживать старый

код, мы хотим писать новый• Прост))

Page 8: 1. yandex maps

Зачем?Правильный ответ:• Чтобы решать задачи

пользователя

Page 9: 1. yandex maps

ЗадачиПо большому счёту, есть два типа задач:• поддержка "железа"• поддержка кейсов

Page 10: 1. yandex maps

ЗадачиС поддержкой кейсов всё сложнее, чем кажется. Кейсы есть:• у нас• у вебмастеров• у пользователей

Page 11: 1. yandex maps

ЗадачиДавайте лучше на конкретных примерах

Page 12: 1. yandex maps

Элементы управленияВ API 2.0 у нас есть прекрасный набор элементов управления

Page 13: 1. yandex maps

Проблема

Page 14: 1. yandex maps

Проблема

Page 15: 1. yandex maps

Что делать?• Добавить fullscreen• Заодно чуть

лучше станетна мобильных

Page 16: 1. yandex maps

Что делать?• Адаптивные контролы

Page 17: 1. yandex maps

Что делать?• Добавить стандартные наборы

элементов управления• Лучший программный

интерфейс – хорошо подобранный default

Page 18: 1. yandex maps

Что делать?• История успеха:http://tech.yandex.ru/events/yac/2013/talks/1113/

Page 19: 1. yandex maps

Вывод?• Иногда разработчику нужно

дать свободу так, чтобы он ей не пользовался

Page 20: 1. yandex maps

Ещё проблема• Объём кода в API давно вышел

за пределы разумного• Долго грузится, долго парсится,

долго исполняется• 800+ различных сущностей

Page 21: 1. yandex maps

Решение 1.0• Грузим всё сразу:

• Не айс

Page 22: 1. yandex maps

Решение 1.1• Выделяем дополнительную

функциональность в подгружаемые модули:

Page 23: 1. yandex maps

Решение 1.1• Однако за время пути базовая

функциональность успела подрасти

• Гигантский файл с данными• Лишние запросы за CSS и

картинками

Page 24: 1. yandex maps

Решение 2.0• Режем по живому:– делим функциональность на

пакеты– самый "маленький" пакет

(package.map) содержит самый минимум – только карту

Page 25: 1. yandex maps

Решение 2.0• Грузим по требованию:– данные по масштабам и

копирайтам теперь не грузятся, а запрашиваются при смене центра

– пользователь может подгружать функциональность, когда она ему реально потребовалась

Page 26: 1. yandex maps

Решение 2.0• Экономим запросы:– CSS теперь отдаётся вместе с JS– Картинки кодируем прямо в CSS

Page 27: 1. yandex maps

Решение 2.0• У нас получилось?– минимальная сборка:

– максимальная сборка:

Page 28: 1. yandex maps

Решение 2.0• Отгадайте, сколько

пользователей грузит минимальную сборку?

Page 29: 1. yandex maps

Решение 2.0• На самом деле, так не работает• Не нужно надеяться на то, что

пользователь решит проблему, которую вы сами решить не смогли

Page 30: 1. yandex maps

Решение 2.1• Один package.full• Модели грузим сразу,

отображения – по требованию

Page 31: 1. yandex maps

Решение 2.1• Например, пользователь

включил линейку:

• Ушёл запрос за графикой:

Page 32: 1. yandex maps

Решение 2.1• Для этого нам пришлось очень

существенно изменить интерфейсы– getOverlay() -> Promise– balloon.open() -> Promise

Page 33: 1. yandex maps

Решение 2.1• Под капотом: новая модульностьhttps://github.com/ymaps/modules• Асинхронный require• Асинхронный provide• Работает на клиенте и на сервере

Page 34: 1. yandex maps

Ещё проблема• Мы стараемся держаться

плотного графика, выпуская релиз раз в 3-4 недели

• Но мы не хотим при этом что-нибудь сломать пользователям

Page 35: 1. yandex maps

Решение 1.0• Можно подключать API с

указанием мажорной (1.0) или полной (1.0.8) версии

• Мало функциональности – мало багов

Page 36: 1. yandex maps

Решение 1.1• А что, схема времён 1.0 по-

прежнему работает!• А если что, мы выпустим релиз

1.1.5-а, никто же и не заметит

Page 37: 1. yandex maps

Решение 2.0• Теперь у нас три версии:– 2.0 – последняя выпущенная– 2.0-stable – последняя

"стабильная"– 2.0.xx – прямая ссылка на

конкретную версию

Page 38: 1. yandex maps

Решение 2.0Да, но…• Откуда у нас возьмётся

"стабильная" версия?• В каждой версии мы правим

баги и выкатываем фичи

Page 39: 1. yandex maps

Решение 2.0-с-половинойМы разделяем релизы• За фичовым релизом

обязательно следует дебажный• stable переключается только на

дебажный

Page 40: 1. yandex maps

Решение 2.0-с-половинойТеперь у нас всё просто• stable – это тот же 2.0, только

без последних фич• Отгадайте, какой ответ на

вопросы в техподдержку стал самым популярным

Page 41: 1. yandex maps

Решение 2.0-с-половинойТогда мы стали делать RC• Версия-релиз кандидат

доступна только по прямому URL-у и тестируется несколько дней

• Потом переключается 2.0

Page 42: 1. yandex maps

Решение 2.0-с-половинойОтгадайте, сколько багов нам зарепортили в версиях-релиз кандидатах?

Page 43: 1. yandex maps

Решение 2.1Мы держим два алиаса:• 2.1-dev: релиз-кандидат,

последняя выпущенная версия• 2.1: если в RC не найдено

ошибок, 2.1 переключается на него

Page 44: 1. yandex maps

Решение 2.1Будет ли оно работать?Да кто же его знает. Практика – критерий истины.

Page 45: 1. yandex maps

Теория vs. ПрактикаВ отличие от задач пользователей, проблемы "с окружающим миром" имеют свойство случаться ВНЕЗАПНО.

Page 46: 1. yandex maps

Например• Экраны с device pixel ratio > 1

победоносно шествуют по планете

Page 47: 1. yandex maps

Решение• Каждую картинку, каждый

фончик, каждый источник тайлов отрисовываем в нескольких разрешениях

• Каждый программный интерфейс принимает ImageSet

Page 48: 1. yandex maps

РешениеСколько существует разных DPR?• 1x (спасибо, кэп)• 2x

Page 49: 1. yandex maps

DPRСколько существует разных DPR?• 1.5x (старые Андроиды)• 3x (новые Андроиды)

Page 50: 1. yandex maps

DPRСколько существует разных DPR?• 1.7 (LG Optimus)• 1.8 (Samsung Galaxy Mega 6.3)• 2.25 (Opera Mobile)

Page 51: 1. yandex maps

DPRСколько существует разных DPR?• 1.325 (Asus Nexus 7)• 5:3, 15:9 (Nokia)

Page 52: 1. yandex maps

DPR(здесь должна быть картинка

"да, мы упоролись",но всё понятно и так)

Page 53: 1. yandex maps

DPR• Мы переписали всё на SVG и

<canvas>• Для IE < 9 осталась старая вёрстка• (/me с ужасом ждёт того дня, когда

кто-нибудь запустит старый IE на ретиновом мониторе)

Page 54: 1. yandex maps

SVG меткиИгла в яйце, яйцо в утке…• Берём шаблон SVG• Подставляем нужные цвета• Формируем CSS-класс, которому в

background выставлен этот SVG• …• PROFIT!

Page 55: 1. yandex maps

SVG метки

Page 56: 1. yandex maps

SVG меткиПробуем на практике:• Берём шаблон SVG• Подставляем нужные цвета• Формируем CSS-класс, которому в

background выставлен этот SVG• …• Слайдшоу!

Page 57: 1. yandex maps

SVG меткиДобавляем пару шагов:• Берём канвас• Делаем drawImage, передавая

закодированный SVG как data:uri• Преобразуем в закодированный PNG• …• Вот теперь PROFIT!

Page 58: 1. yandex maps

SVG меткиК сожалению, обратная совместимость пала смертью храбрых

Page 59: 1. yandex maps

Или вот ещё проблема• В версии 2.0 мы используем

промисыhttps://github.com/dfilatov/vow• В ECMAScript6 включены

промисы как примитив языка

Page 60: 1. yandex maps

Или вот ещё проблема• Промисы "по стандарту" не

совпадают ни с одной из существующих реализаций, включая нашу

• (какая ирония)

Page 61: 1. yandex maps

Это, конечно, не всёКонечно же, мы заодно очень хотели полечить и свои косяки внедрить решения, время которых ещё не пришло на момент выпуска 2.0.

Page 62: 1. yandex maps

Это, конечно, не всё• Рисовать все метки на одном

канвасе• Управлять видимостью

объектов в кластеризаторе• Решить проблемы с

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

Page 63: 1. yandex maps

2.1Причины изменений в API:

Сделать хорошо пользователю

Сделать хорошо разработчику

Идти в ногу со временем

Уныние и отчаяние

Page 64: 1. yandex maps

МоральТы, как разработчик API, должен:• Следить за юз-кейсами• Следить за практикой

внедрений• Читать техподдержку

Page 65: 1. yandex maps

МоральТы, как разработчик API, должен:• Периодически выпускать новые

версии

Page 66: 1. yandex maps

Всем спасибо!Вопросы?• clubs.ya.ru/mapsapi• (facebook|vk).com/ymapsapiВ крайнем случае:• Сергей Константинов

[email protected]