SlideShare a Scribd company logo
Масштабируемые
JavaScript-приложения
Михаил Давыдов
JavaScript разработчик группы разработки Веб-чатов
Я.Субботник, Екатеринбург, 2 июля 2011 года
2
<a href="javascript:
external.AddFavorite
(location, 'Мой сайт!')
">
Добавить закладку
</a>
3
Байт 40 JavaScript
4
5
Код стал меняться
// Lamo code
<button
onclick="doStuff.call(this, event)"
/>
// Pro code
$('button').click(doStuff);
6
$(function () { // Типичный код для сайта
$('#button').click(function (event) {
alert(this.innerHTML);
});
$('#list').uberScrollerPluginStart({
"theme": "red"
});
$('#lazy_thing').click(function () {
$.get('/lazy/thing/body.html',
doLazyLoad.bind(this));
});
/* Ещё десяток разных стилей
и плагинов */
});
$(function () { // Типичный код для сайта
$('#button').click(function (event) {
alert(this.innerHTML);
});
$('#list').uberScrollerPluginStart({
"theme": "red"
});
$('#lazy_thing').click(function () {
$.get('/lazy/thing/body.html',
doLazyLoad.bind(this));
});
/* Ещё десяток разных стилей
и плагинов */
});
7
Для сайта — это хорошо!
8
Часто код сайта похож на
маленький клубок
9
Сильная связанность
10
Структура
11
12
Зависимость от библиотеки
13
14
Ядро
Библиотека
Нужна обертка — Ядро
Задачи Ядра
15
1. Обертка библиотеки
2. Управляет жизнью частей системы
3. Коммуникационный интерфейс
4. Контролирует ошибки
5. Расширяется
Модули
16
Структура как на МКС
17
Модули — обособлены
18
19
JavaScript + HTML + CSS + ...
Модуль состоит из
20
Модуль «Ростер»
Моя задача —
отображать список
контактов и обновлять
статусы.
21
Модуль «Диалог»
Моя задача —
отображать сообщения
пользователей в чате.
Модуль в песочнице
22
Модуль ограничен
23
1. Может
— вызывать свои методы и песочницы
— использовать свой HTML элемент
2. Должен спрашивать разрешения
3. Запрещено
— создавать глобалы
— использовать нестандартные глобалы
— общаться с модулями напрямую
24
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))
25
Ядро
Библиотека
Песочница
Модули
Жесткая архитектура
Ни один из объектов не
знает о всем приложении!
26
27
Расширяемая архитектура
Расширения
Плагины
Ядро
Библиотека
Песочница
Модули
Коммуникация
28
29
var Module1 = {
"someAction": function () {
Module2.getSomeValue();
}
};
var Module2 = {
"getSomeValue": function () {
return 'data';
}
};
30
var Module1 = {
"someAction": function () {
Module2.getSomeValue();
}
};
var Module2 = {
"getSomeValue": function () {
return 'data';
}
};
// Слабая связанность
var Module1 = {
"init": function ($) {
$.on('event', function (e) {
console.log(e.data);
});
}
};
var Module2 = {
"someAction": function ($) {
$.trigger('event', 'data');
}
};
31
32
// Слабая связанность
var Module1 = {
"init": function ($) {
$.on('event', function (e) {
console.log(e.data);
});
}
};
var Module2 = {
"someAction": function ($) {
$.trigger('event', 'data');
}
};
Асинхронные функции
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

What's hot (20)

Take more from Jquery
Take more from Jquery
Magento Dev
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Yandex
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7
Eugene Fidelin
 
jQuery. Введение и практика
jQuery. Введение и практика
Slava Aliev
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
Yandex
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
QAFest
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
Презентация jQuery
Презентация jQuery
Илья Барышев
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
MoscowJS
 
Render API.
Render API.
DrupalForumZP2012
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
Technopark
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
MoscowJS
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12
Andrew Shitov
 
Javascript
Javascript
Vasya Petrov
 
