SlideShare una empresa de Scribd logo
1 de 61
Descargar para leer sin conexión
Криокамера  для  статики
Алексей  Андросов
Старший  разработчик  интерфейсов
Я.Субботник,  Киев,  27  апреля  2013  года
Обо  мне
  aandrosov@yandex-­team.ru      @doochik
●    По  образованию  –  специалист  по  защите
информации
●    6  лет  в  Яндексе,  2  года  ведущий  разработчик
фронтенда  в  Я.Почте
●    Люблю  копаться  в  браузерах  и  внедрять  новые  фичи  из  HTML5
●    Можете  спрашивать  про  JS,  CSS  и  frontend  в  целом
02
Я.Почта  (mail.yandex.ru)
●    Одностраничное  AJAX-­приложение  на  11  языках
●    Отдельные  версии  для  мобильных  и  для  старых  браузеров
●    Месячная  аудитория:  26  млн
●    Общий  объем  загружаемой  статики  >1  Мб
●    12  frontend  разработчиков
●    2  релиза  в  неделю
03
Частые  релизы
+ Проще  собирать
+ Быстрее  протестировать
+ Проще  откатывать  в  случае  проблем
04
Частые  релизы:  проблемы
− Каждый  релиз  инвалидириует  кеш  статики
− У  пользователей  плохо  работает  браузерный  кеш
− Увеличивается  время  загрузки  почты
05
Мы  нашли  решение  –
freeze
И  получили  хороший
результат
07
Как  все  начиналось
Вставляем  скрипты  и  стили
<link href="//mysite.lv/css/_style.css"/>
<script src="//mysite.lv/js/_script.js"/>
Кеширования  статики  еще  нет
01.
02.
09
Добавляем  кеширующие
заголовки
Кешириуют  обычно  «навечно»  и  добавляют  версию  в  URL,  чтобы
инвалидировать  статику
<link href="//mysite.lv/css/_style.css?ver=1.0.0"/>
<script src="//mysite.lv/js/_script.js?ver=1.0.0"/>
01.
02.
10
Уносим  на  отдельный  домен  и
CDN
<link href="//yandex.st/prj/css/_style.css?ver=1.0.0"/>
<script src="//yandex.st/prj/js/_script.js?ver=1.0.0"/>
01.
02.
11
Версии  раскладываем  по
папкам
и  без  проблем  переключаемся  между  версиями
<link href="//yandex.st/prj/1.0.0/_style.css"/>
<script src="//yandex.st/prj/1.0.0/_script.js"/>
01.
02.
12
Грузим  картинки  в  CSS
.page {
background: url("i/bg.png")
}
Полный  путь  до  изображения  выглядит  так:
//yandex.st/prj/1.0.0/i/bg.png
01.
02.
03.
01.
13
Грузим  картинки  в  JS
$('.insert').html(
'<img src="'+ PRJ.STATIC + '/i/ico.png"/>'
);
Полный  путь  до  изображения  выглядит  так:
//yandex.st/prj/1.0.0/i/ico.png
01.
02.
03.
01.
14
И  тут  мы  выпускаем
новую  версию!
Теперь  ссылки  выглядят  так
<link href="//yandex.st/prj/ 1.0.1 /_style.css"/>
<script src="//yandex.st/prj/ 1.0.1 /_script.js"></script>
И  картинки  грузятся  по  другим  урлам
//yandex.st/prj/ 1.0.1 /i/ico.png
//yandex.st/prj/ 1.0.1 /i/bg.png
01.
02.
01.
02.
16
А  ведь  картинки  не
поменялись!
Что  же  не  так?
Нечестно  заставлять  пользователя  грузить  всю
статику,  если  поменялась  только  часть
18
Чего  мы  хотим?
Чтобы  файлы  перезагружались  пользователем,  когда  они
реально  изменились
19
Варианты
Можно  управлять  версиями  самостоятельно
+ Просто
− Неудобно
− Сложно  покрыть  все  файлы
− Большая  вероятность  ошибок
20
Варианты
Можно  добавлять  к  урлу  ревизию  файла  из  VCS
+ Не  надо  ничего  делать  руками
− Сложно  реализовать
− Сложно  покрыть  все  файлы
21
Что  делаем  мы
Грузим  файлы  не  по  урлу  с  версией,  а  по  урлу  с  хеш-­суммой
.page {
background: url("//yandex.st/prj/_/jUK5O9GsS2gPWOhR.png")
}
01.
02.
03.
22
С  помощью
borschik  0.3.0+
bit.ly/borschik
23
Что  такое  borschik
●    Это  текстовый  процессор  для  файлов  на  node.js
●    Умеет  склеивать  файлы
●    Умеет  преобразовывать  файлы
●    Умеет  минимизировать  файлы
●    Поддерживает  «из  коробки»  CSS  и  JS
●    Можно  расширять  своими  «технологиями»
24
CSS
CSS
borschik  умеет
●    раскрыть  @import  и  собрать  всё  в  один  файл
●    минимизировать
●    freeze  картинок  и  шрифтов
26
Сначала  пишем  конфиг
Конфиг  –  файл  с  именем  .borschik
{
"paths": {
"_freeze": "//yandex.st/prj/_freeze"
},
"freeze_paths": {
".": "_freeze"
}
}
01.
02.
03.
04.
05.
06.
07.
08.
27
Берем  CSS
.class {
background: url("1.png");
}
01.
02.
03.
28
Запускаем
$ borschik --input 1.css --freeze yes --minimize no01.
29
Все  готово!
.class {
background: url("_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png");
}
01.
02.
03.
30
JS
Тут  немного  сложнее
●    Вставлять  картинку  можно  бесконечно  разными  способами
●    Урл  может  быть  динамическим
32
Наше  решение
Мы  написали  технологию  для  borschik  для  фриза  картинок  в  JS
по  аналогии  с  CSS
Вам  надо  всего  лишь  несложно  разметить  картинки
33
JS:  статический  урл  до
картинки
new Image().src = borschik.link('1.png')
$ borschik --tech js-link --input 1.js
new Image().src = "_freeze/jUK5O9GsS2gPWOhRMeBxRGThf0.png"
01.
01.
01.
34
JS:  статический  урл  до
картинки
borschik.link  при  разработке  выглядит  вот  так
borschik.link = function(link) {
return link;
}
В  продакшене  можно  убрать
01.
02.
03.
35
JS:  динамический  урл  до
картинки
new Image().src = borschik.link('@icon-' + name + '-png');
Тут  ничего  не  меняется,  а  правильный  урл  до  картинки  отдаст
borschik.entity
01.
36
JS:  динамический  урл  до
картинки
Объявляем  JSON  с  entity:
{"icon-test-png": "1.png"}
$ borschik --tech json-links --input images.json
{"icon-test-png":"_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"}
01.
01.
01.
37
JS:  динамический  урл  до
картинки
var links = {};
borschik.addLinks = function(json) {
for (var link in json) {
links[link] = json[link];
}
};
01.
02.
03.
04.
05.
06.
38
JS:  динамический  урл  до
картинки
borschik.link = function(link) {
if (link.charAt(0) === '@') {
return links[link.substr(1)];
}
return link;
}
01.
02.
03.
04.
05.
06.
39
JS:  динамический  урл  до
картинки
Собираем  всё  вместе…
boschik.addLinks(/* borschik:include:_images.json */);
new Image().src = borschik.link('@icon-' + name + '-png');
Собираем
$ borschik --minimize no --input 1.js
01.
02.
01.
40
JS:  динамический  урл  до
картинки
…  и  всё  работает!
boschik.addLinks({
"icon-test-png":"_freeze/jUK5O9GsS2gOhRMeBxR0GThf0.png"
});
new Image().src = borschik.link('@icon-' + name + '-png');
01.
02.
03.
04.
41
А  теперь  зафризим
сами  файлы!
borschik  и  тут  поможет
$ borschik freeze 
--input path/to/dir 
--output freeze-info.json
01.
02.
03.
43
После  запуска  получаем  JSON
$ borschik freeze --input js
{
"js/index.js":"434046cd5d1b54ae2374868a7363d7d8.js",
"js/setup.js":"bcbf293578cfda2d4543d401d12e2e49.js"
}
Можно  отдать  в  конфиг  RequireJS,  например.
01.
01.
02.
03.
04.
44
Как  это  выглядит  в  Я.Почте
{
"js/message.ru.js":"43...40.js"
"js/message.en.js":"46...cd.js"
"js/setup.ru.js":"5d...1b.js"
"js/setup.en.js":"54...ae.js"
"css/blue.css":"23...74.js"
"css/green.css":"a7...d8.js"
}
01.
02.
03.
04.
05.
06.
07.
08.
45
Почему  мы  делаем  так?
●    У  нас  модульная  динамическая  загрузка  и  подгрузка.  Урлы
подменяются  на  лету.
●    В  браузер  выгружаются  только  информация  для  нужной  пары
тема+язык.
46
А  у  меня  просто
HTML-­страница,  и  я
хочу  фриз!
Решение  для  ленивых
$ borschik --tech html --input 1.html
На  статической  странице  зафризит:
●    Картинки
●    JS
●    CSS
01.
48
Было
<html>
<head>
<link rel="stylesheet" href="1.css"/>
</head>
<body>
<!-- <img src="1.png"> -->
<img src="1.png">
<script src="1.js"></script>
</body>
</html>
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
49
Стало
<html>
<head>
<link rel="stylesheet" href="//yandex.st/prj/_/n8mJAmyb...s2s6y0.css"/>
</head>
<body>
<!-- <img src="1.png"> -->
<img src="//yandex.st/prj/_/jUK5O9GsS2gPWOhRMeBxR0GThf0.png">
<script src="//yandex.st/prj/_/1qHhHrD9m5i9sdDbCe590URPaBw.js"></script>
</body>
</html>
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
50
Важные  моменты
●    В  каждый  файл  (JS/CSS)  стоит  добавить  описание,  иначе  потом
не  понять  где  кто.  Например,
/*!mail:weather*/.class{...}
"mail:setup";(function(){...})();
●    Из  файлов  придется  убрать  всё,  что  содержит  текущую  версию.
Иначе  файлы  каждый  раз  будут  разные.
01.
02.
51
Измеряем  результат
Нам  помогут
●    window.performance.timing  или  new  Date().
Считаем  domContentLoad  и  onload.
●    window.performance.webkitGetEntries  (Chrome  25+).
Можно  считать  время  загрузки  отдельных  ресурсов.
53
domready  меньше  на  15%
54
Наши  цифры:  эффективность
фриза  платформы  (24  релиза)
bootstrap.css 75%* 10Кб
bootstrap.js 50% 16кб
CSS 64% 320Кб
JS 22% 330Кб
Yate-­шаблоны 50% 51Кб
*  Доля  неизменившихся  файлов
55
Наши  цифры:  эффективность
фриза  платформы  (24  релиза)
Суммарный  размер  новой  статики  (без  gzip)  –  727Кб
После  фриза  (в  среднем)  –  400Кб
Экономия  для  пользователя  –  45%
56
Наши  цифры:  эффективность
фриза  почты  (19  релизов)
JS Yate
Общее 18%  /  460Кб 27%  /  360Кб
Адресная  книга 73%  /  30Кб 73%  /  50Кб
Написание  письма 46%  /  120Кб 37%  /  60Кб
Просмотр  письма 64%  /  40Кб 64%  /  50Кб
Настройки 64%  /  35Кб 64%  /  150Кб
WYSWYG 100%  /  280Кб -­
57
Наши  цифры:  эффективность
фриза  почты  (19  релизов)
Суммарный  размер  новой  статики  (без  gzip)  –  1,6Мб
После  фриза  (в  среднем)  –  863Кб
Экономия  для  пользователя  –  47%
58
Почему  это  касается  и  вас?
●    Вне  зависимости  от  размера  статику  надо  загрузить
●    Чем  чаще  пользователь  к  вам  приходит,  тем  больше  он  качает
●    Пользователи  не  будут  ждать  медленного  сайта
– bit.ly/goog-­speed-­matters
– bit.ly/msft-­goog-­slow-­page
59
Что  вы  получите
●    Уменьшите  нагрузку  на  статический  кластер
●    Супер-­дешёвые  хотфиксы.
Изменили  один  файл  -­  пользователи  выкачили  один  файл
●    Дешёвые  релизы.
Пользователи  выкачивают  то,  что  реально  изменилось
●    Релиз  хоть  каждый  день!  
60
Алексей  Андросов
Старший  разработчик  интерфейсов
  aandrosov@yandex-­team.ru
  @doochik
  github.com/doochik

