SlideShare a Scribd company logo
1 of 61
Download to read offline
Тотальная  заморозка  =
быстрая  загрузка

Алексей  Андросов
Старший  разработчик  интерфейсов
Я.Субботник,  Рига,  6  апреля  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
Как  все  начиналось
Вставляем  скрипты  и  стили
01. <link href="//mysite.lv/css/_style.css"/>
02. <script src="//mysite.lv/js/_script.js"/>



   Кеширования  статики  еще  нет




   09
Добавляем  кеширующие
   заголовки
   Кешириуют  обычно  «навечно»  и  добавляют  версию  в  URL,  чтобы
   инвалидировать  статику


01. <link href="//mysite.lv/css/_style.css?ver=1.0.0"/>
02. <script src="//mysite.lv/js/_script.js?ver=1.0.0"/>




   10
Уносим  на  отдельный  домен  и
   CDN
01. <link href="//yandex.st/prj/css/_style.css?ver=1.0.0"/>
02. <script src="//yandex.st/prj/js/_script.js?ver=1.0.0"/>




   11
Версии  раскладываем  по
   папкам
   и  без  проблем  переключаемся  между  версиями


01. <link href="//yandex.st/prj/1.0.0/_style.css"/>
02. <script src="//yandex.st/prj/1.0.0/_script.js"/>




   12
Грузим  картинки  в  CSS
01. .page {
02.        background: url("i/bg.png")
03. }



      Полный  путь  до  изображения  выглядит  так:


01. //yandex.st/prj/1.0.0/i/bg.png



      13
Грузим  картинки  в  JS
01. $('.insert').html(
02.        '<img src="'+ PRJ.STATIC + '/i/ico.png"/>'
03. );



      Полный  путь  до  изображения  выглядит  так:


01. //yandex.st/prj/1.0.0/i/ico.png



      14
И  тут  мы  выпускаем
новую  версию!
Теперь  ссылки  выглядят  так
01. <link href="//yandex.st/prj/ 1.0.1 /_style.css"/>
02. <script src="//yandex.st/prj/ 1.0.1 /_script.js"></script>



   И  картинки  грузятся  по  другим  урлам


01. //yandex.st/prj/ 1.0.1 /i/ico.png
02. //yandex.st/prj/ 1.0.1 /i/bg.png



   16
А  ведь  картинки  не
поменялись!
Что  же  не  так?
Нечестно  заставлять  пользователя  грузить  всю
статику,  если  поменялась  только  часть




18
Чего  мы  хотим?
Чтобы  файлы  перезагружались  пользователем,  когда  они
реально  изменились




19
Варианты
  Можно  управлять  версиями  самостоятельно


+ Просто


− Неудобно
− Сложно  покрыть  все  файлы
− Большая  вероятность  ошибок




  20
Варианты
  Можно  добавлять  к  урлу  ревизию  файла  из  VCS


+ Не  надо  ничего  делать  руками


− Сложно  реализовать
− Сложно  покрыть  все  файлы




  21
Что  делаем  мы
      Грузим  файлы  не  по  урлу  с  версией,  а  по  урлу  с  хеш-­суммой


01. .page {
02.        background: url("//yandex.st/prj/_/jUK5O9GsS2gPWOhR.png")
03. }




      22
С  помощью
borschik  0.3.0+

bit.ly/borschik




23
Что  такое  borschik
●    Это  текстовый  процессор  для  файлов  на  node.js
●    Умеет  склеивать  файлы
●    Умеет  преобразовывать  файлы
●    Умеет  минимизировать  файлы
●    Поддерживает  «из  коробки»  CSS  и  JS
●    Можно  расширять  своими  «технологиями»




  24
CSS
CSS
  borschik  умеет


●    раскрыть  @import  и  собрать  всё  в  один  файл
●    минимизировать
●    freeze  картинок  и  шрифтов




  26
Сначала  пишем  конфиг
      Конфиг  –  файл  с  именем  .borschik

01. {
02.      "paths": {
03.           "_freeze": "//yandex.st/prj/_freeze"
04.      },
05.      "freeze_paths": {
06.           ".": "_freeze"
07.      }
08. }
    27
Берем  CSS
01. .class {
02.        background: url("1.png");
03. }




      28
Запускаем
01. $ borschik --input 1.css --freeze yes --minimize no




   29
