
Дмитрий
22.09.2017
21:00:12
То есть store, условно,
type Store = Array<{
method: string,
timestamp: number,
args: any
}>
Ясно))

Maxim
22.09.2017
21:07:18

Дмитрий
22.09.2017
21:08:03
А от чего тебя отговорили ?
Да не от чего собственно, просто тут иногда обсуждают способы управления стейтом и регулярно появляются чуваки топящие за mobx

Google

Дмитрий
22.09.2017
21:08:28
Подумал было: "О, подходящий кейс", но что-то как-то не айс(

Stepan
22.09.2017
21:11:11
А mobx сильно удобнее redux?

Maxim
22.09.2017
21:11:39
С mobx я довольно быстро расстрелял себе ноги, а с state-tree не разбирался. Возможно время поменялось и есть хорошие аргументы за

Дмитрий
22.09.2017
21:12:18

Denis
22.09.2017
21:12:27
Ничего не поменялось :)

Maxim
22.09.2017
21:15:23
вот последнее прям дробовик в ноги )

Дмитрий
22.09.2017
21:15:53
Понятно, убедительно ?

Котяй Негодяй
22.09.2017
21:17:07
Если вкраце, "мы развлекались, как могли. Но сейчас по-тихому пилим на редаксе"?

Maxim
22.09.2017
21:17:54
Игрались, так и есть )

Denis
22.09.2017
21:21:13
Мобикс стоит попробовать для того чтобы ярче ощутить плюсы ридакса

Котяй Негодяй
22.09.2017
21:21:59
Скажите. А у AST есть какой-то формат? Или я могу распарсить что-нибудь в понятную одному мне структуру, по которой буду генерить код, и я могу называть это AST?

Google

Maxim
22.09.2017
21:22:02
Кстати, сейчас вооружился оптикой, заюзал альтернативное IO для саги, и редакс остался нужен только для связки прикольных тулзовин )
ну тупа девтулс классный для сравнения стейтов и т.д.
Понятно, убедительно ?
ты таки собрал себе тулзу с призмами и куртизанками для редакса ? или редюсерами обходишься ?

Дмитрий
22.09.2017
21:40:08

Котяй Негодяй
22.09.2017
21:51:49

Дмитрий
22.09.2017
21:52:29
Ага

Котяй Негодяй
22.09.2017
21:52:34
Что если я таки распарсил TG Bot API и сделал своё AST на коленке? Его нужно подгонять под стандарты?

Дмитрий
22.09.2017
21:53:44
Знаешь как появился текущий "стандарт" (с вариациями)? Мозилла просто сделали свою имплеменацию по каким-то своим нуждам, в итоге все подхватили

Stepan
22.09.2017
21:54:23
Что такое AST?

Дмитрий
22.09.2017
21:54:32
А где ты кстати в bot api сделаешь ast? Там публичный же только сам api-интерфейс

Котяй Негодяй
22.09.2017
21:55:07

Ostap
22.09.2017
21:55:26
https://twitter.com/sebmck/status/911347263187845120

Дмитрий
22.09.2017
21:55:34

Котяй Негодяй
22.09.2017
21:56:10
Надёжно. Единственное, возвращаемые типы приходится подставлять руками. Для этого завёл словарь.
Я парсил ДОКУМЕНТАЦИЮ. =)))
Нигде же больше нет.

Google

Котяй Негодяй
22.09.2017
21:57:01
Ни схемы, ничего.
А апишка обновляется.

Дмитрий
22.09.2017
21:57:51
Ну описание api это всё же несколько иное)

Котяй Негодяй
22.09.2017
21:58:01
Вот результат:
https://github.com/bigslycat/tgapi/blob/rethinking/src/generatedTypes.js

Дмитрий
22.09.2017
21:58:34
!! Кстати!
Пока вспомнил))

Котяй Негодяй
22.09.2017
21:58:43
4000 строк, я бы вспотел.
Мм?

Дмитрий
22.09.2017
21:59:05
http://transform.now.sh is really impressive. Just give it a JSON response and it will generate type definitions for you.
typescript / flow тайпинги

Котяй Негодяй
22.09.2017
22:00:24
оооо
graphql-to-flow

Кирилл
22.09.2017
23:00:28
https://code.facebook.com/posts/300798627056246/relicensing-react-jest-flow-and-immutable-js/

