SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
Особенности проекта

• Миллионы юзеров ежедневно
• Огромная кодовая база
• Много legacy
• Постоянное добавление новых фич и
  доработка старых
• Интеграция с другими проектами
Как это было (2007 г.)

• Полная загрузка страницы при переходе
• Скрипты либо inline, либо общие в отдельных
  файлах
• Местами AJAX
• PrototypeJS 1.6.0.3
THE SPICE MUST FLOW
Задача (2009 г.):

Ускорить загрузку страниц минимальными
манипуляциями.

Никаких глобальных переработок сервера и
клиента.
Как решаем:

Будем загружать только «тело» страницы и
перерисовывать его.

Отдача «тела» решается шаблонизатором.
Что на клиенте? Booster!

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

• Inline-скрипт вставляется в DOM через новый
  элемент script
• Если внешний, то проверяем не добавляли ли
  до этого
• Нет? Тогда по аналогии с inline
Ещё печали:

•   setTimeout() / setInterval()
•   window.onload / DOMReady / ...
•   Проблемы с глобальным scope
•   Race Conditions
// bar.js

var myMessage = "...";

var Bar = {

     showMessageIn: function (el) {
        el.innerHTML = myMessage;
     }

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

<script type="text/javascript">

Bar.showMessageIn(...);

</script>
// quux.js

function myMessage() {
   return "quux";
}

...
Ускорение на 40% минимум.

Лучше было, конечно, провести ряд
подготовительных мер и внедрять постепенно.
Задача (2011 г.):

Попробовать избавиться от PrototypeJS, потому
что…
Так почему же?

•   Есть баги
•   Избыточен
•   Неудобный API
•   Мало стороннего
var els = $$('div[class!=""]');
Попытка обновления до 1.7

Большая часть багов решена, но...

Начались проблемы с JSON в ответах сервера.

jQuery?
Хитрый план: обёртка над PrototypeJS

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

• Недостаток документации
• «А вот как тут? Это на jQuery? Долго? С нуля?!»
Может хотя бы попробуем?..
Задача (начало 2012 г.):

Внедрить jQuery ;)
Готовимся:

• PrototypeJS пока оставляем
• Переносим на jQuery работу с AJAX
• Убираем потенциально опасное из PrototypeJS
•   Подменяем функции PrototypeJS для работы с JSON
•   Заменяем Ajax из PrototypeJS на свой
    • При разборе JSON из ответа используем
       JSON.parse() (для старья - JSON3)
    • При ошибке используем парсер из PrototypeJS
       1.6
    • Собираем статистику по кривым JSON-ответам
ECMAScript 5

• Все пересечения PrototypeJS с ES5 для нас
  потенциально опасны
• Есть полезные функции
• Для старых браузеров добавляем polyfill
Ничего пока с ним не делаем - смотрим как приживается.
Задача (тот же период):

Внедрить модульность.

Нужно понять, что является для нас модулем и как
будем внедрять.
Модули

• Каждый сервис - модуль
• Общая функциональность - модуль
• Нужна поддержка зависимостей
AMD (RequireJS Optimizer + almond)

•   Стал стандартом де-факто
•   Легко интегрировать сторонние модули
•   PrototypeJS застолбил за собой $
•   Не нужно следить за порядком файлов
jQuery прижился!

• Выставляем его через AMD
• Переносим модули первой необходимости на
  AMD
• Итеративно переносим сервисы на AMD
• Визуальные модули мигрируют на jQuery
Сборщик

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

• Остался legacy, использующий PrototypeJS
• Остались маленькие кусочки, использующие
  обёртку
• Концепция jQuery + AMD работает и вполне
  устраивает
Андрей Плешков
п р о г р а м м и с т, « М о й М и р »
a.pleshkov@corp.mail.ru

Mais conteúdo relacionado

Mais procurados

Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...
Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...
Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...Yandex
 
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...SECON
 
TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TKConf
 
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
Redux и изоморфные приложения
Redux и изоморфные приложенияRedux и изоморфные приложения
Redux и изоморфные приложенияJohn Wezel
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис ПаясьCodeFest
 
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)Ontico
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...GoQA
 
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеДенис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеYandex
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Pavel Dovbush
 
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...Unigine Corp.
 
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИСЭволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС2ГИС Технологии
 
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥CodeFest
 
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014Unigine Corp.
 
Enterprise or not to enterprise
Enterprise or not to enterpriseEnterprise or not to enterprise
Enterprise or not to enterpriseAlex Tumanoff
 
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Provectus
 
Как анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерКак анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерDotNetConf
 
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИСКак мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС2ГИС Технологии
 

Mais procurados (20)

Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...
Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...
Владимир Русинов, Алексей Капранов "Яндекс.Диск: архитектура, синхронизация и...
 
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
SECON'2016. Панин Сергей, Лебедев Андрей, Храмушин Дмитрий, IT-инфраструктура...
 
TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.TК°Conf. Организация разработки Frontend. Виталий Слободин.
TК°Conf. Организация разработки Frontend. Виталий Слободин.
 
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)
Путь мониторинга: модульность, гибкость, devops / Всеволод Поляков (Grammarly)
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Background js
Background jsBackground js
Background js
 
