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

PDF
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
PDF
Написание DSL в Perl
PDF
Суперсилы Chrome developer tools
PPTX
I tmozg js_school
PDF
Symfony2. На чем можно сэкономить время при разработке?
PPTX
I tmozg js_school_jquery
PPT
Yserver
PDF
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
Написание DSL в Perl
Суперсилы Chrome developer tools
I tmozg js_school
Symfony2. На чем можно сэкономить время при разработке?
I tmozg js_school_jquery
Yserver

What's hot (20)

PPT
Take more from Jquery
PDF
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
ODP
Работа с БД в Drupal 7
PPTX
jQuery. Введение и практика
PDF
Сергей Константинов — Что интересного готовит нам W3C
PDF
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
PDF
QA Fest 2019. Андрей Солнцев. Selenide для профи
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPT
Презентация jQuery
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PPTX
Render API.
PDF
Frontend весна 2014 лекция 1
PDF
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
PDF
Perl 5.10 и 5.12
PPT
Javascript
PDF
Quick introduction jQuery
PDF
Продвинутое использование ActiveRecord в Yii2
PPTX
Web осень 2013 лекция 8
PPT
Web осень 2012 лекция 4
PPT
Подробная презентация JavaScript 6 в 1
Take more from Jquery
"Адаптивный дизайн интерфейса JS API Яндекс.Карт и особенности его реализации...
Работа с БД в Drupal 7
jQuery. Введение и практика
Сергей Константинов — Что интересного готовит нам W3C
"Рекомендации по проектированию API" — Марина Степанова, Яндекс
QA Fest 2019. Андрей Солнцев. Selenide для профи
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
Презентация jQuery
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
Render API.
Frontend весна 2014 лекция 1
"Dependency Injection. JavaScript.", Сергей Камардин, MoscowJS 15
Perl 5.10 и 5.12
Javascript
Quick introduction jQuery
Продвинутое использование ActiveRecord в Yii2
Web осень 2013 лекция 8
Web осень 2012 лекция 4
Подробная презентация JavaScript 6 в 1
Ad

Similar to Making Scalable JavaScript Application (20)

PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
PDF
Опыт разработки эффективного SPA
PPTX
PDF
UWDC 2013, Yii2
PPTX
Selenide puzzlers @ devclub.eu
PDF
JavaScript Базовый. Занятие 11.
PDF
Внутреннее устройство и оптимизация бандла webpack
PDF
Jsfwdays 2013-2
PDF
Mobile automation uamobile
PDF
Knockoutjs на примере 2ГИС-Онлайн
PDF
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
PPTX
iOS and Android Mobile Test Automation
PDF
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
PPTX
Yii2
PPT
Профилирование и оптимизация jQuery–кода
PPT
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
PPT
Drupal 7 deploy database updates
PDF
Страх и ненависть в исходном коде
PDF
Обзор ES2015(ES6)
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Опыт разработки эффективного SPA
UWDC 2013, Yii2
Selenide puzzlers @ devclub.eu
JavaScript Базовый. Занятие 11.
Внутреннее устройство и оптимизация бандла webpack
Jsfwdays 2013-2
Mobile automation uamobile
Knockoutjs на примере 2ГИС-Онлайн
TК°Conf. 10 проблем автоматизации UI и их решение с помощью JDI. Роман Иовлев.
iOS and Android Mobile Test Automation
DUMP-2013 Frontend - Возможности последних WEB-стандартов в API Яндекс.Карт -...
Yii2
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Drupal 7 deploy database updates
Страх и ненависть в исходном коде
Обзор ES2015(ES6)
Ad

More from Mikhail Davydov (16)

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

Making Scalable JavaScript Application