Fork me on GitHub
#clojure-russia
<
2016-07-17
>
andrewboltachev13:07:11

Всем привет. Может ли кто-то подсказать способ "перезагрузки" (hot reload) go-блоков в Figwheel?

artemyarulin13:07:34

в смысле?

andrewboltachev13:07:30

ну есть go-блок, и когда я сохраняю файл (`core.cljs`), он создаётся ещё раз

artemyarulin13:07:12

Хм, а это плохо? Ну можно defonce сделать, потом у фигвила есть пара мета параметров чтоб можно пометить что не перегружать

andrewboltachev13:07:45

ну просто получается два блока, которые читают их одних и тех же каналов

andrewboltachev13:07:54

а потом три и т д

andrewboltachev13:07:18

я пытался сделать как-то так: http://dpaste.com/2XT7GF1#line-40

andrewboltachev13:07:22

только вот сообщение "Go loop will exit" я вижу, но ощущение такое что он продолжает работать

andrewboltachev13:07:38

последнее что я думал — это нужно дожидаться когда в канал, который возвращается go-блоком при его завершении поступит сообщение, а уже потом создавать новый

artemyarulin13:07:40

т.е. го блок пересоздается, а канал нет? Может проще с помощью

Figwheel will not load or reload files that haven't been required by your application. If you want to force a file to be loaded when it changes add the follwoing meta-data the namespace declaration of the file:
(ns ^:figwheel-load example.core)
пересоздавать каналы каждый раз?

andrewboltachev13:07:47

хм, интересно... мне кажется что эта опция у меня уже включена

andrewboltachev13:07:42

ну да, ничего не меняется

andrewboltachev14:07:42

дождаться тоже не получится, так как <! нельзя использовать не в go-блоках

andrewboltachev14:07:09

попробую ещё что-то придумать

andrewboltachev14:07:19

спасибо за помощь @artemyarulin !

artemyarulin14:07:14

да не за что, я ж даже и не помог 🙂

andrewboltachev14:07:02

ну я просто зачастую думаю, что иду не тем путём, особенно так как я отказался от React'а сейчас

andrewboltachev14:07:45

хотя наверное все им пользуются

artemyarulin14:07:14

а почему и на что решил уйти если не секрет?

artemyarulin14:07:30

только не говори что на ангулярку 🙂

andrewboltachev14:07:44

ну ангуляр я даже не знаю))

andrewboltachev14:07:30

вот, просто на DOM. как js/document.createElement (что можно заменить на более кроссбраузерное jQuery или Google Closure Library и т п)

andrewboltachev14:07:26

причина была в том, что когда я делал один проект, мне был нужен виджет sortable

andrewboltachev14:07:20

и я понял, как это трудно сделать в React. один код ReactDND (drag-n-drop) внушает ужас

andrewboltachev14:07:22

я также понял, что с React'ом можно попрощаться с всем jQuery UI, Bootstrap-компонентами, также другими библиотеками и скорее всего теми, которые рисуют на canvas'е

andrewboltachev14:07:34

например как sigma.js

andrewboltachev14:07:53

да и эти же TinyMCE, CKEditor использовать нельзя

andrewboltachev14:07:15

(хотя для тех или иных библиотек есть там "версии" для React)

andrewboltachev14:07:53

@artemyarulin: а ты много используешь React/Om Next и т п?

artemyarulin14:07:17

Ох, ты два раза упомянул jQuery - по мне дак это шаг назад после реакта, хотя хз. Когда конечно один виджет то тащить 100кб (или скок там реакт весит?) это перебор да. Bootstrap вроде нормально с реактом дружит, у меня знакомые юзают все ок, хотя сам не пробовал. jQuery UI эт точно мимо реакта да - у них совсем разные идеологии, хотя может и можно смержить, хз Я да - везде юзаю реакт, начинал с om-next, плюнул, ушел на Rum ну и ессно пишу свой враппер “быстрее-выше-сильнее” 🙂

andrewboltachev14:07:24

меня просто немного впечатлили слова Миши Нискина (Boot, Hoplon) — то что jQuery "самая battle-tested библиотека, а GC валится даже на простых примерах"

andrewboltachev14:07:55

вот значит какой опыт у них был, но сам я ничего такого сказать не могу

artemyarulin14:07:00

ну тут зависит конечно от аудитории - если тебе нужно 100% покрытия и всякие IE8, Android 2.0, iOS 5 нужны то наверно и да. Когда же тебе надо 80% результата за 20% времени - то ну его нафег

andrewboltachev14:07:38