Redux и изоморфные приложения
Redux и изоморфные приложенияRedux и изоморфные приложения
Redux и изоморфные приложения
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис Паясь
 
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
Мониторинг быстродействия web-проекта / Владимир Буянов (Ultimate Guitar)
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
 
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеДенис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в Яндексе
 
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
 
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...
20 проектов, 6 платформ, больше миллиона строк кода, 3 qa инженера. Дмитрий К...
 
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИСЭволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
Эволюция процесса деплоя в проекте — Денис Яковлев, 2ГИС
 
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥
CodeFest 2013. Баяндин А. — JavaScript + Webdriver = ♥
 
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014
Про автотесты, фреймворки и железки. Андрей Баюн. Debug time#2 2014
 
Enterprise or not to enterprise
Enterprise or not to enterpriseEnterprise or not to enterprise
Enterprise or not to enterprise
 
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
Eduard Dautov (Provectus): СКОРИНГ ML МОДЕЛЕЙ В МИКРОСЕРВИСНОЙ АРХИТЕКТУРЕ
 
Как анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерКак анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузер
 
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИСКак мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС
Как мы делали оффлайн-карты под Windows Phone — Александр Волохин, 2ГИС
 

Destaque (18)

Haritonov
HaritonovHaritonov
Haritonov
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashov
 
Panfilov
PanfilovPanfilov
Panfilov
 
Perepelitsa
PerepelitsaPerepelitsa
Perepelitsa
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)
 
Zamyakin
ZamyakinZamyakin
Zamyakin
 
Romanenko
RomanenkoRomanenko
Romanenko
 
Smirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforumSmirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforum
 
Rabovoluk
RabovolukRabovoluk
Rabovoluk
 
Platov
PlatovPlatov
Platov
 
Zacepin
ZacepinZacepin
Zacepin
 
Bubnov
BubnovBubnov
Bubnov
 
Balashov
BalashovBalashov
Balashov
 
Zenovich
ZenovichZenovich
Zenovich
 
Zagursky
ZagurskyZagursky
Zagursky
 
Chudov
ChudovChudov
Chudov
 
Osipov
OsipovOsipov
Osipov
 
Kubasov
KubasovKubasov
Kubasov
 

Semelhante a A.pleshkov

Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Сергей Константинов (Яндекс)
Сергей Константинов (Яндекс)Сергей Константинов (Яндекс)
Сергей Константинов (Яндекс)Ontico
 
1. yandex maps
1. yandex maps1. yandex maps
1. yandex mapsOntico
 
Protrarctor and Angular
Protrarctor and AngularProtrarctor and Angular
Protrarctor and AngularSQALab
 
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Egor Konovalov
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...Ontico
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?buranLcme
 
Workflow: работа над проектом в Яндексе
Workflow: работа над проектом в ЯндексеWorkflow: работа над проектом в Яндексе
Workflow: работа над проектом в ЯндексеDenis Chistyakov
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...it-people
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaAlex Chistyakov
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаMikhail Chinkov
 

Semelhante a A.pleshkov (20)

Sivko
SivkoSivko
Sivko
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Сергей Константинов (Яндекс)
Сергей Константинов (Яндекс)Сергей Константинов (Яндекс)
Сергей Константинов (Яндекс)
 
1. yandex maps
1. yandex maps1. yandex maps
1. yandex maps
 
Protrarctor and Angular
Protrarctor and AngularProtrarctor and Angular
Protrarctor and Angular
 
Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014Асинхронный биллинг для службы такси - IzhDevCom November 2014
Асинхронный биллинг для службы такси - IzhDevCom November 2014
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
Игры с виртуализацией в JavaScript, или как я переписал эмулятор, Евгений Пот...
 
Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?Построение собственного JS SDK — зачем и как?
Построение собственного JS SDK — зачем и как?
 
Workflow: работа над проектом в Яндексе
Workflow: работа над проектом в ЯндексеWorkflow: работа над проектом в Яндексе
Workflow: работа над проектом в Яндексе
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
YaC 2013 Notes
YaC 2013 NotesYaC 2013 Notes
YaC 2013 Notes
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Appery.io Ukraine_2016
Appery.io Ukraine_2016Appery.io Ukraine_2016
Appery.io Ukraine_2016
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжиниринга
 

Mais de kuchinskaya

владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелянkuchinskaya
 
чашкин иван
чашкин иванчашкин иван
чашкин иванkuchinskaya
 
сумин андрей
сумин андрейсумин андрей
сумин андрейkuchinskaya
 
митасов роман
митасов романмитасов роман
митасов романkuchinskaya
 
кренин владимир
кренин владимиркренин владимир
кренин владимирkuchinskaya
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедевkuchinskaya
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егорkuchinskaya
 
ярослав рабоволюк
ярослав рабоволюкярослав рабоволюк
ярослав рабоволюкkuchinskaya
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридоновkuchinskaya
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаковkuchinskaya
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3kuchinskaya
 