Denis
22.09.2017
23:25:44
https://twitter.com/reactjs/status/911347634069168128
:)


Max
22.09.2017
23:38:20
каждый лепил сторы к своим формам по своему, не было понимания как собственно организовать стор. Как сериализовывать его изменения. Как откатывать в случае неудавшихся оптимистичных апдейтов
я например пришел к таким практикам - стор лучше организовывать по сущностям - не пилить один стор-класс на все приложение, как некоторые делают (или явно создают стор как лишнюю сущность только для того чтобы хранить массив задач - TodosStore наример) а организовывать по бизнес-объектам. Например есть приложение project-менеджер, где юзер может создать папки, в папках проекты, в проектах доски, в досках таски, в тасках комментарии и на эти комментарии можно отвечать (получаем древовидные комментарии). И соотвественно каждую папку, проект, доску, таск и комментарий можно отредактировать и удалить. Более того мы не привязываемся в данном случае к тому как выглядит ui, потому что он вообще может быть совершенно разным и постоянно меняться, и вообще важно не делать привязку к ui при хранении состояния. В редаксе я заметил что все организовывают состояние совершенно по разному а с мобиксом такую (и любую другую) бинес-схему приложения можно реализовать одним единственным образом через создание стора на каждую сущность. В данном случае у нас будет стор User, стор Folder, стор Project, стор Board, стор Task и стор Comment и будет такой набор классов
class User {
@observable folders = []
@observable name = ''
....
}
class Folder {
@observable projects = []
@observable user;
@observable name = ''
....
}
class Project {
@observable boards = []
@observable folder
@observable name = ''
....
}
class Board {
@observable tasks = []
@observable project
@observable name = ''
....
}
class Task {
@observable comments = []
@observable board
@observable text = ''
....
}
class Comment {
@observable comments = []
@observable parentComment
@observable task
@observable text = ''
....
}и соотвественно когда нужно создать отредактировать или удалить любую сущность мы делаем примерно так
//create
var task = new Task()
task.text = 'some text'
task.board = board
board.tasks.push(task)
//remove
task.board.tasks.splice(task.board.tasks.indexOf(task),1)
//edit
task.text = 'new text'либо если хотим уменьшить болерплейт и вручную не присваивать каждое свойство то можно создаем базовый класс для сущностей и добавить метод create() и update() и тогда получаем task.update({text: 'new text', board: board}) или Task.create({text: 'new text', board: board})
class BaseStore {
static create(data){
return (new this()).update(data)
}
update(data){
return Object.assign(this, data)
}
}При этом можем заменить таск на любую другую сущность и у нас ничего не меняется когда в редаксе нужно создавать отдельные редюсеры на каждую сущность.
Теперь насчет оптимистических обновлений - поскольку мы можем перехватывать любое обновление в базовом классе то мы можем создать некий массив-буффер обнолений, складывать в него объекты обновлений data и при ошибке откатывать. Или можно развить дальше и сделать чтобы базовый класс при вызове метода task.update({text: 'new text'}) не просто делал Object.assign а и логгировал каждое обновление как редакс, диспатчил какие-то экшены и делал снимки состояния чтобы получить плюшки иммутабельности редакса - time-travel и hot-reload и вообще он может заодно и отсылать запрос на сервер, а добавив еще статический метод fetch будет врапить полученные объекты от сервера в классы
var user = User.create()
user.folders.push(...await Folder.fetch(user))
var folder = await Folder.create({name: 'new folder', user: user}) //посылает запрос на сервер на создание папки
user.folders.push(folder)
await folder.update({name: 'new folder name'}) //обновляет локально и посылает запрос на сервер
await folder.delete() //посылает запрос на удаление папки
folder.user.folders.splice(folder.user.folders.indexOf(folder),1)В примере выше если для оптимистичных обновлений не нужно дожидаться ответа от сервера то можно добавить вторым параметром флаг чтобы update() возвращал не промис а сам объект и тогда его запушить в массив родительской сущности и получить обновление компонентов пока запрос выполняется


Котяй Негодяй
22.09.2017
23:40:23
о.0
А у Вас, случайно, не Толстой фамилия?

Max
22.09.2017
23:46:28
)), нет, я хотел ответь кратко но не удержался)