Quick introduction jQuery
Quick introduction jQuery
Shalva Usubov
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8
Technopark
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
Take more from Jquery
Take more from Jquery
Magento Dev
 
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Yandex
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7
Eugene Fidelin
 
jQuery. Введение и практика
jQuery. Введение и практика
Slava Aliev
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
Yandex
 
QA Fest 2019. Андрей Солнцев. Selenide для профи
QA Fest 2019. Андрей Солнцев. Selenide для профи
QAFest
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
MoscowJS
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
Technopark
 
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
MoscowJS
 
Quick introduction jQuery
Quick introduction jQuery
Shalva Usubov
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
Paul Klimov
 
Web осень 2013 лекция 8
Web осень 2013 лекция 8
Technopark
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 

Similar to Making Scalable JavaScript Application (20)

Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPA
Eugene Abrosimov
 
JSSDK: Начало
JSSDK: Начало
Константин Лебедев
 
UWDC 2013, Yii2
UWDC 2013, Yii2
Alexander Makarov
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
Andrei Solntsev
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Mobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TKConf
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
it-people
 
Yii2
Yii2
Noveo
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
private_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Ontico
 
Drupal 7 deploy database updates
Drupal 7 deploy database updates
Anton Ivanov
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном коде
Kolya Korobochkin
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Опыт разработки эффективного SPA
Опыт разработки эффективного SPA
Eugene Abrosimov
 
Selenide puzzlers @ devclub.eu
Selenide puzzlers @ devclub.eu
Andrei Solntsev
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Mobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Knockoutjs на примере 2ГИС-Онлайн
Knockoutjs на примере 2ГИС-Онлайн
2ГИС Технологии
 
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
TKConf
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
it-people
 
Yii2
Yii2
Noveo
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
private_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Ontico
 
Drupal 7 deploy database updates
Drupal 7 deploy database updates
Anton Ivanov
 
Страх и ненависть в исходном коде
Страх и ненависть в исходном коде
Kolya Korobochkin
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)
Alex Filatov
 
Ad

More from Mikhail Davydov (16)

Components now! (in russian)
Components now! (in russian)
Mikhail Davydov
 
JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)
Mikhail Davydov
 
Code Style (in russian)
Code Style (in russian)
Mikhail Davydov
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)
Mikhail Davydov
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
Mikhail Davydov
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
JavaScript. OOP (in russian)
JavaScript. OOP (in russian)
Mikhail Davydov
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
Mikhail Davydov
 
JavaScript. Introduction (in russian)
JavaScript. Introduction (in russian)
Mikhail Davydov
 
JavaScript. Basics (in russian)
JavaScript. Basics (in russian)
Mikhail Davydov
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)
Mikhail Davydov
 
JavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in Russian
Mikhail Davydov
 
Components now!
Components now!
Mikhail Davydov
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
Dart - светлая сторона силы?
Dart - светлая сторона силы?
Mikhail Davydov
 
Components now! (in russian)
Components now! (in russian)
Mikhail Davydov
 
JavaScript. Event Model (in russian)
JavaScript. Event Model (in russian)
Mikhail Davydov
 
Ajax and Transports (in russian)
Ajax and Transports (in russian)
Mikhail Davydov
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
Mikhail Davydov
 
JavaScript. Loops and functions (in russian)
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
JavaScript. OOP (in russian)
JavaScript. OOP (in russian)
Mikhail Davydov
 
JavaScript. Event Loop and Timers (in russian)
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
Modules and assembling of JavaScript (in russian)
Modules and assembling of JavaScript (in russian)
Mikhail Davydov
 
JavaScript. Introduction (in russian)
JavaScript. Introduction (in russian)
Mikhail Davydov
 
JavaScript. Basics (in russian)
JavaScript. Basics (in russian)
Mikhail Davydov
 
JavaScript. Async (in Russian)
JavaScript. Async (in Russian)
Mikhail Davydov
 
JavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in Russian
Mikhail Davydov
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
Dart - светлая сторона силы?
Dart - светлая сторона силы?
Mikhail Davydov
 
Ad

Making Scalable JavaScript Application