33

A.pleshkov

Embed Size (px)

Citation preview

Page 1: A.pleshkov
Page 2: A.pleshkov

Особенности проекта • Миллионы юзеров ежедневно • Огромная кодовая база • Много legacy • Постоянное добавление новых фич и

доработка старых • Интеграция с другими проектами

Page 3: A.pleshkov

Как это было (2007 г.) • Полная загрузка страницы при переходе • Скрипты либо inline, либо общие в отдельных

файлах • Местами AJAX • PrototypeJS 1.6.0.3

Page 4: A.pleshkov

THE SPICE MUST FLOW

Page 5: A.pleshkov

Задача (2009 г.): Ускорить загрузку страниц минимальными манипуляциями. Никаких глобальных переработок сервера и клиента.

Page 6: A.pleshkov

Как решаем: Будем загружать только «тело» страницы и перерисовывать его. Отдача «тела» решается шаблонизатором.

Page 7: A.pleshkov

Что на клиенте? Booster! 1. Нажали ссылку 2. http://my.mail.ru/...#page=<path> 3. Отследили изменение 4. Загружаем 5. Вставляем в DOM и обрабатываем

Page 8: A.pleshkov

Автоматически скрипты не отрабатывают, так что: • Inline-скрипт вставляется в DOM через новый

элемент script • Если внешний, то проверяем не добавляли ли

до этого • Нет? Тогда по аналогии с inline

Page 9: A.pleshkov

Ещё печали: • setTimeout() / setInterval() • window.onload / DOMReady / ... • Проблемы с глобальным scope • Race Conditions

Page 10: A.pleshkov

// bar.js

var myMessage = "...";

var Bar = {

showMessageIn: function (el) {

el.innerHTML = myMessage;

}

};

Page 11: A.pleshkov

<script type="text/javascript" src="bar.js"></script>

<script type="text/javascript">

Bar.showMessageIn(...);

</script>

Page 12: A.pleshkov

// quux.js

function myMessage() {

return "quux";

}

...

Page 13: A.pleshkov
Page 14: A.pleshkov

Ускорение на 40% минимум. Лучше было, конечно, провести ряд подготовительных мер и внедрять постепенно.

Page 15: A.pleshkov

Задача (2011 г.): Попробовать избавиться от PrototypeJS, потому что…

Page 16: A.pleshkov

Так почему же? • Есть баги • Избыточен • Неудобный API • Мало стороннего

Page 17: A.pleshkov

var els = $$('div[class!=""]');

Page 18: A.pleshkov

Попытка обновления до 1.7 Большая часть багов решена, но... Начались проблемы с JSON в ответах сервера. jQuery?

Page 19: A.pleshkov

Хитрый план: обёртка над PrototypeJS • Делаем API более удобным • Фиксим баги в рамках обёртки • Потом сможем смигрировать на jQuery • Пишем сотни тестов (jsTestDriver)

Page 20: A.pleshkov

Стало сильно лучше, но: • Недостаток документации • «А вот как тут? Это на jQuery? Долго? С нуля?!»

Page 21: A.pleshkov

Может хотя бы попробуем?..

Page 22: A.pleshkov

Задача (начало 2012 г.): Внедрить jQuery ;)

Page 23: A.pleshkov

Готовимся: • PrototypeJS пока оставляем • Переносим на jQuery работу с AJAX • Убираем потенциально опасное из PrototypeJS

Page 24: A.pleshkov

• Подменяем функции PrototypeJS для работы с JSON • Заменяем Ajax из PrototypeJS на свой

• При разборе JSON из ответа используем JSON.parse() (для старья - JSON3)

• При ошибке используем парсер из PrototypeJS 1.6

• Собираем статистику по кривым JSON-ответам

Page 25: A.pleshkov

ECMAScript 5 • Все пересечения PrototypeJS с ES5 для нас

потенциально опасны • Есть полезные функции • Для старых браузеров добавляем polyfill

Page 26: A.pleshkov

Ничего пока с ним не делаем - смотрим как приживается.

Page 27: A.pleshkov

Задача (тот же период): Внедрить модульность. Нужно понять, что является для нас модулем и как будем внедрять.

Page 28: A.pleshkov

Модули • Каждый сервис - модуль • Общая функциональность - модуль • Нужна поддержка зависимостей

Page 29: A.pleshkov

AMD (RequireJS Optimizer + almond) • Стал стандартом де-факто • Легко интегрировать сторонние модули • PrototypeJS застолбил за собой $ • Не нужно следить за порядком файлов

Page 30: A.pleshkov

jQuery прижился! • Выставляем его через AMD • Переносим модули первой необходимости на

AMD • Итеративно переносим сервисы на AMD • Визуальные модули мигрируют на jQuery

Page 31: A.pleshkov

Сборщик • Проверяем наличие требуемых программ • Ставим необходимые сторонние утилиты • Собираем модули • JSLint, минификация, запуск тестов, …

Page 32: A.pleshkov

В результате • Остался legacy, использующий PrototypeJS • Остались маленькие кусочки, использующие

обёртку • Концепция jQuery + AMD работает и вполне

устраивает

Page 33: A.pleshkov

Андрей Плешков

п р о г р а м м и с т, « М о й М и р »

a . p l e s h k o v @ c o r p . m a i l . r u