Más contenido relacionado

La actualidad más candente

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Ontico
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Yandex
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливееYaroslav Serhieiev
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...Ontico
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)Ontico
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Ontico
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Николай Лавлинский
 
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Ontico
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptVasiliy Teliatnikov
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackAlexey Ivanov
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Ontico
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush
 
Дмитрий Долгов
Дмитрий ДолговДмитрий Долгов
Дмитрий ДолговCodeFest
 
MongoDB первые впечатления
MongoDB первые впечатленияMongoDB первые впечатления
MongoDB первые впечатленияfudz1k
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)Ontico
 
Михаил Черномордиков Ie9
Михаил Черномордиков   Ie9Михаил Черномордиков   Ie9
Михаил Черномордиков Ie9Siel01
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкRoman Dvornov
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Ontico
 

La actualidad más candente (20)

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"Сергей Чистович "Подходы к кешированию на UGC-сервисе"
Сергей Чистович "Подходы к кешированию на UGC-сервисе"
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Как Webpack сделал меня счастливее
Как Webpack сделал меня счастливееКак Webpack сделал меня счастливее
Как Webpack сделал меня счастливее
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
Переезжаем на Yandex ClickHouse / Александр Зайцев (LifeStreet)
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScript
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"
 
Pavel Dovbush Toster
Pavel Dovbush Toster Pavel Dovbush Toster
Pavel Dovbush Toster
 
