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

45
Масштабируемые JavaScript-приложения Михаил Давыдов JavaScript разработчик группы разработки Веб-чатов Я.Субботник, Екатеринбург, 2 июля 2011 года

description

2 июля 2011, Я.Субботник в Екатеринбурге Михаил Давыдов "Масштабируемые JavaScript-приложения" О докладе: Проектирование масштабируемых JavaScript-приложений уровня Яндекс.Почты. Чем отличается сайт от JavaScript приложения? Какие проблемы могут возникнуть при разработке многокомпонентных приложений? Какую архитектуру нужно заложить, чтобы приложение могло легко развиваться?

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

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

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

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

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

2

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

<a href="javascript:

external.AddFavorite (location, 'Мой сайт!')

"> Добавить закладку</a>

3

Байт 40 JavaScript

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

4

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

5

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

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

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

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)); });

/* Ещё десяток разных стилей и плагинов */});

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

$(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

Для сайта — это хорошо!

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

8

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

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

9

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

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

10

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

Структура

11

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

12

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

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

13

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

14

Ядро

Библиотека

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

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

Задачи Ядра

15

1. Обертка библиотеки

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

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

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

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

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

Модули

16

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

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

17

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

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

18

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

19

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

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

20

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

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

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

21

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

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

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

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

22

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

Модуль ограничен

23

1. Может — вызывать свои методы и песочницы — использовать свой HTML элемент2. Должен спрашивать разрешения3. Запрещено — создавать глобалы — использовать нестандартные глобалы — общаться с модулями напрямую

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

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))

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

25

Ядро

Библиотека

Песочница

Модули

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

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

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

26

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

27

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

Расширения

Плагины

Ядро

Библиотека

Песочница

Модули

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

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

28

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

29

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

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

30

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

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

// Слабая связанностьvar Module1 = { "init": function ($) { $.on('event', function (e) { console.log(e.data); }); }}; var Module2 = { "someAction": function ($) { $.trigger('event', 'data'); }};

31

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

32

// Слабая связанностьvar Module1 = { "init": function ($) { $.on('event', function (e) { console.log(e.data); }); }}; var Module2 = { "someAction": function ($) { $.trigger('event', 'data'); }};

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

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

33

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

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

34

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

// Синхронный кодvar Storage = { "read": function (key) { return localStorage[key]; }};

var data = Storage.read('key'), pData = process(data);$.trigger('data', pData);

35

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

// Асинхронный код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

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

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

37

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

38

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

Расширения

Плагины

Ядро

Библиотека

Песочница

Модули

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

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

39

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

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

40

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

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

41

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

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

42

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

Асинхронность — решение будущих проблем

43

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

Вопросы?

44

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

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

[email protected]

Twitter @azproduction

Habr http://azproduction.habrahabr.ru

45