SlideShare ist ein Scribd-Unternehmen logo
1 von 45
Downloaden Sie, um offline zu lesen
Изоморфный JavaScript
Будущее уже здесь
Денис Речкунов, Flamp
«Мартин, в будущем
JavaScript изоморфный!»
Что такое изоморфный JavaScript код?
• Исполняется в различных окружениях
(нам важен сервер и браузер)
• Гарантирует одно поведение
• Справляется с разностью окружений через абстракции
3
Что он нам даёт?
• Мы можем создать изоморфный Web UI
• Который будет строить HTML на сервере для SEO
• Работать как Single Page Application в браузере
• Получим единую языковую среду — JavaScript
• Максимально переиспользуем код
• Получим прирост производительности на старте (ms vs sec)
4
Что он нам не даёт?
• Не работаем с хранилищем
• Как правило, работаем с RESTful API
• Не включает код для обеспечения безопасности
• Чаще всего это только Web UI
5
Как мы к этому пришли?
27 мая 2009 года вышел релиз
Автор — Райан Дал, разработчик из Joyent
Вот оно!
В 2011 году вышел релиз сборщика
Автор — Джеймс Холлидей (substack)
Словно Делориан для изоморфного
JavaScript
Люди начали его использовать
В своих проектах
18 октября 2011 появился пост Nodejitsu
"Scaling Isomorphic Javascript Code"
9 ноября 2011 nodejitsu представляет
фреймворк
16 июня 2012 года Yahoo релизит
фреймворк Mojito
Но термин "изоморфный"
Стал популярным благодаря
Спайку Брехему из Airbnb
11 ноября 2013 появляется пост
"Isomorphic JavaScript:
The Future of Web Apps"
Позже Спайк Брехм выступает на
JSConf 2014 с докладом
"Building Isomorphic Apps"
Как добиться изоморфизма?
Нужно решить ряд проблем
• Разный рендеринг
• Зависимость от окружения
• Запросы за данными к RESTful API по-разному
• Собирать серверный код для браузера
19
Разный рендеринг
Virtual DOM (на сервере)
• Имитация DOM для фронт-енд фреймворка на сервере
• Приложение применяет изменения к эталонному DOM
• Происходит сериализация в строку HTML
• HTML уходит в браузер
21
Virtual DOM (в браузере)
• Приложение делает изменения в Virtual DOM
• Состояние Virtual DOM сравнивается с DOM
• При найденном отличии применяется поэлементный patch к DOM
• Используется в React
22
Мартин не в восторге от Virtual DOM
Template Helpers (на сервере)
• Берем шаблонизатор, например Handlebars
• Определяем Helper, который будет рендерить View с данными
• При вызове хелпера запрашиваем данные для шаблона
• Рендерим шаблон с данными, создавая элемент-обертку с меткой
• Когда отрендерили все View – отдаем HTML браузеру
24
Template Helpers (в браузере)
• Компилируем шаблоны для браузера
• Клиентский код привязывается к помеченным элементам-обёрткам
• Обновляем поддеревья DOM (каждую View полностью)
25
Мартин по-прежнему не сильно рад
Прогрессивный рендеринг (на сервере)
• Используем кастомные тэги HTML
• Используем Node.js Streams API и реализуем Transform Stream
• ourTransform.pipe(response).end(root.render());
• Transform Stream ищет наши тэги в потоке HTML
• Если нашел—рендерит в них соответствующий шаблон
• Который пропускается через такой же Transform Stream
• Весь отрендеренный HTML сразу порциями уходит в браузер
27
Когда у вас прогрессивный рендеринг
29
Прогрессивный рендеринг (в браузере)
• Компилируем шаблоны для браузера
• Используем привязки клиентского кода по нашим тэгам HTML
• Обновляем поддеревья DOM (каждый HTML-тэг полностью)
• Используется в Catberry.js
30
Мы с Мартином выбираем этот вариант
Как балансировать между серверным и
браузерным окружением
Серверный роутер
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
Серверный контекст
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
Браузерный роутер
Router.prototype.route = function (state) {
var context = { ... }
renderer.render(state, context);
};
01.
02.
03.
04.
35
Браузерный контекст
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
На что срабатывает роутинг?
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
Ну а остальное детали
Запросы к API по-разному
• На сервере http или https модули node.js
• В браузере XMLHttpRequest
• Есть готовые решения
(superagent, catberry-uhr, iso-http)
39
Собирать серверный код для браузера
• Для нас это уже делает browserify
• Умеет подставлять браузерные версии модулей node.js
• Делает заглушки для того, что работать не может
• Можно указать в package.json замену на браузерную версию
40
package.json
"browser": {
"./lib/Renderer.js": "./browser/Renderer.js",
"./lib/Router.js": "./browser/Router.js"
}
01.
02.
03.
04.
41
И так, что мы имеем?
• Рендеринг можно реализовать несколькими способами
• С разницей окружений вполне можно разобраться
• Есть готовые изоморфные npm-пакеты для HTTP-запросов
• Browserify решает проблемы со сборкой
42
Готовые фреймворки:
• Meteor
• Derby
• React
• Catberry.js
• Slot
• Taunus
• ещё на isomorphic.net
43
Будущее уже здесь
Несколько изоморфных веб-приложений:
• instagram.com
• flickr.com
• airbnb.ru
• 2gis.ru
• konfettin.ru
• flamp.ru
44
Спасибо за внимание!
catberry.org
Денис Речкунов, Flamp (denis.rechkunov@gmail.com)
pragmadash

