37
pragmadash Денис Речкунов node.js-разработчик Изоморфные JavaScript-приложения с Catberry.js

«Изоморфные js приложения с использованием catberry.js», Денис Речкунов

  • Upload
    devday

  • View
    1.882

  • Download
    2

Embed Size (px)

DESCRIPTION

Обзор изоморфных js-фреймворков и разбор фреймворка Catberry.js.

Citation preview

Page 1: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

pragmadash Денис Речкуновnode.js-разработчик

Изоморфные JavaScript-приложенияс Catberry.js

Page 2: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Изоморфные приложения?

Page 3: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Одностраничный фронт-енд & SEO бэк-енд

Page 4: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Один код и

одно поведение

Page 5: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Зачем?Хочется:

1. Иметь одностраничное приложение

2. Не жертвовать SEO

3. Не повторяться (DRY)

4. Одну языковую среду — JavaScript

5. Экономить ресурсы сервера

6. И чтобы все это было просто

5

Page 6: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

И не только мне хочется• Rendr (AirBnb)

• Kraken (Paypal)

• Mojito (Yahoo)

• Meteor

• Derby

• Invisible

• Ezel

• ... who knows?

6

Page 7: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Почему они

не так хороши?

Page 8: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Используют фронт-енд на сервере• Rendr, Ezel — Backbone

• Mojito — YUI

• MEAN — Angular

8

Page 9: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Привязаны к одной БДНапример, MongoDB:

• Rendr

• Meteor

• Derby + Redis

9

Page 10: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Навязывают сложный real-time• Meteor

• Derby

10

Page 11: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

А хочется-то

просто сайт

Page 12: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Page 13: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Catberry.js

Page 14: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Service-Module-Placeholer• Service — RESTful API про данные

(node, Scala, Erlang и что угодно)

• Module — Подготовка данных для шаблона и обработка событий

• Placeholder — Шаблон

14

Page 15: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Почему не MVC?• Нет обработки и хранения данных как в Model

• Все обрабатывается и хранится на удаленном Service

• Placeholder не привязан к Model как View

• Placeholder привязан к Module

• Module инициатор обновления Placeholder`ов, а не Model

• Отслеживается состояние Module, а не Model

15

Page 16: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Page 17: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Потоковый рендеринг с бэк-енда• Нет "белого экрана"

• Браузер не простаивает

• Экономим память

17

Page 18: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов
Page 19: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Параллельный рендеринг на фронт-енде• Когда меняется состояние модуля

• Все запросы к RESTful API параллельны

• Все очень быстро

19

Page 20: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Настоящая изоморфность• URL path

• Очистка URL hash

• User Agent

• Referrer

• Чтение/редактирование Cookie

• Redirect

• Universal HTTP(S) request

• Rendered cache

20

Page 21: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Module API

Page 22: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Service Locatorlocator.register(‘uhr’, UHR);

locator.registerInstance('uhr', new UHR());

locator.resolve(‘uhr’);

locator.resolveAll(‘uhr’);

locator.resolveInstance(SomeConstructorDependsOnUHR);

01.

02.

03.

04.

05.

22

Page 23: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Dependency Injectionfunction ModuleConstructor ($uhr, someConfigSection) {

// use injected $uhr

// and event config sections

}

01.

02.

03.

04.

23

Page 24: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Render methodModuleConstructor.prototype.renderSome = function () {

// get data from somewhere

return {some: data}; //

};

01.

02.

03.

04.

24

Page 25: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

After methodModuleConstructor.prototype.afterRenderSome =

function (dataContext) {

// do everything with rendered Placeholder

};

01.

02.

03.

04.

25

Page 26: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Handle methodModuleConstructor.prototype.handleSome = function (event) {

// do something

// event.args

// event.element

// event.isEnding

// event.isHashChanging

};

01.

02.

03.

04.

05.

06.

07.

26

Page 27: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Submit methodModuleConstructor.prototype.submitSome = function (event) {

// handle form submit

// event.values

// event.element

};

01.

02.

03.

04.

05.

27

Page 28: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Конвенции именования

Page 29: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Auto camelCaseЕсли шаблон называется some-cool-placeholder

ModuleConstructor.prototype.renderSomeCoolPlaceholer =

function () {

// ...

};

И так для всех методов

01.

02.

03.

04.

29

Page 30: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

PromisesМожно адаптировать колбэки

return new Promise(function (fulfill, reject) {

fulfill(result); // when ready

// or

reject(error); // if error

});

01.

02.

03.

04.

05.

30

Page 31: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

PromisesЧейнинг асинхронного кода

promise

.then(function (result) {

// return Promise

})

.then(function (result) {

// return result

});

01.

02.

03.

04.

05.

06.

07.

31

Page 32: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

PromisesОбработка ошибок в одном месте

promise

// many .then

.then(null, function (error) {

// handle error

});

01.

02.

03.

04.

05.

32

Page 33: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

А где-то уже используется?

konfettin.ru

flamp.ru (скоро)

catberry.org (скоро)

33

Page 34: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Open Source

— это круто!

Page 35: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Благодаря чему все это есть?• Идея потокового рендеринга взята с trumpet

github.com/substack/node-trumpet

• Серверный код работает в браузере благодаря browserify

github.com/substack/node-browserify

• Используется форк форка шаблонизатора Dust

github.com/catberry/catberry-dust

• И все это подключается к express/connect

github.com/strongloop/express / github.com/senchalabs/connect

35

Page 36: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Где узнать больше?

github.com/catberry/catberry

twitter.com/catberryjs

runnable.com/catberry

$ npm -g install catberry-cli

$ catberry init example

01.

02.

36

Page 37: «Изоморфные js приложения с использованием catberry.js», Денис Речкунов

Вопросы?