Дмитрий Долгов
Дмитрий ДолговДмитрий Долгов
Дмитрий Долгов
 
MongoDB первые впечатления
MongoDB первые впечатленияMongoDB первые впечатления
MongoDB первые впечатления
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
 
Михаил Черномордиков Ie9
Михаил Черномордиков   Ie9Михаил Черномордиков   Ie9
Михаил Черномордиков Ie9
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
basis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворкbasis.js - почему я не бросил разрабатывать свой фреймворк
basis.js - почему я не бросил разрабатывать свой фреймворк
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 

Destacado

Дизайн интерфейсов (Константин Горский, Яндекс)
Дизайн интерфейсов (Константин Горский, Яндекс)Дизайн интерфейсов (Константин Горский, Яндекс)
Дизайн интерфейсов (Константин Горский, Яндекс)2Niversity
 
Дизайн решает!
Дизайн решает!Дизайн решает!
Дизайн решает!Kostya Gorskiy
 
Design Course 3 process
Design Course 3 processDesign Course 3 process
Design Course 3 processKostya Gorskiy
 
CodeFest 2011. Горский К. — Как найти дизайнера
CodeFest 2011. Горский К. — Как найти дизайнераCodeFest 2011. Горский К. — Как найти дизайнера
CodeFest 2011. Горский К. — Как найти дизайнераCodeFest
 