Weitere ähnliche Inhalte

Was ist angesagt?

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
Anastasia Goryacheva
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico
 

Was ist angesagt? (20)

Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016МРТ для данных, Frontend Conf 2016
МРТ для данных, Frontend Conf 2016
 
Vue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людейVue.js - реактивный фронтенд фреймворк для людей
Vue.js - реактивный фронтенд фреймворк для людей
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScriptCSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
 
Быстро о быстром
Быстро о быстромБыстро о быстром
Быстро о быстром
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
 
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
Стабильность WebGL приложений / Кирилл Дмитренко (Яндекс)
 

Andere mochten auch

DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
DUMP-2013 Serverside - Разработка развесистого API - Коржнев СергейDUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
it-people
 

Andere mochten auch (20)

«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин
 
Article25
Article25Article25
Article25
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных
 
Партицирование и миграции данных на примере PostgreSQL — Денис Иванов, 2ГИС
Партицирование и миграции данных на примере PostgreSQL — Денис Иванов, 2ГИСПартицирование и миграции данных на примере PostgreSQL — Денис Иванов, 2ГИС
Партицирование и миграции данных на примере PostgreSQL — Денис Иванов, 2ГИС
 
Используем неизменяемые данные и создаем качественный код — Игорь Кудрин, 2ГИС
Используем неизменяемые данные и создаем качественный код — Игорь Кудрин, 2ГИСИспользуем неизменяемые данные и создаем качественный код — Игорь Кудрин, 2ГИС
Используем неизменяемые данные и создаем качественный код — Игорь Кудрин, 2ГИС
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин
 
«Как работают менеджеры продукта в 2ГИС»  – Павел Мочалкин, 2ГИС
 «Как работают менеджеры продукта в 2ГИС»  – Павел Мочалкин, 2ГИС «Как работают менеджеры продукта в 2ГИС»  – Павел Мочалкин, 2ГИС
«Как работают менеджеры продукта в 2ГИС»  – Павел Мочалкин, 2ГИС
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
«Построение Read Model-ей с использованием потоков событий» — Денис Иванов, 2ГИС
«Построение Read Model-ей с использованием потоков событий» — Денис Иванов, 2ГИС«Построение Read Model-ей с использованием потоков событий» — Денис Иванов, 2ГИС
«Построение Read Model-ей с использованием потоков событий» — Денис Иванов, 2ГИС
 
Continuous Delivery, или волшебная кнопка для релизов по запросу — Денис Яков...
Continuous Delivery, или волшебная кнопка для релизов по запросу — Денис Яков...Continuous Delivery, или волшебная кнопка для релизов по запросу — Денис Яков...
Continuous Delivery, или волшебная кнопка для релизов по запросу — Денис Яков...
 
DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
DUMP-2013 Serverside - Разработка развесистого API - Коржнев СергейDUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
DUMP-2013 Serverside - Разработка развесистого API - Коржнев Сергей
 
