SlideShare a Scribd company logo
Масштабируемые
JavaScript-приложения
Михаил Давыдов
JavaScript разработчик группы разработки Веб-чатов



Я.Субботник, Екатеринбург, 2 июля 2011 года
2
Байт 40 JavaScript

<a href="javascript:
     external.AddFavorite
             (location, 'Мой сайт!')
">
    Добавить закладку
</a>


3
4
Код стал меняться

// Lamo code
<button
onclick="doStuff.call(this, event)"
/>
// Pro code
$('button').click(doStuff);


5
$(function () { // Типичный код для сайта
    $('#button').click(function (event) {
        alert(this.innerHTML);
    });
      $('#list').uberScrollerPluginStart({
          "theme": "red"
      });
      $('#lazy_thing').click(function () {
          $.get('/lazy/thing/body.html',
                doLazyLoad.bind(this));
      });
      /* Ещё десяток разных стилей
         и плагинов */
});

6
$(function () { // Типичный код для сайта
    $('#button').click(function (event) {
        alert(this.innerHTML);
    });
      $('#list').uberScrollerPluginStart({
          "theme": "red"
      });

    Для$.get('/lazy/thing/body.html', {
          сайта — это хорошо!
     $('#lazy_thing').click(function ()
               doLazyLoad.bind(this));
      });
      /* Ещё десяток разных стилей
         и плагинов */
});

7
Часто код сайта похож на
маленький клубок




8
9
Сильная связанность

10
Структура




11
12
Зависимость от библиотеки




13
Нужна обертка — Ядро


           Ядро

        Библиотека




14
Задачи Ядра
1. Обертка библиотеки

2. Управляет жизнью частей системы

3. Коммуникационный интерфейс

4. Контролирует ошибки

5. Расширяется


15
Модули




16
Структура как на МКС

17
Модули — обособлены

18
Модуль состоит из
JavaScript + HTML + CSS + ...




19
Модуль «Ростер»



             Моя задача —
             отображать список
             контактов и обновлять
             статусы.




20
Модуль «Диалог»



             Моя задача —
             отображать сообщения
             пользователей в чате.




21
Модуль в песочнице

22
Модуль ограничен
1. Может
   — вызывать свои методы и песочницы
   — использовать свой HTML элемент
2. Должен спрашивать разрешения
3. Запрещено
   — создавать глобалы
   — использовать нестандартные глобалы
   — общаться с модулями напрямую
23
var Module = (function (global) {
    "use strict";
    var $content;
     return {
         "init": function ($) { // $=sandbox
             $content = $.$('<div/>')
                        .appendTo($.box());
            $.on("message", function (e) {
                $content.text(e.data);
            });
        },
        "destroy": function () { /*,..,*/ }
    };
    // Тут может быть ещё какой-то код
}(this))

24
Жесткая архитектура

          Модули

         Песочница

           Ядро

        Библиотека

25
Ни один из объектов не
знает о всем приложении!



26
Расширяемая архитектура

      Модули

     Песочница

       Ядро       Расширения

     Библиотека    Плагины

27
Коммуникация




28
var Module1 = {
   "someAction": function () {
       Module2.getSomeValue();
   }
};
var Module2 = {
   "getSomeValue": function () {
       return 'data';
   }
};

29
var Module1 = {
   "someAction": function () {
       Module2.getSomeValue();
   }
};
var Module2 = {
   "getSomeValue": function () {
       return 'data';
   }
};

30
// Слабая связанность
var Module1 = {
   "init": function ($) {
      $.on('event', function (e) {
          console.log(e.data);
      });
   }
};
var Module2 = {
   "someAction": function ($) {
      $.trigger('event', 'data');
   }
};
31
// Слабая связанность
var Module1 = {
   "init": function ($) {
      $.on('event', function (e) {
          console.log(e.data);
      });
   }
};
var Module2 = {
   "someAction": function ($) {
      $.trigger('event', 'data');
   }
};
32
Асинхронные функции

