Изоморфный javascript — будущее уже здесь

45
Изоморфный JavaScript Будущее уже здесь Денис Речкунов, Flamp

Upload: codefest

Post on 28-Jul-2015

651 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Изоморфный JavaScript — будущее уже здесь

Изоморфный JavaScript

Будущее уже здесь

Денис Речкунов, Flamp

www.princexml.com
Prince - Non-commercial License
This document was created with Prince, a great way of getting web content onto paper.
Page 2: Изоморфный JavaScript — будущее уже здесь

«Мартин, в будущем

JavaScript изоморфный!»

Page 3: Изоморфный JavaScript — будущее уже здесь

Что такое изоморфный JavaScript код?• Исполняется в различных окружениях

(нам важен сервер и браузер)

• Гарантирует одно поведение

• Справляется с разностью окружений через абстракции

3

Page 4: Изоморфный JavaScript — будущее уже здесь

Что он нам даёт?• Мы можем создать изоморфный Web UI

• Который будет строить HTML на сервере для SEO

• Работать как Single Page Application в браузере

• Получим единую языковую среду — JavaScript

• Максимально переиспользуем код

• Получим прирост производительности на старте (ms vs sec)

4

Page 5: Изоморфный JavaScript — будущее уже здесь

Что он нам не даёт?• Не работаем с хранилищем

• Как правило, работаем с RESTful API

• Не включает код для обеспечения безопасности

• Чаще всего это только Web UI

5

Page 6: Изоморфный JavaScript — будущее уже здесь

Как мы к этому пришли?

Page 7: Изоморфный JavaScript — будущее уже здесь

27 мая 2009 года вышел релиз

Автор — Райан Дал, разработчик из Joyent

Page 8: Изоморфный JavaScript — будущее уже здесь

Вот оно!

Page 9: Изоморфный JavaScript — будущее уже здесь

В 2011 году вышел релиз сборщика

Автор — Джеймс Холлидей (substack)

Page 10: Изоморфный JavaScript — будущее уже здесь

Словно Делориан для изоморфногоJavaScript

Page 11: Изоморфный JavaScript — будущее уже здесь

Люди начали его использовать

В своих проектах

Page 12: Изоморфный JavaScript — будущее уже здесь

18 октября 2011 появился пост Nodejitsu

"Scaling Isomorphic Javascript Code"

Page 13: Изоморфный JavaScript — будущее уже здесь

9 ноября 2011 nodejitsu представляетфреймворк

Page 14: Изоморфный JavaScript — будущее уже здесь

16 июня 2012 года Yahoo релизитфреймворк Mojito

Page 15: Изоморфный JavaScript — будущее уже здесь

Но термин "изоморфный"

Стал популярным благодаряСпайку Брехему из Airbnb

Page 16: Изоморфный JavaScript — будущее уже здесь

11 ноября 2013 появляется пост

"Isomorphic JavaScript:The Future of Web Apps"

Page 17: Изоморфный JavaScript — будущее уже здесь

Позже Спайк Брехм выступает наJSConf 2014 с докладом

"Building Isomorphic Apps"

Page 18: Изоморфный JavaScript — будущее уже здесь

Как добиться изоморфизма?

Page 19: Изоморфный JavaScript — будущее уже здесь

Нужно решить ряд проблем• Разный рендеринг

• Зависимость от окружения

• Запросы за данными к RESTful API по-разному

• Собирать серверный код для браузера

19

Page 20: Изоморфный JavaScript — будущее уже здесь

Разный рендеринг

Page 21: Изоморфный JavaScript — будущее уже здесь

Virtual DOM (на сервере)• Имитация DOM для фронт-енд фреймворка на сервере

• Приложение применяет изменения к эталонному DOM

• Происходит сериализация в строку HTML

• HTML уходит в браузер

21

Page 22: Изоморфный JavaScript — будущее уже здесь

Virtual DOM (в браузере)• Приложение делает изменения в Virtual DOM

• Состояние Virtual DOM сравнивается с DOM

• При найденном отличии применяется поэлементный patch к DOM

• Используется в React

22

Page 23: Изоморфный JavaScript — будущее уже здесь

Мартин не в восторге от Virtual DOM

Page 24: Изоморфный JavaScript — будущее уже здесь

Template Helpers (на сервере)• Берем шаблонизатор, например Handlebars

• Определяем Helper, который будет рендерить View с данными

• При вызове хелпера запрашиваем данные для шаблона

• Рендерим шаблон с данными, создавая элемент-обертку с меткой

• Когда отрендерили все View – отдаем HTML браузеру

24

Page 25: Изоморфный JavaScript — будущее уже здесь

Template Helpers (в браузере)• Компилируем шаблоны для браузера

• Клиентский код привязывается к помеченным элементам-обёрткам

