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)

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

Similar to Making Scalable JavaScript Application (20)

PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
PDF
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
PDF
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
 
PDF
JavaScript Базовый. Занятие 09.
Igor Shkulipa
 
PDF
Изоморфные Java script приложения с catberry.js
lugnsk
 
PDF
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Yandex
 
PDF
RequireJS і Magento 2
Elogic Magento Development
 
PPTX
Быстрая и безболезненная разработка клиентской части веб-приложений
Yaroslav Tkachenko
 
PPTX
Построение собственного JS SDK — зачем и как?
buranLcme
 
PPTX
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
rit2010
 
PPTX
разработка Metro style приложений
Олег Винников
 
PDF
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 
PPTX
Full Stack разработка на JavaScript
Олег Шерыхалин
 
PPTX
Windows Azure and node js
Alex Tumanoff
 
PDF
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
PDF
Frontend: Путешествие в мир модульных загрузчиков
CodeFest
 
PDF
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Yandex
 
PDF
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JSib
 
PDF
Mobile web apps
Pavlo Iuriichuk
 
PDF
Асинхронный JavaScript
Александр Рудевич
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
 
JavaScript Базовый. Занятие 09.
Igor Shkulipa
 
Изоморфные Java script приложения с catberry.js
lugnsk
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Yandex
 
RequireJS і Magento 2
Elogic Magento Development
 
Быстрая и безболезненная разработка клиентской части веб-приложений
Yaroslav Tkachenko
 
Построение собственного JS SDK — зачем и как?
buranLcme
 
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
rit2010
 
разработка Metro style приложений
Олег Винников
 
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 
Full Stack разработка на JavaScript
Олег Шерыхалин
 
Windows Azure and node js
Alex Tumanoff
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
Frontend: Путешествие в мир модульных загрузчиков
CodeFest
 
Марина Степанова "Как мы заставили API Яндекс.Карт работать быстрее"
Yandex
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JSib
 
Mobile web apps
Pavlo Iuriichuk
 
Асинхронный JavaScript
Александр Рудевич
 
Ad

More from Mikhail Davydov (16)

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

Making Scalable JavaScript Application