Google


Sergey
22.09.2017
23:47:02
я например пришел к таким практикам - стор лучше организовывать по сущностям - не пилить один стор-класс на все приложение, как некоторые делают (или явно создают стор как лишнюю сущность только для того чтобы хранить массив задач - TodosStore наример) а организовывать по бизнес-объектам. Например есть приложение project-менеджер, где юзер может создать папки, в папках проекты, в проектах доски, в досках таски, в тасках комментарии и на эти комментарии можно отвечать (получаем древовидные комментарии). И соотвественно каждую папку, проект, доску, таск и комментарий можно отредактировать и удалить. Более того мы не привязываемся в данном случае к тому как выглядит ui, потому что он вообще может быть совершенно разным и постоянно меняться, и вообще важно не делать привязку к ui при хранении состояния. В редаксе я заметил что все организовывают состояние совершенно по разному а с мобиксом такую (и любую другую) бинес-схему приложения можно реализовать одним единственным образом через создание стора на каждую сущность. В данном случае у нас будет стор User, стор Folder, стор Project, стор Board, стор Task и стор Comment и будет такой набор классов
class User {
@observable folders = []
@observable name = ''
....
}
class Folder {
@observable projects = []
@observable user;
@observable name = ''
....
}
class Project {
@observable boards = []
@observable folder
@observable name = ''
....
}
class Board {
@observable tasks = []
@observable project
@observable name = ''
....
}
class Task {
@observable comments = []
@observable board
@observable text = ''
....
}
class Comment {
@observable comments = []
@observable parentComment
@observable task
@observable text = ''
....
}и соотвественно когда нужно создать отредактировать или удалить любую сущность мы делаем примерно так
//create
var task = new Task()
task.text = 'some text'
task.board = board
board.tasks.push(task)
//remove
task.board.tasks.splice(task.board.tasks.indexOf(task),1)
//edit
task.text = 'new text'либо если хотим уменьшить болерплейт и вручную не присваивать каждое свойство то можно создаем базовый класс для сущностей и добавить метод create() и update() и тогда получаем task.update({text: 'new text', board: board}) или Task.create({text: 'new text', board: board})
class BaseStore {
static create(data){
return (new this()).update(data)
}
update(data){
return Object.assign(this, data)
}
}При этом можем заменить таск на любую другую сущность и у нас ничего не меняется когда в редаксе нужно создавать отдельные редюсеры на каждую сущность.
Теперь насчет оптимистических обновлений - поскольку мы можем перехватывать любое обновление в базовом классе то мы можем создать некий массив-буффер обнолений, складывать в него объекты обновлений data и при ошибке откатывать. Или можно развить дальше и сделать чтобы базовый класс при вызове метода task.update({text: 'new text'}) не просто делал Object.assign а и логгировал каждое обновление как редакс, диспатчил какие-то экшены и делал снимки состояния чтобы получить плюшки иммутабельности редакса - time-travel и hot-reload и вообще он может заодно и отсылать запрос на сервер, а добавив еще статический метод fetch будет врапить полученные объекты от сервера в классы
var user = User.create()
user.folders.push(...await Folder.fetch(user))
var folder = await Folder.create({name: 'new folder', user: user}) //посылает запрос на сервер на создание папки
user.folders.push(folder)
await folder.update({name: 'new folder name'}) //обновляет локально и посылает запрос на сервер
await folder.delete() //посылает запрос на удаление папки
folder.user.folders.splice(folder.user.folders.indexOf(folder),1)В примере выше если для оптимистичных обновлений не нужно дожидаться ответа от сервера то можно добавить вторым параметром флаг чтобы update() возвращал не промис а сам объект и тогда его запушить в массив родительской сущности и получить обновление компонентов пока запрос выполняется
А я думал, ты просто уснул на клаве


Anton
22.09.2017
23:49:23
а можно просто использовать apollo

Denis
22.09.2017
23:49:59
Тсс

Max
22.09.2017
23:50:04

Ilya
23.09.2017
01:59:07
Можно ли как-нибудь убрать именовку определенного .scss файла localIdentName: '[name]_[local]___[hash:base64:10]' при помощи коммента например, чтобы у меня глобальные классы иконок типа "fa-tint" не превращались в ".index_fa-tint___1pLxGuIuuC"?
Сделал отдельный таск .scssglobal где убрал эту опцию, нормальный это варинт или я велосипед придумал?

