
andretshurotshka?❄️кде
07.10.2017
14:03:22
омг
мы же айди храним только

Max
07.10.2017
14:04:52
относится тем что многие жалуются на тормоза с редаксом из-за которого решают не хранить какие-то данные в сторе

Maksim
07.10.2017
14:05:38

Google

Viktor
07.10.2017
14:07:35
меняются только ссылки на объекты рекурсивно до изменившегося примитива, чему там тормозить?

Max
07.10.2017
14:12:57
меняются только ссылки на объекты рекурсивно до изменившегося примитива, чему там тормозить?
не меняются ссылки а пересоздаются, код {...task, comments: [...task.comments, {...comment, text: 'new text}]} создает новый объект таска и копирует туда все свойства, создает новый объект массива и копирует туда все текущие комментарии при этом если в массиве тысячу объектов то редаксу нужно перекопировать ссылки на все эти тысчячу объектов, и создает новый объект комментария который нужно изменить и копирует туда ссылки свойства которые не были изменены. И это только один уровень, а перед таском стоит проект с массивом тасков а перед проектом папка с массивом проектов. А теперь сравни с версией mobx-а : comment.text = 'newText' - ничего не создается, ничего не копируется


Dmitry
07.10.2017
14:18:20
ну если чистый мобх, то он довольно быстро работает
но не хватает таких фич как в mst со всем деревом состояний

Viktor
07.10.2017
14:20:35
не меняются ссылки а пересоздаются, код {...task, comments: [...task.comments, {...comment, text: 'new text}]} создает новый объект таска и копирует туда все свойства, создает новый объект массива и копирует туда все текущие комментарии при этом если в массиве тысячу объектов то редаксу нужно перекопировать ссылки на все эти тысчячу объектов, и создает новый объект комментария который нужно изменить и копирует туда ссылки свойства которые не были изменены. И это только один уровень, а перед таском стоит проект с массивом тасков а перед проектом папка с массивом проектов. А теперь сравни с версией mobx-а : comment.text = 'newText' - ничего не создается, ничего не копируется
а, я тебя понял: если один элемент большого массива изменился, то это боль
хм. Я даже не сталкивался с такими системами, где столько вложенности массивов


Maksim
07.10.2017
14:23:33
не меняются ссылки а пересоздаются, код {...task, comments: [...task.comments, {...comment, text: 'new text}]} создает новый объект таска и копирует туда все свойства, создает новый объект массива и копирует туда все текущие комментарии при этом если в массиве тысячу объектов то редаксу нужно перекопировать ссылки на все эти тысчячу объектов, и создает новый объект комментария который нужно изменить и копирует туда ссылки свойства которые не были изменены. И это только один уровень, а перед таском стоит проект с массивом тасков а перед проектом папка с массивом проектов. А теперь сравни с версией mobx-а : comment.text = 'newText' - ничего не создается, ничего не копируется
так это в твоей версии стора так хранится одна сущность внутри другой, ничто не мешает хранить индексы параллельно друг другу (ну как в базе таблицы с сылками по id), тогда изменение таска в твоем примере не повлечет за собой изменение проекта


blkmrkt
07.10.2017
14:28:37
ребят, не начинал нового проекта на реакте уже год. Где почитать про что сейчас круто. Как насчет:
-рутер для сервера и клиента
-что-нибудь к mobx для нормализации
-koa умерла?
-сжималка/обфускатор к вебпаку
Может стартер кит есть готовый? Я брал тот что от nightwolfz последний раз

andretshurotshka?❄️кде
07.10.2017
14:29:30
create react app

blkmrkt
07.10.2017
14:30:41

andretshurotshka?❄️кде
07.10.2017
14:30:48
хм


Max
07.10.2017
14:32:27
так это в твоей версии стора так хранится одна сущность внутри другой, ничто не мешает хранить индексы параллельно друг другу (ну как в базе таблицы с сылками по id), тогда изменение таска в твоем примере не повлечет за собой изменение проекта
ок, с нормализацией у нас будет примерно такая схема
state = {
tasks: {
....
2123: {id: 2123, name: 'task1', comments: [23, 444, 22]}
},
comments: {
...
23: {id: 23, text: 'comment1'}
}
}тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши

Google

andretshurotshka?❄️кде
07.10.2017
14:34:23
immutable)
вообще это не проблема, у меня редьюсер только ложит в стор данные которые прислал normalizr


blkmrkt
07.10.2017
14:36:18
ок, с нормализацией у нас будет примерно такая схема
state = {
tasks: {
....
2123: {id: 2123, name: 'task1', comments: [23, 444, 22]}
},
comments: {
...
23: {id: 23, text: 'comment1'}
}
}тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши
mobx state tree нашел, вроде это сейчас пушка. Единственный минус - нужно дефинировать все сущность заново в клиенте, ну и с чистым мобксом еще больше работы: https://github.com/kriasoft/react-starter-kit
Может с GraphQL с какой либой это все из коробки работает?


Artyom
07.10.2017
14:37:17
Вот посвежее
https://medium.com/@wonderboymusic/upgrading-to-relay-modern-or-apollo-ffa58d3a5d59

blkmrkt
07.10.2017
14:37:57

Nikita
07.10.2017
14:41:01
Ни у кого небыло проблем с добавлением других лоадеров в babelrc если уже есть emotion. У меня такой babelrc конфиг
{
"presets": [
"next/babel"
],
"plugins": [
[
"emotion",
{ "inline": true },
"inline-import-data-uri"
]
]
}
и последний лоадер не подключается почему то, emotion отключаю все нормально работает.


Maksim
07.10.2017
14:41:18
ок, с нормализацией у нас будет примерно такая схема
state = {
tasks: {
....
2123: {id: 2123, name: 'task1', comments: [23, 444, 22]}
},
comments: {
...
23: {id: 23, text: 'comment1'}
}
}тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши
еще раз говорю, что проблемы быстродействия меня не интересуют, меня интересует как удобнее хранить данные, а будут они в редаксе или еще где-то мне все равно


Max
07.10.2017
14:47:55
еще раз говорю, что проблемы быстродействия меня не интересуют, меня интересует как удобнее хранить данные, а будут они в редаксе или еще где-то мне все равно
так удобней хранить и работать именно со вложенными объектами - не нужно создавать контейнеры чтобы замапить айдишники на объекты, не нужно обмазываться постоянными простынями mapStateToProps, достаточно просто вывести<div>{task.comments.map(comment=><Comment comment={comment}/>)}</div> и компонент комментария получит не айдишник а сразу объект и может просто вывести <div>{this.props.comment.text}</div>. и не нужно никаких mapStateToProps. Или вот нужно например в компоненте комментария отреднерить имя папки - с айдишниками нам нужно вытаскивать несколько раз родительские объекты - state.folders[state.projects[state.tasks[comment.taskId].projectId].folderId].name чтобы добраться до папки, когда же в мобиксе можно просто пройтись по ссылками и это намного чище и проще выглядит - comment.task.project.folder.name


Dmitry
07.10.2017
14:49:42
Кстать, а что думаете про https://cerebraljs.com/docs/api/index.html ?

Maksim
07.10.2017
14:51:42


Max
07.10.2017
14:53:11

Maksim
07.10.2017
14:53:33

Алексей
07.10.2017
15:55:20
Нет, всё таки прихожу к выводу, что Redux для подавляющего числа веб приложений - это не очень хорошая вещь.

andretshurotshka?❄️кде
07.10.2017
16:03:11
а для больших?)

Artyom
07.10.2017
16:06:24
А я попробовал redux-act и сижу радуюсь теперь

Алексей
07.10.2017
16:08:47
а для больших?)
думаю, что даже для больших он не очень
видимо он для особо специфичных, когда одно действие может очень сильно изменить стейт (например совершенно разные части стейта)
но я что-то не могу придумать пример такого приложения

andretshurotshka?❄️кде
07.10.2017
16:09:04
один экшен апдейтит много редьюсеров сразу

Алексей
07.10.2017
16:09:40
в любом случае всё равно уж больно много кода поулчается, даже с redux-act

Google

Алексей
07.10.2017
16:09:55

andretshurotshka?❄️кде
07.10.2017
16:10:01
телеграм на реакте
а разве в mobx state tree нельзя то же самое сделать
то есть обновлять разные куски стейта
от одного экшена

Алексей
07.10.2017
16:12:15
ну не знаю, мне кажется что для телеграма можно и не реагировать кучей редьюсеров на один экшн, но я могу и ошибаться

andretshurotshka?❄️кде
07.10.2017
16:12:27
там API требует такого

Алексей
07.10.2017
16:12:31
а

Admin
ERROR: S client not available

andretshurotshka?❄️кде
07.10.2017
16:12:38
В одном экшене приходят юзеры, чаты и все остальное

Алексей
07.10.2017
16:12:49
понял

andretshurotshka?❄️кде
07.10.2017
16:12:49
Можно конечно разбить на много экшенов
Но это еще больше кода писать)

Алексей
07.10.2017
16:13:08
просто мне кажется, что для подобных штук редакс как раз будет удобнее, чем mobx или mobx-state-tree
но для обычных CRUD, когда ты жмакаешь на кнопку и с сервера подтягиваются данные - это не затрагивает весь стейт
надеюсь mobx наберёт хорошую такую популярность, чтобы потеснить redux, а то как мне кажется многие пихают redux во все приложения, потому что это стильно-модно-молодёжно и альтернатив особых не было раньше (Flux не берём в расчёт)
хотя mobx тоже не идеален

andretshurotshka?❄️кде
07.10.2017
16:17:23
ну просто я уже костыли начинаю пилить для нормализации/денормализации, @zerobias там уже какую-то свою штуку поверх редакса пилит

Алексей
07.10.2017
16:17:55
это тоже нехорошо

Google

Алексей
07.10.2017
16:18:20
я вообще считаю, что нормализация не нужна
это же не СУБД

andretshurotshka?❄️кде
07.10.2017
16:18:39
мне кажется надо бд обычную на фронт)

Алексей
07.10.2017
16:18:50
а вот не надо нихрена
именно что не надо
потому что СУБД хороша на больших объёмах данных, которых на фронтенде нет и не будет

andretshurotshka?❄️кде
07.10.2017
16:19:25
ну редакс вполне себе бд уже со всеми этими ids byId

Алексей
07.10.2017
16:19:31
на фронте всё спокойно размещается в оперативе

andretshurotshka?❄️кде
07.10.2017
16:19:39
так я про in memory db
Именно нормализация/денормализация и язык запросов для редакса, без ререндеров