Все  готово!
01. .class {

02.        background: url("_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png");

03. }




      30
JS
Тут  немного  сложнее
●    Вставлять  картинку  можно  бесконечно  разными  способами
●    Урл  может  быть  динамическим




  32
Наше  решение
Мы  написали  технологию  для  borschik  для  фриза  картинок  в  JS
по  аналогии  с  CSS


Вам  надо  всего  лишь  несложно  разметить  картинки




33
JS:  статический  урл  до
   картинки
01. new Image().src = borschik.link('1.png')


01. $ borschik --tech js-link --input 1.js


01. new Image().src = "_freeze/jUK5O9GsS2gPWOhRMeBxRGThf0.png"




   34
JS:  статический  урл  до
      картинки
      borschik.link  при  разработке  выглядит  вот  так


01. borschik.link = function(link) {
02.        return link;
03. }



      В  продакшене  можно  убрать

      35
JS:  динамический  урл  до
   картинки
01. new Image().src = borschik.link('@icon-' + name + '-png');



   Тут  ничего  не  меняется,  а  правильный  урл  до  картинки  отдаст
   borschik.entity




   36
JS:  динамический  урл  до
   картинки
   Объявляем  JSON  с  entity:


01. {"icon-test-png": "1.png"}


01. $ borschik --tech json-links --input images.json


01. {"icon-test-png":"_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"}

   37
JS:  динамический  урл  до
      картинки
01. var links = {};
02. borschik.addLinks = function(json) {
03.        for (var link in json) {
04.            links[link] = json[link];
05.        }
06. };


      38
JS:  динамический  урл  до
      картинки
01. borschik.link = function(link) {
02.        if (link.charAt(0) === '@') {
03.            return links[link.substr(1)];
04.        }
05.        return link;
06. }


      39
JS:  динамический  урл  до
   картинки
   Собираем  всё  вместе…

01. boschik.addLinks(/* borschik:include:_images.json */);
02. new Image().src = borschik.link('@icon-' + name + '-png');



   Собираем

01. $ borschik --minimize no --input 1.js

   40
JS:  динамический  урл  до
      картинки
      …  и  всё  работает!

01. boschik.addLinks({
02.        "icon-test-png":"_freeze/jUK5O9GsS2gOhRMeBxR0GThf0.png"
03. });
04. new Image().src = borschik.link('@icon-' + name + '-png');




      41
А  теперь  зафризим
сами  файлы!
borschik  и  тут  поможет
01. $ borschik freeze 
02.        --input path/to/dir 
03.        --output freeze-info.json




      43
После  запуска  получаем  JSON
01. $ borschik freeze --input js


01. {
02.        "js/index.js":"434046cd5d1b54ae2374868a7363d7d8.js",
03.        "js/setup.js":"bcbf293578cfda2d4543d401d12e2e49.js"
04. }



      Можно  отдать  в  конфиг  RequireJS,  например.
      44
Как  это  выглядит  в  Я.Почте
01. {
02.        "js/message.ru.js":"43...40.js"
03.        "js/message.en.js":"46...cd.js"
04.        "js/setup.ru.js":"5d...1b.js"
05.        "js/setup.en.js":"54...ae.js"
06.        "css/blue.css":"23...74.js"
07.        "css/green.css":"a7...d8.js"
08. }
      45
Почему  мы  делаем  так?
●    У  нас  модульная  динамическая  загрузка  и  подгрузка.  Урлы
  подменяются  на  лету.
●    В  браузер  выгружаются  только  информация  для  нужной  пары
  тема+язык.




  46
А  у  меня  просто
HTML-­страница,  и  я
хочу  фриз!
Решение  для  ленивых
01. $ borschik --tech html --input 1.html



    На  статической  странице  зафризит:

 ●    Картинки
 ●    JS
 ●    CSS




    48
Было
01. <html>
02. <head>
03.        <link rel="stylesheet" href="1.css"/>
04. </head>
05. <body>
06. <!-- <img src="1.png"> -->
07. <img src="1.png">
08. <script src="1.js"></script>
09. </body>
10. </html>
      49
Стало
01. <html>
02. <head>
03.    <link rel="stylesheet" href="//yandex.st/prj/_/n8mJAmyb...s2s6y0.css"/>
04. </head>
05. <body>
06. <!-- <img src="1.png"> -->
07. <img src="//yandex.st/prj/_/jUK5O9GsS2gPWOhRMeBxR0GThf0.png">
08. <script src="//yandex.st/prj/_/1qHhHrD9m5i9sdDbCe590URPaBw.js"></script>
09. </body>
10. </html>
      50