«Тестируем мобильное приложение в суровых реалиях Интернета» – Андрей Усов, 2ГИС
«Тестируем мобильное приложение в суровых реалиях Интернета» – Андрей Усов, 2ГИС«Тестируем мобильное приложение в суровых реалиях Интернета» – Андрей Усов, 2ГИС
«Тестируем мобильное приложение в суровых реалиях Интернета» – Андрей Усов, 2ГИС
 
Cергей Коржнев, 2ГИС
Cергей Коржнев, 2ГИСCергей Коржнев, 2ГИС
Cергей Коржнев, 2ГИС
 
«Девиации и патологии в отношениях с руководителями и подчинёнными» — Степан ...
«Девиации и патологии в отношениях с руководителями и подчинёнными» — Степан ...«Девиации и патологии в отношениях с руководителями и подчинёнными» — Степан ...
«Девиации и патологии в отношениях с руководителями и подчинёнными» — Степан ...
 
«Badger — инструмент для мониторинга качества продуктов» – Ирина Шрейдер, 2ГИС
«Badger — инструмент для мониторинга качества продуктов» – Ирина Шрейдер, 2ГИС«Badger — инструмент для мониторинга качества продуктов» – Ирина Шрейдер, 2ГИС
«Badger — инструмент для мониторинга качества продуктов» – Ирина Шрейдер, 2ГИС
 
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
«Реактивные грабли» — Дмитрий Кулижников, 2ГИС
 
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
«GitHub Flow — немного сложнее, чем на бумаге», Александр Бирюков
 
Тимофей Чаптыков «Верстальщик должен быть ленивый»
Тимофей Чаптыков «Верстальщик должен быть ленивый»Тимофей Чаптыков «Верстальщик должен быть ленивый»
Тимофей Чаптыков «Верстальщик должен быть ленивый»
 
Github Flow. Тестировщики против тестирования
Github Flow. Тестировщики против тестированияGithub Flow. Тестировщики против тестирования
Github Flow. Тестировщики против тестирования
 

Ähnlich wie Изоморфный JavaScript — будущее уже здесь

Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Ontico
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
Roman Dvornov
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
KewpaN
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
HappyDev
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
Technopark
 

Ähnlich wie Изоморфный JavaScript — будущее уже здесь (20)

Изоморфные Java script приложения с catberry.js
Изоморфные Java script приложения с catberry.jsИзоморфные Java script приложения с catberry.js
Изоморфные Java script приложения с catberry.js
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для Caché
 
State of the Standardized Web. YaC 2014
State of theStandardized Web. YaC 2014State of theStandardized Web. YaC 2014
State of the Standardized Web. YaC 2014
 
State of the Standardized Web
State of the Standardized WebState of the Standardized Web
State of the Standardized Web
 
Remote (dev)tools своими руками
Remote (dev)tools своими рукамиRemote (dev)tools своими руками
Remote (dev)tools своими руками
 
6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting6 создание распределенных приложений по технологии remoting
6 создание распределенных приложений по технологии remoting
 
Использование встроенных или подключаемых средств браузеров для тестирования ...
Использование встроенных или подключаемых средств браузеров для тестирования ...Использование встроенных или подключаемых средств браузеров для тестирования ...
Использование встроенных или подключаемых средств браузеров для тестирования ...
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
MockServer-driven development
MockServer-driven developmentMockServer-driven development
MockServer-driven development
 
WebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double funWebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double fun
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 

Mehr von CodeFest