Anton
23.09.2017
03:07:37
тут дело скорее в css модулях. там есть селектор :global

Petr
23.09.2017
04:43:51

маша
23.09.2017
04:45:05
? Нашла чат для INSTAGRAMЩИКОВ, залетай: @inst_admins123 ?

☢Jura
23.09.2017
05:04:15
подскажите плиз. Если при итерации массива я хочу прокинуть данные элемента в колбек, какой лучший способ мне нужно использовать. Как вариант:
handler = (item) => (e) => { … }
....
render() {
…. onClick={this.handler(item)}
}
В этом варианте очевидно что ф-ция в замыкании создается каждый раз при вызове render. Правильно ли я понимаю, что более экономично проставить элементу data-id и затем найти нужный элемент в списке. Если в этом будет необходимость?

Dmitry
23.09.2017
06:11:50
Надеюсь не бояню
Facebook объявил о перелицензировании React, Jest, Flow и Immutable.js
Facebook пришёл к компромиссному решению вопроса обеспечения совместимости своего кода с проектами фонда Apache и объявил о смене лицензии на проекты React, Jest, Flow и Immutable.js. Вместо ранее применяемой для этих проектов лицензии BSD с дополнительным соглашением об использовании патентов ("BSD+Patent") утверждена лицензия MIT.

Kolyamba
23.09.2017
06:16:16

andretshurotshka?❄️кде
23.09.2017
06:21:11
ждем пока обратно не поменяют лицензию

Andrey
23.09.2017
06:33:26
Знать бы ещё что mit лицензия даёт.

Stepan
23.09.2017
07:01:09

Алексей
23.09.2017
07:52:55

Andrey
23.09.2017
08:08:59
http://www.opennet.ru/opennews/art.shtml?num=47253

kana
23.09.2017
08:14:12
Чёт слишком резкий переход

Artyom
23.09.2017
08:22:27
Где (в каком файле) vscode описаны расширения?

Google


Oleg
23.09.2017
09:47:44
Кто подскажет как организовать такую работу.
В кратце, есть "доска объявлений" в который есть страницы выдачи с формой (фильтры) для поиска необходимых данных, форма довольна обширная. На этой страницу по дефолты забиты данные в сторе и в didMount сразу идет подгрузка данных, при смене параметров соотвествнно выдачу обновляем.
Но, помимо этой страницы, есть главная страницы с такой же формой, которая подтягивает параметры из того же редьюсера. Соответсвенно выбираем параметры, попадаем на страницу выдачи с правильными данными уже. В данной ситуации как бы более менее понятно все, как реализовать.
Но есть еще ссылки, блоки (цели) при клике на которые мы попадаем на тут же страницы выдачи и сразу должны подгрузиться нужные данные по целе. Эти ссылки / цели включают в себя просто набор готовых параметров для фильтра. (/ads¶m=1¶m=2)
Как правильно разрулить это все?
На данным момент ссылки /цели реализовал через параметры в роуте, но после перехода на выдачу - смены какого-либо параметры в выдаче - после перехода на объявления на выдаче и возврате на выдачу из роута подтягиваются данные, из ссылки. Из этого я пришел к тому, что можно это решить более адеватно без роутов и так далее.
Может кто предложить варианты?


Max
23.09.2017
10:20:55

kana
23.09.2017
10:33:20
Не скажу, что это лучший вариант, так как нужно передавать мусорный элемент в компонент, который не должен этого знать, но наверное самый эффективный, потому что альтернатива - делать лямбды в рендере (хотя если использовать какой withHandlers из рекомпоза, то норм)

Максим
23.09.2017
11:19:20
А посоветуйте какой-нить готовый react.js-шаблон с уже настроенными sass, jade, и редаксом?

andretshurotshka?❄️кде
23.09.2017
11:19:58
jade???

Сергей
23.09.2017
11:20:54

Дмитрий
23.09.2017
11:20:58
Seems legit

Таймураз
23.09.2017
11:21:20

illiatshurotshka❄️
23.09.2017
11:21:21
jsj

Максим
23.09.2017
11:21:43
Хорошо, можно без джейда

illiatshurotshka❄️
23.09.2017
11:21:54