Важные  моменты
  ●    В  каждый  файл  (JS/CSS)  стоит  добавить  описание,  иначе  потом
    не  понять  где  кто.  Например,
01. /*!mail:weather*/.class{...}
02. "mail:setup";(function(){...})();



  ●    Из  файлов  придется  убрать  всё,  что  содержит  текущую  версию.
    Иначе  файлы  каждый  раз  будут  разные.


    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
    

More Related Content

What's hot

Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
CodeFest 2014. Макишвили В., Дулин М. — BEViS & btCodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
CodeFest
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
Михаил Черномордиков Ie9
Михаил Черномордиков   Ie9Михаил Черномордиков   Ie9
Михаил Черномордиков Ie9
Siel01
 

What's hot (20)

Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
CodeFest 2014. Макишвили В., Дулин М. — BEViS & btCodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
CodeFest 2014. Макишвили В., Дулин М. — BEViS & bt
 
DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"DOM-шаблонизаторы – не только "быстро"
DOM-шаблонизаторы – не только "быстро"
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
 
Basis.js - Production Ready Framework
Basis.js - Production Ready FrameworkBasis.js - Production Ready Framework
Basis.js - Production Ready Framework
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA Framework
 
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
"Basis.js - Production Ready SPA Framework" Сергей Мелюков (Avito)
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-ОнлайнKnockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
Михаил Черномордиков Ie9
Михаил Черномордиков   Ie9Михаил Черномордиков   Ie9
Михаил Черномордиков Ie9
 

Similar to Алексей Андросов "Тотальная заморозка = быстрая загрузка"

Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
Technopark
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
2ГИС Технологии
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
Yandex
 
Работа со статикой в Django
Работа со статикой в DjangoРабота со статикой в Django
Работа со статикой в Django
MoscowDjango
 

Similar to Алексей Андросов "Тотальная заморозка = быстрая загрузка" (20)

Bootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPressBootstrap 3. Адаптивная верстка для WordPress
Bootstrap 3. Адаптивная верстка для WordPress
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
 
Олег Мохов "Драматическая история одной маленькой промостранички"
Олег Мохов "Драматическая история одной маленькой промостранички"Олег Мохов "Драматическая история одной маленькой промостранички"
Олег Мохов "Драматическая история одной маленькой промостранички"
 
Телепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup MinskТелепортация MODX - MODX Meetup Minsk
Телепортация MODX - MODX Meetup Minsk
 
CSS. Практика
CSS. ПрактикаCSS. Практика
CSS. Практика
 
Speed Up Your Website
Speed Up Your WebsiteSpeed Up Your Website
Speed Up Your Website
 
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
 
Скорость работы интернет магазина
Скорость работы интернет магазинаСкорость работы интернет магазина
Скорость работы интернет магазина
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"Максим Ширшин "Яндекс.Панель: осваиваем 250px"
Максим Ширшин "Яндекс.Панель: осваиваем 250px"
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
 
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
webpack: 7 бед - один ответ
webpack: 7 бед - один ответwebpack: 7 бед - один ответ
webpack: 7 бед - один ответ
 
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьерUnit-тестирование скриншотами: преодолеваем звуковой барьер
Unit-тестирование скриншотами: преодолеваем звуковой барьер
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Иван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизацияИван Карев — Клиентская оптимизация
Иван Карев — Клиентская оптимизация
 
Работа со статикой в Django
Работа со статикой в DjangoРабота со статикой в Django
Работа со статикой в Django
 
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 

More from Yandex

Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
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
 

More from Yandex (20)

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