Design Course 6 controls
Design Course 6 controlsDesign Course 6 controls
Design Course 6 controlsKostya Gorskiy
 
Константин Горский "Как успеть?"
Константин Горский "Как успеть?"Константин Горский "Как успеть?"
Константин Горский "Как успеть?"Yandex
 
Design Course 5 graphic
Design Course 5 graphicDesign Course 5 graphic
Design Course 5 graphicKostya Gorskiy
 
Design Course 4 interaction
Design Course 4 interactionDesign Course 4 interaction
Design Course 4 interactionKostya Gorskiy
 
Design Course 2 research
Design Course 2 researchDesign Course 2 research
Design Course 2 researchKostya Gorskiy
 

Destacado (9)

Дизайн интерфейсов (Константин Горский, Яндекс)
Дизайн интерфейсов (Константин Горский, Яндекс)Дизайн интерфейсов (Константин Горский, Яндекс)
Дизайн интерфейсов (Константин Горский, Яндекс)
 
Дизайн решает!
Дизайн решает!Дизайн решает!
Дизайн решает!
 
Design Course 3 process
Design Course 3 processDesign Course 3 process
Design Course 3 process
 
CodeFest 2011. Горский К. — Как найти дизайнера
CodeFest 2011. Горский К. — Как найти дизайнераCodeFest 2011. Горский К. — Как найти дизайнера
CodeFest 2011. Горский К. — Как найти дизайнера
 