Mais de kuchinskaya (12)

Kharkov
KharkovKharkov
Kharkov
 
владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелян
 
чашкин иван
чашкин иванчашкин иван
чашкин иван
 
сумин андрей
сумин андрейсумин андрей
сумин андрей
 
митасов роман
митасов романмитасов роман
митасов роман
 
кренин владимир
кренин владимиркренин владимир
кренин владимир
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егор
 
ярослав рабоволюк
ярослав рабоволюкярослав рабоволюк
ярослав рабоволюк
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридонов
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаков
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3
 

A.pleshkov

  • 1.
  • 2. Особенности проекта • Миллионы юзеров ежедневно • Огромная кодовая база • Много legacy • Постоянное добавление новых фич и доработка старых • Интеграция с другими проектами
  • 3. Как это было (2007 г.) • Полная загрузка страницы при переходе • Скрипты либо inline, либо общие в отдельных файлах • Местами AJAX • PrototypeJS 1.6.0.3
  • 5. Задача (2009 г.): Ускорить загрузку страниц минимальными манипуляциями. Никаких глобальных переработок сервера и клиента.
  • 6. Как решаем: Будем загружать только «тело» страницы и перерисовывать его. Отдача «тела» решается шаблонизатором.
  • 7. Что на клиенте? Booster! 1. Нажали ссылку 2. http://my.mail.ru/...#page=<path> 3. Отследили изменение 4. Загружаем 5. Вставляем в DOM и обрабатываем
  • 8. Автоматически скрипты не отрабатывают, так что: • Inline-скрипт вставляется в DOM через новый элемент script • Если внешний, то проверяем не добавляли ли до этого • Нет? Тогда по аналогии с inline
  • 9. Ещё печали: • setTimeout() / setInterval() • window.onload / DOMReady / ... • Проблемы с глобальным scope • Race Conditions
  • 10. // bar.js var myMessage = "..."; var Bar = { showMessageIn: function (el) { el.innerHTML = myMessage; } };
  • 11. <script type="text/javascript" src="bar.js"></script> <script type="text/javascript"> Bar.showMessageIn(...); </script>
  • 12. // quux.js function myMessage() { return "quux"; } ...
  • 13.
  • 14. Ускорение на 40% минимум. Лучше было, конечно, провести ряд подготовительных мер и внедрять постепенно.
  • 15. Задача (2011 г.): Попробовать избавиться от PrototypeJS, потому что…
  • 16. Так почему же? • Есть баги • Избыточен • Неудобный API • Мало стороннего
  • 17. var els = $$('div[class!=""]');
  • 18. Попытка обновления до 1.7 Большая часть багов решена, но... Начались проблемы с JSON в ответах сервера. jQuery?
  • 19. Хитрый план: обёртка над PrototypeJS • Делаем API более удобным • Фиксим баги в рамках обёртки • Потом сможем смигрировать на jQuery • Пишем сотни тестов (jsTestDriver)
  • 20. Стало сильно лучше, но: • Недостаток документации • «А вот как тут? Это на jQuery? Долго? С нуля?!»
  • 21. Может хотя бы попробуем?..
  • 22. Задача (начало 2012 г.): Внедрить jQuery ;)
  • 23. Готовимся: • PrototypeJS пока оставляем • Переносим на jQuery работу с AJAX • Убираем потенциально опасное из PrototypeJS
  • 24. Подменяем функции PrototypeJS для работы с JSON • Заменяем Ajax из PrototypeJS на свой • При разборе JSON из ответа используем JSON.parse() (для старья - JSON3) • При ошибке используем парсер из PrototypeJS 1.6 • Собираем статистику по кривым JSON-ответам
  • 25. ECMAScript 5 • Все пересечения PrototypeJS с ES5 для нас потенциально опасны • Есть полезные функции • Для старых браузеров добавляем polyfill
  • 26. Ничего пока с ним не делаем - смотрим как приживается.
  • 27. Задача (тот же период): Внедрить модульность. Нужно понять, что является для нас модулем и как будем внедрять.
  • 28. Модули • Каждый сервис - модуль • Общая функциональность - модуль • Нужна поддержка зависимостей
  • 29. AMD (RequireJS Optimizer + almond) • Стал стандартом де-факто • Легко интегрировать сторонние модули • PrototypeJS застолбил за собой $ • Не нужно следить за порядком файлов
  • 30. jQuery прижился! • Выставляем его через AMD • Переносим модули первой необходимости на AMD • Итеративно переносим сервисы на AMD • Визуальные модули мигрируют на jQuery
  • 31. Сборщик • Проверяем наличие требуемых программ • Ставим необходимые сторонние утилиты • Собираем модули • JSLint, минификация, запуск тестов, …
  • 32. В результате • Остался legacy, использующий PrototypeJS • Остались маленькие кусочки, использующие обёртку • Концепция jQuery + AMD работает и вполне устраивает
  • 33. Андрей Плешков п р о г р а м м и с т, « М о й М и р » a.pleshkov@corp.mail.ru