Алексей Андросов "Тотальная заморозка = быстрая загрузка"

  • 1. Тотальная  заморозка  = быстрая  загрузка Алексей  Андросов Старший  разработчик  интерфейсов Я.Субботник,  Рига,  6  апреля  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. Вставляем  скрипты  и  стили 01. <link href="//mysite.lv/css/_style.css"/> 02. <script src="//mysite.lv/js/_script.js"/> Кеширования  статики  еще  нет 09
  • 10. Добавляем  кеширующие заголовки Кешириуют  обычно  «навечно»  и  добавляют  версию  в  URL,  чтобы инвалидировать  статику 01. <link href="//mysite.lv/css/_style.css?ver=1.0.0"/> 02. <script src="//mysite.lv/js/_script.js?ver=1.0.0"/> 10
  • 11. Уносим  на  отдельный  домен  и CDN 01. <link href="//yandex.st/prj/css/_style.css?ver=1.0.0"/> 02. <script src="//yandex.st/prj/js/_script.js?ver=1.0.0"/> 11
  • 12. Версии  раскладываем  по папкам и  без  проблем  переключаемся  между  версиями 01. <link href="//yandex.st/prj/1.0.0/_style.css"/> 02. <script src="//yandex.st/prj/1.0.0/_script.js"/> 12
  • 13. Грузим  картинки  в  CSS 01. .page { 02. background: url("i/bg.png") 03. } Полный  путь  до  изображения  выглядит  так: 01. //yandex.st/prj/1.0.0/i/bg.png 13
  • 14. Грузим  картинки  в  JS 01. $('.insert').html( 02. '<img src="'+ PRJ.STATIC + '/i/ico.png"/>' 03. ); Полный  путь  до  изображения  выглядит  так: 01. //yandex.st/prj/1.0.0/i/ico.png 14
  • 15. И  тут  мы  выпускаем новую  версию!
  • 16. Теперь  ссылки  выглядят  так 01. <link href="//yandex.st/prj/ 1.0.1 /_style.css"/> 02. <script src="//yandex.st/prj/ 1.0.1 /_script.js"></script> И  картинки  грузятся  по  другим  урлам 01. //yandex.st/prj/ 1.0.1 /i/ico.png 02. //yandex.st/prj/ 1.0.1 /i/bg.png 16
  • 17. А  ведь  картинки  не поменялись!
  • 18. Что  же  не  так? Нечестно  заставлять  пользователя  грузить  всю статику,  если  поменялась  только  часть 18
  • 19. Чего  мы  хотим? Чтобы  файлы  перезагружались  пользователем,  когда  они реально  изменились 19
  • 20. Варианты Можно  управлять  версиями  самостоятельно + Просто − Неудобно − Сложно  покрыть  все  файлы − Большая  вероятность  ошибок 20
  • 21. Варианты Можно  добавлять  к  урлу  ревизию  файла  из  VCS + Не  надо  ничего  делать  руками − Сложно  реализовать − Сложно  покрыть  все  файлы 21
  • 22. Что  делаем  мы Грузим  файлы  не  по  урлу  с  версией,  а  по  урлу  с  хеш-­суммой 01. .page { 02. background: url("//yandex.st/prj/_/jUK5O9GsS2gPWOhR.png") 03. } 22
  • 24. Что  такое  borschik ●    Это  текстовый  процессор  для  файлов  на  node.js ●    Умеет  склеивать  файлы ●    Умеет  преобразовывать  файлы ●    Умеет  минимизировать  файлы ●    Поддерживает  «из  коробки»  CSS  и  JS ●    Можно  расширять  своими  «технологиями» 24
  • 25. CSS
  • 26. CSS borschik  умеет ●    раскрыть  @import  и  собрать  всё  в  один  файл ●    минимизировать ●    freeze  картинок  и  шрифтов 26
  • 27. Сначала  пишем  конфиг Конфиг  –  файл  с  именем  .borschik 01. { 02. "paths": { 03. "_freeze": "//yandex.st/prj/_freeze" 04. }, 05. "freeze_paths": { 06. ".": "_freeze" 07. } 08. } 27
  • 28. Берем  CSS 01. .class { 02. background: url("1.png"); 03. } 28
  • 29. Запускаем 01. $ borschik --input 1.css --freeze yes --minimize no 29
  • 30. Все  готово! 01. .class { 02. background: url("_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"); 03. } 30
  • 31. JS
  • 32. Тут  немного  сложнее ●    Вставлять  картинку  можно  бесконечно  разными  способами ●    Урл  может  быть  динамическим 32
  • 33. Наше  решение Мы  написали  технологию  для  borschik  для  фриза  картинок  в  JS по  аналогии  с  CSS Вам  надо  всего  лишь  несложно  разметить  картинки 33
  • 34. JS:  статический  урл  до картинки 01. new Image().src = borschik.link('1.png') 01. $ borschik --tech js-link --input 1.js 01. new Image().src = "_freeze/jUK5O9GsS2gPWOhRMeBxRGThf0.png" 34
  • 35. JS:  статический  урл  до картинки borschik.link  при  разработке  выглядит  вот  так 01. borschik.link = function(link) { 02. return link; 03. } В  продакшене  можно  убрать 35
  • 36. JS:  динамический  урл  до картинки 01. new Image().src = borschik.link('@icon-' + name + '-png'); Тут  ничего  не  меняется,  а  правильный  урл  до  картинки  отдаст borschik.entity 36
  • 37. JS:  динамический  урл  до картинки Объявляем  JSON  с  entity: 01. {"icon-test-png": "1.png"} 01. $ borschik --tech json-links --input images.json 01. {"icon-test-png":"_freeze/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"} 37
  • 38. JS:  динамический  урл  до картинки 01. var links = {}; 02. borschik.addLinks = function(json) { 03. for (var link in json) { 04. links[link] = json[link]; 05. } 06. }; 38
  • 39. JS:  динамический  урл  до картинки 01. borschik.link = function(link) { 02. if (link.charAt(0) === '@') { 03. return links[link.substr(1)]; 04. } 05. return link; 06. } 39
  • 40. JS:  динамический  урл  до картинки Собираем  всё  вместе… 01. boschik.addLinks(/* borschik:include:_images.json */); 02. new Image().src = borschik.link('@icon-' + name + '-png'); Собираем 01. $ borschik --minimize no --input 1.js 40
  • 41. JS:  динамический  урл  до картинки …  и  всё  работает! 01. boschik.addLinks({ 02. "icon-test-png":"_freeze/jUK5O9GsS2gOhRMeBxR0GThf0.png" 03. }); 04. new Image().src = borschik.link('@icon-' + name + '-png'); 41
  • 43. borschik  и  тут  поможет 01. $ borschik freeze 02. --input path/to/dir 03. --output freeze-info.json 43
  • 44. После  запуска  получаем  JSON 01. $ borschik freeze --input js 01. { 02. "js/index.js":"434046cd5d1b54ae2374868a7363d7d8.js", 03. "js/setup.js":"bcbf293578cfda2d4543d401d12e2e49.js" 04. } Можно  отдать  в  конфиг  RequireJS,  например. 44
  • 45. Как  это  выглядит  в  Я.Почте 01. { 02. "js/message.ru.js":"43...40.js" 03. "js/message.en.js":"46...cd.js" 04. "js/setup.ru.js":"5d...1b.js" 05. "js/setup.en.js":"54...ae.js" 06. "css/blue.css":"23...74.js" 07. "css/green.css":"a7...d8.js" 08. } 45
  • 46. Почему  мы  делаем  так? ●    У  нас  модульная  динамическая  загрузка  и  подгрузка.  Урлы подменяются  на  лету. ●    В  браузер  выгружаются  только  информация  для  нужной  пары тема+язык. 46
  • 47. А  у  меня  просто HTML-­страница,  и  я хочу  фриз!
  • 48. Решение  для  ленивых 01. $ borschik --tech html --input 1.html На  статической  странице  зафризит: ●    Картинки ●    JS ●    CSS 48
  • 49. Было 01. <html> 02. <head> 03. <link rel="stylesheet" href="1.css"/> 04. </head> 05. <body> 06. <!-- <img src="1.png"> --> 07. <img src="1.png"> 08. <script src="1.js"></script> 09. </body> 10. </html> 49
  • 50. Стало 01. <html> 02. <head> 03. <link rel="stylesheet" href="//yandex.st/prj/_/n8mJAmyb...s2s6y0.css"/> 04. </head> 05. <body> 06. <!-- <img src="1.png"> --> 07. <img src="//yandex.st/prj/_/jUK5O9GsS2gPWOhRMeBxR0GThf0.png"> 08. <script src="//yandex.st/prj/_/1qHhHrD9m5i9sdDbCe590URPaBw.js"></script> 09. </body> 10. </html> 50
  • 51. Важные  моменты ●    В  каждый  файл  (JS/CSS)  стоит  добавить  описание,  иначе  потом не  понять  где  кто.  Например, 01. /*!mail:weather*/.class{...} 02. "mail:setup";(function(){...})(); ●    Из  файлов  придется  убрать  всё,  что  содержит  текущую  версию. Иначе  файлы  каждый  раз  будут  разные. 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