• Обновляем поддеревья DOM (каждую View полностью)

25

Page 26: Изоморфный JavaScript — будущее уже здесь

Мартин по-прежнему не сильно рад

Page 27: Изоморфный JavaScript — будущее уже здесь

Прогрессивный рендеринг (на сервере)• Используем кастомные тэги HTML

• Используем Node.js Streams API и реализуем Transform Stream

• ourTransform.pipe(response).end(root.render());

• Transform Stream ищет наши тэги в потоке HTML

• Если нашел—рендерит в них соответствующий шаблон

• Который пропускается через такой же Transform Stream

• Весь отрендеренный HTML сразу порциями уходит в браузер

27

Page 28: Изоморфный JavaScript — будущее уже здесь
Page 29: Изоморфный JavaScript — будущее уже здесь

Когда у вас прогрессивный рендеринг

29

Page 30: Изоморфный JavaScript — будущее уже здесь

Прогрессивный рендеринг (в браузере)• Компилируем шаблоны для браузера

• Используем привязки клиентского кода по нашим тэгам HTML

• Обновляем поддеревья DOM (каждый HTML-тэг полностью)

• Используется в Catberry.js

30

Page 31: Изоморфный JavaScript — будущее уже здесь

Мы с Мартином выбираем этот вариант

Page 32: Изоморфный JavaScript — будущее уже здесь

Как балансировать между серверным ибраузерным окружением

Page 33: Изоморфный JavaScript — будущее уже здесь

Серверный роутерRouter.prototype.route = function (request, response) {

var context = { ... };

var state = this.getState(request.url);

renderer.render(state, context, response);

};

01.

02.

03.

04.

05.

33

Page 34: Изоморфный JavaScript — будущее уже здесь

Серверный контекстvar context = {

userAgent: request.headers['user-agent'],

location: request.url,

redirect: function (url) {

response.writeHead(302, {Location: url});

},

getCookie: function () { return request.headers.cookie; }

setCookie: function (string) {

response.setHeader('Set-Cookie', string);

}

};

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

34

Page 35: Изоморфный JavaScript — будущее уже здесь

Браузерный роутерRouter.prototype.route = function (state) {

var context = { ... }

renderer.render(state, context);

};

01.

02.

03.

04.

35

Page 36: Изоморфный JavaScript — будущее уже здесь

Браузерный контекстvar context = {

userAgent: window.navigator.userAgent,

location: window.location.pathname + window.location.search,

redirect: function (url) {

window.location = url;

},

getCookie: function () { return document.cookie; }

setCookie: function (string) {

document.cookie = string;

}

};

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

11.

36

Page 37: Изоморфный JavaScript — будущее уже здесь

На что срабатывает роутинг?window.addEventListener('popstate', function (event) {

router.route(event.state);

});

window.document.body.addEventListener('click', function (event) {

event.preventDefault();

var location = window.location.toString();

var state = router.getState(location);

window.history.pushState(state, '', location);

router.route(state);

});

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.

37

Page 38: Изоморфный JavaScript — будущее уже здесь

Ну а остальное детали

Page 39: Изоморфный JavaScript — будущее уже здесь

Запросы к API по-разному• На сервере http или https модули node.js

• В браузере XMLHttpRequest

• Есть готовые решения

(superagent, catberry-uhr, iso-http)

39

Page 40: Изоморфный JavaScript — будущее уже здесь

Собирать серверный код для браузера• Для нас это уже делает browserify

• Умеет подставлять браузерные версии модулей node.js

• Делает заглушки для того, что работать не может

• Можно указать в package.json замену на браузерную версию

40

Page 41: Изоморфный JavaScript — будущее уже здесь

package.json"browser": {

"./lib/Renderer.js": "./browser/Renderer.js",

"./lib/Router.js": "./browser/Router.js"

}

01.

02.

03.

04.

41

Page 42: Изоморфный JavaScript — будущее уже здесь

И так, что мы имеем?• Рендеринг можно реализовать несколькими способами

• С разницей окружений вполне можно разобраться

• Есть готовые изоморфные npm-пакеты для HTTP-запросов

• Browserify решает проблемы со сборкой

42

Page 43: Изоморфный JavaScript — будущее уже здесь

Готовые фреймворки:• Meteor

• Derby

• React

• Catberry.js

• Slot

• Taunus

• ещё на isomorphic.net

43

Page 44: Изоморфный JavaScript — будущее уже здесь

Будущее уже здесьНесколько изоморфных веб-приложений:

• instagram.com

• flickr.com

• airbnb.ru

• 2gis.ru

• konfettin.ru

• flamp.ru

44

Page 45: Изоморфный JavaScript — будущее уже здесь

Спасибо за внимание!

catberry.org

Денис Речкунов, Flamp ([email protected])

pragmadash