хмм... ну это тоже верно. у меня и так, и так бывает. а по поводу Om Next — конечно, трудно сказать когда даже просто бета-версия выйдет 🙂

andrewboltachev14:07:59

и что у них там за "catalog of approaches" по поводу простой задачи как роутинг

artemyarulin14:07:55

вот https://github.com/tonsky/rum очень легковесный - все сорсы можно за 10 минут прочитать, прям ах (особенно после ома, где без пол литры не разобраться)

andrewboltachev14:07:21

без теории категорий не разобраться 😄

andrewboltachev14:07:47

а как в Rum'е со state? покомпонентно или "в едином атоме"?

andrewboltachev14:07:15

я просто ещё (в JS уже) пытался разобраться с Relay

artemyarulin14:07:30

дак в этом и фича - сам решай. Можешь на курсорах, можешь как в оме, хошь можешь несколько атомов

andrewboltachev14:07:59

я думаю некоторые едва даже помнят что это такое

artemyarulin14:07:17

релей няшный когда на серваке у тебя GraphQL (или подобное Datomic), прям ах ах

andrewboltachev14:07:34

дак писанины много очень

artemyarulin14:07:09

перефразирую - на презентациях и хелло ворлд примерах выглядит очень круто! 😄

artemyarulin14:07:20

я сам не пробовал)

andrewboltachev14:07:47

ну он завязан на ES6

andrewboltachev14:07:04

нам любителям CLJS и попробовать не хочется)))

nsa14:07:46

> я сам не пробовал) Вроде как автор где-то тут есть

andrewboltachev14:07:32

автор Relay?

andrewboltachev14:07:13

а, ну само собой. ну а речь про Relay шла

nsa15:07:31

да, простите, my bad

misha15:07:12

@artemyarulin: если бы с омом можно было с поллитрой разобраться...

misha15:07:02

хотя пока я тут нахлобучиваю на роме и датаскрипте, с учетом скоростей и отзывчивости юая - всё больше ом некст получается, смешанные чувства (* для ios)

rmuslimov15:07:10

меня кстати вот сейчас активно мучает вопрос какой выбрать фреймворк для работы со стейтом чтобы в комбинации с Rum было что то похожее на om.next

rmuslimov15:07:38

мне не нравится в om.next достаточно корявый формат описания компонентов

rmuslimov15:07:07

какой то немного космический на мой взгляд

lapooh15:07:00

@rmuslimov: а в чем кажется "космичность"? Не понимаю, зачем использовать комбинацию фреймворков, чтобы сделать что-то похожее на om.next

rmuslimov16:07:13

"Не понимаю, зачем использовать комбинацию фреймворков” - правда не понимаете? Rum не предлагает ничего для работы со стейтом, поэтому хочется подсмотреть где то решение как это делать

rmuslimov16:07:26

> чтобы сделать что-то похожее на om.next ну не в смысле сделать тоже самое, а хотя бы выбрать стратегию работы со стейтом, на том же уровне

rmuslimov16:07:40

> а в чем кажется "космичность"? Тяжело читать, намного тяжелее чем других open-source решения. Много на мой взгляд соглашений в коде - например тот формат описания :keys + :tempids

rmuslimov16:07:09

мне как новичку сложно отойти от quick-start и начать что писать в своем видении

rmuslimov16:07:25

могу перефразировать вопрос, свой начальный вопрос: “кто что использует для работы с данными в комбинации с Rum или другой легкой оберткой над реактом"?

rmuslimov16:07:07

вообщем насоветуйте мне чего нибудь пожта, на этой неделе решающий батл за рефакторинг большого проекта js vs. cljs. Хочется подготовленным к нему подойти

artemyarulin16:07:03

вроде был аналог redux гдет, тоже по мне дак отличное решение для стейта

artemyarulin16:07:05

может быть ага.

rmuslimov16:07:03

помоему он сильно завязан на реагент

rmuslimov17:07:49

да не это не об том

rmuslimov17:07:13

что-то по типу redux нужно

andrewboltachev17:07:38

reframe — это как раз клон redux и есть... где-там доклад-то: https://www.youtube.com/watch?v=aI0zVzzoK_E

andrewboltachev17:07:54

я правда только слышал, не разбирался

andrewboltachev17:07:24

и доклад этот тоже не очень понял, т.е. на практике не использовал

rmuslimov17:07:42

да, но так понимаю он завязан на reagent

andrewboltachev17:07:59

да, скорее всего. так что @rmuslimov вам скорее всего придётся самому писать 🙂

artemyarulin17:07:38

