Илья Сегеда
aka ALFer
© Sebastian Markbåge
MapReduce позволил сделать Hadoop. С помощью Hadoop показал как большие сайты обрабатывают их данные.
Dynamo описал как писать ДБ чтоб они могли работать вместе и скейлились с появлением новых нод и кластеров. Отсюда выросли Cassandra и Riak.
Twitter потом свитчнулся обратно. Но это лишь из-за не отполированности реализации идеи. Тогда же появляется Backbone.js, что способствовало росту количества приложений с такой архитектурой. (В 2011 появляется Bootstrap)
Angular.js структурировал приложения лучше Backbone.js, повысил их тестируемость и позволил шире использовать best practices, скрыв нудятину вроде binding data и rendering
В 2013 Pete Hunt выступает с докладом
Rethinking Best Practices и делает ещё одну революцию
Data
Library
DOM
Library(Data) → DOM
Но как же separation of concerns?
Но как же separation of concerns?
Темплейты разделяют не concerns, а технологии
Но как же separation of concerns?
Темплейты разделяют не concerns, а технологии
А надо уменьшить coupling и увеличить cohesion
Но как же separation of concerns?
Темплейты разделяют не concerns, а технологии
А надо уменьшить coupling и увеличить cohesion
Они неразделимы. Они творят UI
Это абстракция над логическим блоком вашего приложения
Они очень слабо связанны между собой (coupling)
Они отлично выполняют одну задачу (cohesion)
Вы пишете на JS, а не на templating language
Они являются first-class sitizen'ами для языка
Вспомним как было в 90ые с server-rendering'ом. Каждая страница была для браузера декларитивным описанием, что нужно показать
React декларативно описывает как должен выглядеть наш UI в конкретный момент времени
А чтоб это не тормозило была придумана концепция Virtual DOM
Он не обязателен
Он удобен
Вы пишете HTML на JS
<a href="http://odessajs.org/">OdessaJS FTW!</a>
React.DOM.a({ href: "http://odessajs.org/" }, "OdessaJS FTW!")
Система ивентов по бест-практис. Вместо того чтоб ловить ивенты клика в каждой ячейке таблицы можно ловить их на самой таблице. Это производительней.
React может рендерить ваше приложение в просто строку. Тоесть, его можно запустить на сервере. И это большой шаг к изоморфности
Как нам структурировать приложение так чтоб работа с данными была такой же удобной как и работа с компонентами?
Транзакция | Значение | Баланс |
---|---|---|
Создали счёт | 0 | 0 |
Депозит | 200 | 200 |
Снятие | 50 | 150 |
Депозит | 100 | 250 |
{
type: Actions.WITHDREW_FROM_ACCOUNT,
data: {
accountID: 7,
amount: 50,
date: 1429468551933
}
}
let balance = 0;
function onDispatch(action) {
switch (action.type) {
case Actions.WITHDREW_FROM_ACCOUNT:
balance -= action.data.amount;
break;
}
}
getBalance();
- О! Так это же Модели. Сейчас я сюда Бекбончик прикручу.
- Я тебе прикручу! Ты где у Сторов Сеттеры увидел?
model.balance;
store.getBalance();
Object.observe(model, changes => {...});
store.subscribe(() => {...});
model.balance = 1000000;
???
Store(initialState, ...actions) → currentState
Изменение счёта - это ведь ассинхронная операция!
function onDispatch(action) {
switch (action.type) {
case Actions.WITHDREW_FROM_ACCOUNT:
requestWithdrawal(
action.data.accountId,
action.data.amount
).then(res => balance -= res.amount);
break;
}
}
function requestWithdrawal(account, amount) {
sendWithdrawalRequest(account, amount)
.done(
res => dispatch({
type: Actions.WITHDREW_FROM_ACCOUNT,
data: {...}
}),
err => dispatch({
type: Actions.WITHDRAWAL_FAILED,
data: {...}
});
);
}
{
type: Actions.SHOW_NOTIFICATION,
data: {
message: "Возникла ошибка",
...
}
}
{
type: Actions.SHOW_NOTIFICATION,
data: {
message: "Возникла ошибка",
...
}
}
WRONG!
let messages = [];
function onDispatch(action) {
switch (action.type) {
case Actions.WITHDRAWAL_FAILED:
messages.push("Возникла ошибка");
break;
case Actions.NOTIFICATION_DISMISSED:
messages = [];
break;
...
}
}
Мы абстрагируемся над конкретной реализацией и представлением данных.
Совокупность всех Action описывает состояние нашего приложения в данный момент времени.
Зарепортить баг проще простого!
Юзер прикрепляет историю всех Action с параметрами к багрепорту (ну не совсем юзер), а мы спокойно их прокручиваем в нужном порядке и получаем нужное состояние приложения
It's already Monday but we still don't have brand new Flux implementation