33
Асинхронные функции

34
// Синхронный код
var Storage = {
    "read": function (key) {
        return localStorage[key];
    }
};
var data = Storage.read('key'),
    pData = process(data);
$.trigger('data', pData);



35
// Асинхронный код
var Storage = {
    "read": function (key, cb) {
        $.get('/read/' + key, cb);
    }
};
Storage.read('key',function(data) {
    var pData = processData(data);
    $.trigger('data', pData);
}.bind(this));


36
Соберем все вместе




37
Жесткая и расширяемая
архитектура
      Модули

     Песочница

       Ядро       Расширения

     Библиотека    Плагины

38
Повторное использование

39
Модульное тестирование




40
Можем менять без опасения

41
События — это по течению




42
Асинхронность — решение
    будущих проблем
43
Вопросы?




44
Михаил Давыдов
     JavaScript и Node.js разработчик

     azproduction@yandex-team.ru

     Twitter @azproduction

     Habr http://azproduction.habrahabr.ru




45

More Related Content

PDF
Making Scalable JavaScript Application
PDF
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
PDF
Суперсилы Chrome developer tools
PDF
Внутреннее устройство и оптимизация бандла webpack
PDF
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
PDF
Knockoutjs на примере 2ГИС-Онлайн
PDF
11 - Web-технологии. Работа с СУБД
Making Scalable JavaScript Application
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
Суперсилы Chrome developer tools
Внутреннее устройство и оптимизация бандла webpack
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Knockoutjs на примере 2ГИС-Онлайн
11 - Web-технологии. Работа с СУБД

What's hot (20)

ODP
Ice Php Framework Preview Release
PPTX
I tmozg js_school
PDF
ДАМП 2015 Екатеринбург
PDF
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PDF
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
PDF
Сергей Константинов — Что интересного готовит нам W3C
PDF
2014-11-01 03 Николай Линкер. Open your clojure
PPTX
I tmozg js_school_jquery
PDF
МРТ для данных, Frontend Conf 2016
ODP
Работа с БД в Drupal 7
PPTX
Web осень 2013 лекция 5
PPT
Эффективное программирование на NodeJS
PPT
Javascript
PPTX
Web осень 2013 лекция 9
PDF
Web осень 2013 лекция 2
PDF
Quick introduction jQuery
PPT
Yii development
PDF
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
PPTX
Caching on highload Drupal site - Alexander Shumenko
Ice Php Framework Preview Release
I tmozg js_school
ДАМП 2015 Екатеринбург
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Сергей Константинов — Что интересного готовит нам W3C
2014-11-01 03 Николай Линкер. Open your clojure
I tmozg js_school_jquery
МРТ для данных, Frontend Conf 2016
Работа с БД в Drupal 7
Web осень 2013 лекция 5
Эффективное программирование на NodeJS
Javascript
Web осень 2013 лекция 9
Web осень 2013 лекция 2
Quick introduction jQuery
Yii development
«Организация Frontend-разработки на крупном проекте» — Дмитрий Кузнецов
Caching on highload Drupal site - Alexander Shumenko
Ad

Viewers also liked (18)