можно взять сам redux и написать враппер для него и потом продать жсникам. Как там в презентации - “Вы сразу не говорите что вы пишете на ClojureScript. Вы скажите что у вас JavaScript и специальная библиотека для него” 😄

rmuslimov20:07:24

да как то не хочется такими вещами заниматься

konukhov20:07:13

>что-то по типу redux нужно редукс на cljs очень легко заимплементить самому с core.async + transducers. берешь канал с трансдюсером (он же (map reducer-fn)), на диспатч кладешь ивенты туда, а с другой стороны канала atom или ratom, если ты юзаешь реагент. грубо говоря. я тут расписал примерно в ридми + сделал экспериментальную имплементацию – https://github.com/konukhov/redux-cljs

rmuslimov20:07:51

о, здорово

konukhov20:07:53

@rmuslimov: можешь попробовать. у меня работает, будет ли работать для твоих целей – не знаю. не будет – пиши, будем улучшать 🙂

rmuslimov20:07:58

буду смотреть спасибо

konukhov20:07:19

кайф, если вопросы / баги / предложения будут – пиши

misha21:07:05

@rmuslimov, @konukhov, а раскажите, в чем прикол редукса в cljs ? в js мне понятно - минус куча кода, а в cljs - такое ощущение, что кода только прибавилось, нет?

misha21:07:16

может я упускаю что-то, типа транзакции сохраненные в карманчике (для отправки на сервер), или типа того?

a.espolov21:07:30

говорят redux автор разрабатывал смотря на om

konukhov21:07:36

так в том же, что и для джс. у тебя менеджмент стейта изолирован, а экшны – чистые функции.

konukhov21:07:15

а стейт – в черной коробке

rmuslimov21:07:44

> говорят redux автор разрабатывал смотря на om вряд ли

misha21:07:48

у меня и так стейт изолирован в неймспейсе, а экшены - чистые функции, но без каналов и макросов этих всех.

misha21:07:29

я правда пока не увидел преимущество над atom, add-watch, swap!/reset!

misha21:07:04

@konukhov: чем индерекция через

(def inc-action {:type :inc})
(def dec-action {:type :dec})

(defreducer reducer [state data]
  :inc (update-in state [:counter] inc)
  :dec (update-in state [:counter] dec))
лучше и изолированее, чем просто атом и функцию апдейта положить в отдельный неймспейс (my.app.screen.dao/state/db)?

misha21:07:24

еще и интерфейсы нагорожены.

konukhov21:07:50

ну тут, как я понимаю, смысл в том, что у тебя есть dispatch и имя экшна твоего + один event bus. ты диспатчишь ивент, а с другой стороны меняется стейт. ты не вызываешь функцию отдельную на каждое изменение стейта, а ты мапишь своим редюсером стрим ивентов. с точки зрения абстракции – просто другой подход.

misha21:07:33

чем вызывать диспатч на разных экшенах выгоднее вызова разных функций?

konukhov21:07:05

типа, у тебя есть отдельный ns, так? в нем у тебя лежит db-atom какой-то и куча функций для апдейта, так?

misha21:07:27

единственное отличие, что я увидел - это (предполагаю) - ивенты в одном басе, строго последовательно. но в атоме ж это и так - так?

artemyarulin21:07:54

Сори что вклиниваюсь. Подскажите, для тестов - есть данные [1 2 3], есть функция с коллбеком (f number cb), хочется зааплаить эту функцию на каждый элемент данных и убедится что каждый коллбек возвращает правильные данные. С одним элементом я всегда делал просто

(deftest t
  (let [p (promise)
         cb #(deliver p %)] ;; + some asserts
   (f 1 cb)
   @p))
Хочется что-нить типа promise.all([p1 p2 p3])), но найти не могу

misha21:07:52

я реально вижу бонус только в том, что можно транзакции хранить и отправлять на сервер/хранить не результат, а последовательность ивентов, из которых стейт считать потом, как в кафке (в кафке же, да?)

misha21:07:53

@artemyarulin: тебе апплай нужен, который раскроет список?

konukhov21:07:53

ага, так можно, но я не вижу в этом смысла, если честно 🙂

misha21:07:04

@artemyarulin: или тебе собрать со всех результаты в список?

konukhov21:07:29