Design Course 6 controls
Design Course 6 controlsDesign Course 6 controls
Design Course 6 controls
 
Константин Горский "Как успеть?"
Константин Горский "Как успеть?"Константин Горский "Как успеть?"
Константин Горский "Как успеть?"
 
Design Course 5 graphic
Design Course 5 graphicDesign Course 5 graphic
Design Course 5 graphic
 
Design Course 4 interaction
Design Course 4 interactionDesign Course 4 interaction
Design Course 4 interaction
 
Design Course 2 research
Design Course 2 researchDesign Course 2 research
Design Course 2 research
 

Similar a Алексей Андросов "Криокамера для статики"

Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Yandex
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Yandex
 
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"Yandex
 
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
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответDenis Izmaylov
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщикаmcslayer
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Yandex
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Yandex
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17MoscowJS
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияYandex
 
Yandex.Frontend: complex services, complex solutions
Yandex.Frontend: complex services, complex solutionsYandex.Frontend: complex services, complex solutions
Yandex.Frontend: complex services, complex solutionsYelena Jetpyspayeva
 
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,..."Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...Yandex
 
Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"Yandex
 
Moving from Flash to HTML5 – converting large projects
Moving from Flash to HTML5 – converting large projectsMoving from Flash to HTML5 – converting large projects
Moving from Flash to HTML5 – converting large projectsDevGAMM Conference
 
Сборка Front-end’a
Сборка Front-end’aСборка Front-end’a
Сборка Front-end’aDelphiCon
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017Alex Chistyakov
 

Similar a Алексей Андросов "Криокамера для статики" (20)

Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"Михаил Корепанов "Инкрементальные обновления на клиенте"
Михаил Корепанов "Инкрементальные обновления на клиенте"
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
 
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответ
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Yandex.Frontend: complex services, complex solutions
Yandex.Frontend: complex services, complex solutionsYandex.Frontend: complex services, complex solutions
Yandex.Frontend: complex services, complex solutions
 
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,..."Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
"Фронтенд в Яндексе: сложные сервисы, непростые решения". Елена Джетпыспаева,...
 
Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"
 
Moving from Flash to HTML5 – converting large projects
Moving from Flash to HTML5 – converting large projectsMoving from Flash to HTML5 – converting large projects
Moving from Flash to HTML5 – converting large projects
 
Speed Up Your Website
Speed Up Your WebsiteSpeed Up Your Website
Speed Up Your Website
 
Сборка Front-end’a
Сборка Front-end’aСборка Front-end’a
Сборка Front-end’a
 
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
My talk on DevOps engineer's adventures in the Windows world at UWDC 2017
 