Mehr von CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

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

  • 1. Изоморфный JavaScript Будущее уже здесь Денис Речкунов, Flamp
  • 3. Что такое изоморфный JavaScript код? • Исполняется в различных окружениях (нам важен сервер и браузер) • Гарантирует одно поведение • Справляется с разностью окружений через абстракции 3
  • 4. Что он нам даёт? • Мы можем создать изоморфный Web UI • Который будет строить HTML на сервере для SEO • Работать как Single Page Application в браузере • Получим единую языковую среду — JavaScript • Максимально переиспользуем код • Получим прирост производительности на старте (ms vs sec) 4
  • 5. Что он нам не даёт? • Не работаем с хранилищем • Как правило, работаем с RESTful API • Не включает код для обеспечения безопасности • Чаще всего это только Web UI 5
  • 6. Как мы к этому пришли?
  • 7. 27 мая 2009 года вышел релиз Автор — Райан Дал, разработчик из Joyent
  • 9. В 2011 году вышел релиз сборщика Автор — Джеймс Холлидей (substack)
  • 10. Словно Делориан для изоморфного JavaScript
  • 11. Люди начали его использовать В своих проектах
  • 12. 18 октября 2011 появился пост Nodejitsu "Scaling Isomorphic Javascript Code"
  • 13. 9 ноября 2011 nodejitsu представляет фреймворк
  • 14. 16 июня 2012 года Yahoo релизит фреймворк Mojito
  • 15. Но термин "изоморфный" Стал популярным благодаря Спайку Брехему из Airbnb
  • 16. 11 ноября 2013 появляется пост "Isomorphic JavaScript: The Future of Web Apps"
  • 17. Позже Спайк Брехм выступает на JSConf 2014 с докладом "Building Isomorphic Apps"
  • 19. Нужно решить ряд проблем • Разный рендеринг • Зависимость от окружения • Запросы за данными к RESTful API по-разному • Собирать серверный код для браузера 19
  • 21. Virtual DOM (на сервере) • Имитация DOM для фронт-енд фреймворка на сервере • Приложение применяет изменения к эталонному DOM • Происходит сериализация в строку HTML • HTML уходит в браузер 21
  • 22. Virtual DOM (в браузере) • Приложение делает изменения в Virtual DOM • Состояние Virtual DOM сравнивается с DOM • При найденном отличии применяется поэлементный patch к DOM • Используется в React 22
  • 23. Мартин не в восторге от Virtual DOM
  • 24. Template Helpers (на сервере) • Берем шаблонизатор, например Handlebars • Определяем Helper, который будет рендерить View с данными • При вызове хелпера запрашиваем данные для шаблона • Рендерим шаблон с данными, создавая элемент-обертку с меткой • Когда отрендерили все View – отдаем HTML браузеру 24
  • 25. Template Helpers (в браузере) • Компилируем шаблоны для браузера • Клиентский код привязывается к помеченным элементам-обёрткам • Обновляем поддеревья DOM (каждую View полностью) 25
  • 27. Прогрессивный рендеринг (на сервере) • Используем кастомные тэги HTML • Используем Node.js Streams API и реализуем Transform Stream • ourTransform.pipe(response).end(root.render()); • Transform Stream ищет наши тэги в потоке HTML • Если нашел—рендерит в них соответствующий шаблон • Который пропускается через такой же Transform Stream • Весь отрендеренный HTML сразу порциями уходит в браузер 27
  • 28.
  • 29. Когда у вас прогрессивный рендеринг 29
  • 30. Прогрессивный рендеринг (в браузере) • Компилируем шаблоны для браузера • Используем привязки клиентского кода по нашим тэгам HTML • Обновляем поддеревья DOM (каждый HTML-тэг полностью) • Используется в Catberry.js 30
  • 31. Мы с Мартином выбираем этот вариант
  • 32. Как балансировать между серверным и браузерным окружением
  • 33. Серверный роутер 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
  • 34. Серверный контекст 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
  • 35. Браузерный роутер Router.prototype.route = function (state) { var context = { ... } renderer.render(state, context); }; 01. 02. 03. 04. 35
  • 36. Браузерный контекст 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
  • 37. На что срабатывает роутинг? 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
  • 39. Запросы к API по-разному • На сервере http или https модули node.js • В браузере XMLHttpRequest • Есть готовые решения (superagent, catberry-uhr, iso-http) 39
  • 40. Собирать серверный код для браузера • Для нас это уже делает browserify • Умеет подставлять браузерные версии модулей node.js • Делает заглушки для того, что работать не может • Можно указать в package.json замену на браузерную версию 40
  • 42. И так, что мы имеем? • Рендеринг можно реализовать несколькими способами • С разницей окружений вполне можно разобраться • Есть готовые изоморфные npm-пакеты для HTTP-запросов • Browserify решает проблемы со сборкой 42
  • 43. Готовые фреймворки: • Meteor • Derby • React • Catberry.js • Slot • Taunus • ещё на isomorphic.net 43
  • 44. Будущее уже здесь Несколько изоморфных веб-приложений: • instagram.com • flickr.com • airbnb.ru • 2gis.ru • konfettin.ru • flamp.ru 44
  • 45. Спасибо за внимание! catberry.org Денис Речкунов, Flamp (denis.rechkunov@gmail.com) pragmadash