а в целом – redux – это просто другой подход и все (типа, state = map(reducer, endless-event-stream). я не говорю, что это лучше того, что ты написал, например.

artemyarulin21:07:36

@misha: А все, протупил, отмена, всем спасибо 🙂

konukhov21:07:47

на тему core.async - это претензия к моей имплементации все-таки

konukhov21:07:54

что его тащить приходится

misha21:07:55

(map <чототам> [1 2 3] [p1 p2 p3]) kappa

artemyarulin21:07:55

продолжайте важный холивар trollface

konukhov21:07:57

и макро тоже 🙂

konukhov21:07:02

я не холиварю кстати!

misha21:07:59

@konukhov: я к корасинку не цепляюсь даже. хочу увидеть, зачем вообще "такой" подход, если есть атомы и эд-воч. почему последних нехватает

konukhov21:07:34

add-watch не понимаю, как тут будет работать

konukhov21:07:44

чтобы он сработал – тебе надо свапнуть атом, так?

artemyarulin21:07:15

кста коли вы тут про вотчеры - если у меня 100500 раз атом изменится, то вотчер отработает для всех изменений или там опимизация и debounce какой есть? Просто думал юазать его как очередь как-то...

misha21:07:36

@konukhov: допустим ты выбросил макросы и корасинк, что осталось? диспатч - индерекция модификаций стейта: вместо функций с аргументами - экшены. зачем? что-то еще кроме этого останется?

misha21:07:55

@artemyarulin: думаю, для всех, это твоя задача померджить все апдейты в одну функцию (в меньше функций) и в свап отдать

konukhov21:07:56

тут даже add-watch в таком случае не нужен. у тебя есть

(ns db)

(def my-state (atom 0))

(defn inc []
  (swap! inc my-state))

konukhov21:07:59

ты про такое?

misha21:07:36

@konukhov: ну да, только (swap! my-state inc) kappa

konukhov21:07:39

функция = action dispatch = вызови функцию из ns

konukhov21:07:43

упс 🙂

misha21:07:25

ну да, я понимаю, не понимаю нафига разделять

misha21:07:04

понимаю, если на сервер/с сервера отправляются ивенты, а не результаты

misha21:07:33

типа {:initial 0, :events [:inc :inc :inc :inc :dec :dec :inc :inc :inc]} вместо тупо 5

misha21:07:32

(конечно, для сложных юзкейсов оно сильно полезнее может быть, чем :inc/:dec)

misha21:07:10

просто такая изоляция теоретически могла бы быть прикольнее для супер стейта - свалки всего на свете для аппликейшена

konukhov21:07:29

а тут и получается, что стейт глобальный и один.

konukhov21:07:36

в джном редуксе, по-моему, тоже так

konukhov21:07:00

и фишка его именно в том, что у тебя нет доступа к нему напрямую – только через интерфейс в виде экшнов

misha21:07:08

но вот я пишу ios реакт-нейтивом, и оно тупо здыхает на самом маленьком сабскрайбе в :will-mount - анимации перелистывания вьюх дергаются, всё пропало

misha21:07:06

особенно, если у тебя в стеке больше 1 вью, и все подписаны на что-то меняющееся. а если на один и тот же убер-атом - ...

misha21:07:46

потому (на мобилочке) хранить всё в куче - не вариант.

konukhov21:07:56

ага, понятно

misha21:07:46

а если не вариант, то начинается плодёжь Store и редюсеров, и тд, и тогда еще более неочевидно, зачем оно надо

konukhov21:07:00

в таком случае каша будет, да

konukhov21:07:14

но вот тогда вопрос – джсный redux тоже не вариант, получается?

misha21:07:15

повторюсь, на ванильном js - я бы такое с радостью использовал наверное, потому что там гайки

misha21:07:57

ну 5 жсных редуксов наверное всё равно сильно меньше кода, чем жс без редукса kappa

konukhov21:07:57

хотя в cljs и так уже дофига инструментов + структуры данных и тд

misha21:07:19

ну или чище хотя бы

rmuslimov21:07:48

у нас в домашней дискуссии было долгое обсуждение и позиция ребят с js, что подход redux позволяет разделить данные и представление таким образом что тесты писать очень удобно

rmuslimov21:07:14

я с редуксом не знаком, честно говоря эту позицию не совсем понял

rmuslimov21:07:24

отчего в обычной жизни им тесты не пишутся

misha21:07:37

@rmuslimov: в кложе/скрипте с этим же по-умолчанию всё ок, нет?

rmuslimov21:07:00

ну вот если взять подход с курсорами

misha21:07:22

функции, атом в аргумент, биндинг на крайний случай

rmuslimov21:07:52

то это все таки не так красиво, как с редуксом когда надо тестировать каждый метод который изменяет стейт

misha21:07:09

курсоры - дохлый номер на мобилах (даже моб браузерах, не реакт нейтив), да и вообще, кмк

rmuslimov21:07:21

там вот в тесте получается надо на создавать вирутальных атомов и тд

rmuslimov21:07:29

не про мобилы пока не идет речь

rmuslimov21:07:49

мне понравилась мини библиотека с funcool/lentes

rmuslimov21:07:52

с курсорами

rmuslimov21:07:40

если все-таки приложение большое, я все-таки согласился с точкой зрения что большой стейт тяжело вот так вот руками перебирать

misha21:07:17

@rmuslimov: {:onClick #(swap! STATE f)} вместо` {:onClick f}` (что так же коротко, как и {:onClick (dispatch store action)}) и тогда тестируй свои чистые f сколько влезет

konukhov21:07:58

@rmuslimov: на деле в том же редуксе тебе все равно руками придется перебирать, но не сам атом, а кучу экшнов и гигантский редюсер.

misha21:07:18

если про мобилы речь не идет, а про громадный стейт - идет - datascript kappa

rmuslimov21:07:33

а что там бочку катили что медленно?

misha21:07:41

ну на мобиле (реакт нейтив и мобилные браузера(андроид)) же и ммедленно

rmuslimov21:07:51

а десктопе прям все ок?

konukhov21:07:58

судя по нашему разговору, я понял, что если для мобилы – то вообще почти все медленно 🙂

rmuslimov21:07:06

подожди Cоловьев писал недавно, что слез и ушел в атомы

misha21:07:21

ну он с андроидами нищебродскими борется

misha21:07:44

ему нужно везде

misha21:07:03

но раз тебе "не везде" - то датаскрипт ваще

rmuslimov21:07:19

хм, сейчас пойду и туда посмотрю снова

misha21:07:36

@konukhov: я сделал атомы + вочеры + датаскрипт обернутый в реакт нейтив модуль

misha21:07:39

песня

konukhov21:07:01

а вотчеры что делают? обновляют интерфейс?

misha21:07:10

напрямую на базу не подпишешься - ласты склеиваются моментально (на атом, впрочем, тоже kappa )

misha21:07:14

да, но они не в маунте, а rum/react

misha21:07:57

типа в аргументы приходит атом, оно так не захлебывается на анимациях перелистывания вьюх

konukhov21:07:16

а датаскрипт сам все в атоме хранит?

misha21:07:27

(которая считается в js-треде реакт нейтива, my ass)

rmuslimov21:07:28

так, я кажется перестал понимать, а как подписать на изменение в базу

rmuslimov21:07:38

пример бы с rum/reactive тривиальный

misha21:07:34

@konukhov: да, но он в другой js машине живет, и в других тредах выполняется kappa

konukhov21:07:04

а с серваком там руками надо общаться? или нужно еще на сервер ставить datomic какой-то и тд?

misha21:07:39

но релевантная к топику часть: атомы с данными, свапы и чистые функции для изменения, без всяких редуксов

misha21:07:52

(откуда данные в атомах - дело десятое)

misha21:07:18

ну у меня датомик troll

konukhov21:07:34

понятно)

misha21:07:37

и шлю я туда (принимаю оттуда) транзакции

konukhov21:07:46

ну да, тут удобно, наверно – я ни с датомиком, ни с датаскриптом пока не игрался

misha21:07:55

ну замени датаскрипт пачкой GET/POST "классических" - редукс полезнее не станет

misha21:07:36

разве что, если ты редуксовые логи отправлять будешь, тогда да - заменять вызовы функций на ивенты - самое оно

konukhov21:07:16

вот я смотрю

konukhov21:07:45

хотя да, если заменить ключи и ф-ции из редюсера на просто функции

konukhov21:07:05

и вместо диспач просто делать swap! с этой функцией

konukhov21:07:14

в целом ничего не изменится по организации кода того же

konukhov21:07:18

но будет проще

konukhov21:07:10

тут был emoji с Дэвидом Ноленом – не могу его найти

misha21:07:49

что-то "проще" и Девид у меня не ассоциируются troll

konukhov21:07:00

аха-ха-ха

konukhov21:07:05

я больше про чистый cljs

konukhov21:07:18

на om мне страшно смотреть даже

misha22:07:44

я ом-некст начал понимать (понимать зачем это всё) только когда в дебри аппликейшена полез. он реально для серьезных случаев; где супер-оптимизации подписей на изменения и походов за данными нужны

konukhov22:07:19

он уже зарелизился? я вообще не следил

misha22:07:34

и оптимизаций мест вызовов всяких clj->js, которые реально начинают быть заметными

konukhov22:07:44

ага, понятно

misha22:07:56

последний раз проверял в январе.