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

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

Upload: yandex

Post on 22-Jun-2015

711 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

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