Más de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Más de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Алексей Андросов "Криокамера для статики"

  • 1. Криокамера  для  статики Алексей  Андросов Старший  разработчик  интерфейсов Я.Субботник,  Киев,  27  апреля  2013  года
  • 2. Обо  мне  aandrosov@yandex-­team.ru    @doochik ●    По  образованию  –  специалист  по  защите информации ●    6  лет  в  Яндексе,  2  года  ведущий  разработчик фронтенда  в  Я.Почте ●    Люблю  копаться  в  браузерах  и  внедрять  новые  фичи  из  HTML5 ●    Можете  спрашивать  про  JS,  CSS  и  frontend  в  целом 02
  • 3. Я.Почта  (mail.yandex.ru) ●    Одностраничное  AJAX-­приложение  на  11  языках ●    Отдельные  версии  для  мобильных  и  для  старых  браузеров ●    Месячная  аудитория:  26  млн ●    Общий  объем  загружаемой  статики  >1  Мб ●    12  frontend  разработчиков ●    2  релиза  в  неделю 03
  • 4. Частые  релизы + Проще  собирать + Быстрее  протестировать + Проще  откатывать  в  случае  проблем 04
  • 5. Частые  релизы:  проблемы − Каждый  релиз  инвалидириует  кеш  статики − У  пользователей  плохо  работает  браузерный  кеш − Увеличивается  время  загрузки  почты 05
  • 9. Вставляем  скрипты  и  стили <link href="//mysite.lv/css/_style.css"/> <script src="//mysite.lv/js/_script.js"/> Кеширования  статики  еще  нет 01. 02. 09
  • 10. Добавляем  кеширующие заголовки Кешириуют  обычно  «навечно»  и  добавляют  версию  в  URL,  чтобы инвалидировать  статику <link href="//mysite.lv/css/_style.css?ver=1.0.0"/> <script src="//mysite.lv/js/_script.js?ver=1.0.0"/> 01. 02. 10
  • 11. Уносим  на  отдельный  домен  и CDN <link href="//yandex.st/prj/css/_style.css?ver=1.0.0"/> <script src="//yandex.st/prj/js/_script.js?ver=1.0.0"/> 01. 02. 11
  • 12. Версии  раскладываем  по папкам и  без  проблем  переключаемся  между  версиями <link href="//yandex.st/prj/1.0.0/_style.css"/> <script src="//yandex.st/prj/1.0.0/_script.js"/> 01. 02. 12
  • 13. Грузим  картинки  в  CSS .page { background: url("i/bg.png") } Полный  путь  до  изображения  выглядит  так: //yandex.st/prj/1.0.0/i/bg.png 01. 02. 03. 01. 13
  • 14. Грузим  картинки  в  JS $('.insert').html( '<img src="'+ PRJ.STATIC + '/i/ico.png"/>' ); Полный  путь  до  изображения  выглядит  так: //yandex.st/prj/1.0.0/i/ico.png 01. 02. 03. 01. 14
  • 15. И  тут  мы  выпускаем новую  версию!
  • 16. Теперь  ссылки  выглядят  так <link href="//yandex.st/prj/ 1.0.1 /_style.css"/> <script src="//yandex.st/prj/ 1.0.1 /_script.js"></script> И  картинки  грузятся  по  другим  урлам //yandex.st/prj/ 1.0.1 /i/ico.png //yandex.st/prj/ 1.0.1 /i/bg.png 01. 02. 01. 02. 16
  • 17. А  ведь  картинки  не поменялись!
  • 18. Что  же  не  так? Нечестно  заставлять  пользователя  грузить  всю статику,  если  поменялась  только  часть 18
  • 19. Чего  мы  хотим? Чтобы  файлы  перезагружались  пользователем,  когда  они реально  изменились 19
  • 20. Варианты Можно  управлять  версиями  самостоятельно + Просто − Неудобно − Сложно  покрыть  все  файлы − Большая  вероятность  ошибок 20
  • 21. Варианты Можно  добавлять  к  урлу  ревизию  файла  из  VCS + Не  надо  ничего  делать  руками − Сложно  реализовать − Сложно  покрыть  все  файлы 21
  • 22. Что  делаем  мы Грузим  файлы  не  по  урлу  с  версией,  а  по  урлу  с  хеш-­суммой .page { background: url("//yandex.st/prj/_/jUK5O9GsS2gPWOhR.png") } 01. 02. 03. 22
  • 24. Что  такое  borschik ●    Это  текстовый  процессор  для  файлов  на  node.js ●    Умеет  склеивать  файлы ●    Умеет  преобразовывать  файлы ●    Умеет  минимизировать  файлы ●    Поддерживает  «из  коробки»  CSS  и  JS ●    Можно  расширять  своими  «технологиями» 24
  • 25. CSS
  • 26. CSS borschik  умеет ●    раскрыть  @import  и  собрать  всё  в  один  файл ●    минимизировать ●    freeze  картинок  и  шрифтов 26
  • 27. Сначала  пишем  конфиг Конфиг  –  файл  с  именем  .borschik { "paths": { "_freeze": "//yandex.st/prj/_freeze" }, "freeze_paths": { ".": "_freeze" } } 01. 02. 03. 04. 05. 06. 07. 08. 27
  • 28. Берем  CSS .class { background: url("1.png"); } 01. 02. 03. 28
  • 29. Запускаем $ borschik --input 1.css --freeze yes --minimize no01. 29
  • 30. Все  готово! .class { background: url("_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"); } 01. 02. 03. 30
  • 31. JS
  • 32. Тут  немного  сложнее ●    Вставлять  картинку  можно  бесконечно  разными  способами ●    Урл  может  быть  динамическим 32
  • 33. Наше  решение Мы  написали  технологию  для  borschik  для  фриза  картинок  в  JS по  аналогии  с  CSS Вам  надо  всего  лишь  несложно  разметить  картинки 33
  • 34. JS:  статический  урл  до картинки new Image().src = borschik.link('1.png') $ borschik --tech js-link --input 1.js new Image().src = "_freeze/jUK5O9GsS2gPWOhRMeBxRGThf0.png" 01. 01. 01. 34
  • 35. JS:  статический  урл  до картинки borschik.link  при  разработке  выглядит  вот  так borschik.link = function(link) { return link; } В  продакшене  можно  убрать 01. 02. 03. 35
  • 36. JS:  динамический  урл  до картинки new Image().src = borschik.link('@icon-' + name + '-png'); Тут  ничего  не  меняется,  а  правильный  урл  до  картинки  отдаст borschik.entity 01. 36
  • 37. JS:  динамический  урл  до картинки Объявляем  JSON  с  entity: {"icon-test-png": "1.png"} $ borschik --tech json-links --input images.json {"icon-test-png":"_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"} 01. 01. 01. 37
  • 38. JS:  динамический  урл  до картинки var links = {}; borschik.addLinks = function(json) { for (var link in json) { links[link] = json[link]; } }; 01. 02. 03. 04. 05. 06. 38
  • 39. JS:  динамический  урл  до картинки borschik.link = function(link) { if (link.charAt(0) === '@') { return links[link.substr(1)]; } return link; } 01. 02. 03. 04. 05. 06. 39
  • 40. JS:  динамический  урл  до картинки Собираем  всё  вместе… boschik.addLinks(/* borschik:include:_images.json */); new Image().src = borschik.link('@icon-' + name + '-png'); Собираем $ borschik --minimize no --input 1.js 01. 02. 01. 40
  • 41. JS:  динамический  урл  до картинки …  и  всё  работает! boschik.addLinks({ "icon-test-png":"_freeze/jUK5O9GsS2gOhRMeBxR0GThf0.png" }); new Image().src = borschik.link('@icon-' + name + '-png'); 01. 02. 03. 04. 41
  • 43. borschik  и  тут  поможет $ borschik freeze --input path/to/dir --output freeze-info.json 01. 02. 03. 43
  • 44. После  запуска  получаем  JSON $ borschik freeze --input js { "js/index.js":"434046cd5d1b54ae2374868a7363d7d8.js", "js/setup.js":"bcbf293578cfda2d4543d401d12e2e49.js" } Можно  отдать  в  конфиг  RequireJS,  например. 01. 01. 02. 03. 04. 44
  • 45. Как  это  выглядит  в  Я.Почте { "js/message.ru.js":"43...40.js" "js/message.en.js":"46...cd.js" "js/setup.ru.js":"5d...1b.js" "js/setup.en.js":"54...ae.js" "css/blue.css":"23...74.js" "css/green.css":"a7...d8.js" } 01. 02. 03. 04. 05. 06. 07. 08. 45
  • 46. Почему  мы  делаем  так? ●    У  нас  модульная  динамическая  загрузка  и  подгрузка.  Урлы подменяются  на  лету. ●    В  браузер  выгружаются  только  информация  для  нужной  пары тема+язык. 46
  • 47. А  у  меня  просто HTML-­страница,  и  я хочу  фриз!
  • 48. Решение  для  ленивых $ borschik --tech html --input 1.html На  статической  странице  зафризит: ●    Картинки ●    JS ●    CSS 01. 48
  • 49. Было <html> <head> <link rel="stylesheet" href="1.css"/> </head> <body> <!-- <img src="1.png"> --> <img src="1.png"> <script src="1.js"></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 49
  • 50. Стало <html> <head> <link rel="stylesheet" href="//yandex.st/prj/_/n8mJAmyb...s2s6y0.css"/> </head> <body> <!-- <img src="1.png"> --> <img src="//yandex.st/prj/_/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"> <script src="//yandex.st/prj/_/1qHhHrD9m5i9sdDbCe590URPaBw.js"></script> </body> </html> 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 50
  • 51. Важные  моменты ●    В  каждый  файл  (JS/CSS)  стоит  добавить  описание,  иначе  потом не  понять  где  кто.  Например, /*!mail:weather*/.class{...} "mail:setup";(function(){...})(); ●    Из  файлов  придется  убрать  всё,  что  содержит  текущую  версию. Иначе  файлы  каждый  раз  будут  разные. 01. 02. 51
  • 53. Нам  помогут ●    window.performance.timing  или  new  Date(). Считаем  domContentLoad  и  onload. ●    window.performance.webkitGetEntries  (Chrome  25+). Можно  считать  время  загрузки  отдельных  ресурсов. 53
  • 55. Наши  цифры:  эффективность фриза  платформы  (24  релиза) bootstrap.css 75%* 10Кб bootstrap.js 50% 16кб CSS 64% 320Кб JS 22% 330Кб Yate-­шаблоны 50% 51Кб *  Доля  неизменившихся  файлов 55
  • 56. Наши  цифры:  эффективность фриза  платформы  (24  релиза) Суммарный  размер  новой  статики  (без  gzip)  –  727Кб После  фриза  (в  среднем)  –  400Кб Экономия  для  пользователя  –  45% 56
  • 57. Наши  цифры:  эффективность фриза  почты  (19  релизов) JS Yate Общее 18%  /  460Кб 27%  /  360Кб Адресная  книга 73%  /  30Кб 73%  /  50Кб Написание  письма 46%  /  120Кб 37%  /  60Кб Просмотр  письма 64%  /  40Кб 64%  /  50Кб Настройки 64%  /  35Кб 64%  /  150Кб WYSWYG 100%  /  280Кб -­ 57
  • 58. Наши  цифры:  эффективность фриза  почты  (19  релизов) Суммарный  размер  новой  статики  (без  gzip)  –  1,6Мб После  фриза  (в  среднем)  –  863Кб Экономия  для  пользователя  –  47% 58
  • 59. Почему  это  касается  и  вас? ●    Вне  зависимости  от  размера  статику  надо  загрузить ●    Чем  чаще  пользователь  к  вам  приходит,  тем  больше  он  качает ●    Пользователи  не  будут  ждать  медленного  сайта – bit.ly/goog-­speed-­matters – bit.ly/msft-­goog-­slow-­page 59
  • 60. Что  вы  получите ●    Уменьшите  нагрузку  на  статический  кластер ●    Супер-­дешёвые  хотфиксы. Изменили  один  файл  -­  пользователи  выкачили  один  файл ●    Дешёвые  релизы. Пользователи  выкачивают  то,  что  реально  изменилось ●    Релиз  хоть  каждый  день!   60
  • 61. Алексей  Андросов Старший  разработчик  интерфейсов  aandrosov@yandex-­team.ru  @doochik  github.com/doochik