PDF
Дмитрий Кузнецов "Роботы и люди в Твиттере"
PDF
Леонид Васильев "Python в инфраструктуре поиска"
PDF
Михаил Разуваев, Антон Попов "Яндекс.Метрика"
PDF
Александр Ларьяновский "Виджеты для главной страницы Яндекса. Кто у кого "отн...
PDF
Марина Пикулева "Мобильный фокус: люди, трубки, сайты"
PDF
Артем Кошелев "Качество кода автотестов"
PDF
Михаил Сенин "Передача дополнительной информации о сайте через Яндекс.Вебмастер"
PDF
Дмитрий Беляев "Подготовка данных для поиска Картинок и Видео"
PDF
Антон Корзунов «Как разместить тысячи объектов на карте без увеличения нагруз...
PDF
Ольга Остренкова "Семантическая разметка"
PDF
Михаил Сенин "Поиск для сайта"
PDF
Иван Бибилов "Спортивные проекты Яндекса. Взгляд изнутри"
PDF
Екатерина Войденко "Интранет и синхронизация"
PDF
Олег Мохов "О чём ещё говорят верстальщики"
PDF
Роман Комаров — «Механизм работы браузера»
PDF
Александр Титула-Бойченко "Приложения для соцсетей. Универсальные приложения ...
PDF
Егор Львовский — «Кеширование на клиенте и сервере»
PDF
Марат Абдуллин "Хроники серверного Жаваскрипта"
Дмитрий Кузнецов "Роботы и люди в Твиттере"
Леонид Васильев "Python в инфраструктуре поиска"
Михаил Разуваев, Антон Попов "Яндекс.Метрика"
Александр Ларьяновский "Виджеты для главной страницы Яндекса. Кто у кого "отн...
Марина Пикулева "Мобильный фокус: люди, трубки, сайты"
Артем Кошелев "Качество кода автотестов"
Михаил Сенин "Передача дополнительной информации о сайте через Яндекс.Вебмастер"
Дмитрий Беляев "Подготовка данных для поиска Картинок и Видео"
Антон Корзунов «Как разместить тысячи объектов на карте без увеличения нагруз...
Ольга Остренкова "Семантическая разметка"
Михаил Сенин "Поиск для сайта"
Иван Бибилов "Спортивные проекты Яндекса. Взгляд изнутри"
Екатерина Войденко "Интранет и синхронизация"
Олег Мохов "О чём ещё говорят верстальщики"
Роман Комаров — «Механизм работы браузера»
Александр Титула-Бойченко "Приложения для соцсетей. Универсальные приложения ...
Егор Львовский — «Кеширование на клиенте и сервере»
Марат Абдуллин "Хроники серверного Жаваскрипта"
Ad

Similar to Михаил Давыдов "Масштабируемые JavaScript-приложения" (20)

PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
PDF
Изоморфные Java script приложения с catberry.js
PPTX
Быстрая и безболезненная разработка клиентской части веб-приложений
PDF
RequireJS і Magento 2
PDF
JavaScript Базовый. Занятие 09.
PDF
Frontend весна 2014 лекция 1
PDF
Frontend: Путешествие в мир модульных загрузчиков
PDF
basis.js - почему я не бросил разрабатывать свой фреймворк
PDF
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
PDF
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
PPTX
Full Stack разработка на JavaScript
PDF
Meet Magento Belarus 2015: Denis Bosak
PDF
YaC 2013 Notes
PDF
Масштабируемая архитектура фронтенда
PPTX
Построение собственного JS SDK — зачем и как?
PDF
Изоморфный JavaScript — будущее уже здесь
PDF
Backbone js
PDF
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
PDF
Фреймворк Slot, Good Parts, Александр Бирюков
Михаил Давыдов "Масштабируемые JavaScript-приложения"
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Изоморфные Java script приложения с catberry.js
Быстрая и безболезненная разработка клиентской части веб-приложений
RequireJS і Magento 2
JavaScript Базовый. Занятие 09.
Frontend весна 2014 лекция 1
Frontend: Путешествие в мир модульных загрузчиков
basis.js - почему я не бросил разрабатывать свой фреймворк
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Full Stack разработка на JavaScript
Meet Magento Belarus 2015: Denis Bosak
YaC 2013 Notes
Масштабируемая архитектура фронтенда
Построение собственного JS SDK — зачем и как?
Изоморфный JavaScript — будущее уже здесь
Backbone js
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
Фреймворк Slot, Good Parts, Александр Бирюков

More from Yandex (20)

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

Михаил Давыдов "Масштабируемые JavaScript-приложения"