This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-07-17
Channels
- # admin-announcements (1)
- # boot (24)
- # cider (8)
- # cljsjs (1)
- # cljsrn (5)
- # clojure (22)
- # clojure-greece (1)
- # clojure-italy (3)
- # clojure-russia (218)
- # clojure-spec (33)
- # clojurescript (51)
- # core-async (6)
- # cursive (1)
- # datomic (13)
- # defnpodcast (2)
- # funcool (2)
- # lein-figwheel (21)
- # onyx (41)
- # proto-repl (4)
- # protorepl (5)
- # reagent (4)
Всем привет. Может ли кто-то подсказать способ "перезагрузки" (hot reload) go-блоков в Figwheel?
в смысле?
ну есть go-блок, и когда я сохраняю файл (`core.cljs`), он создаётся ещё раз
Хм, а это плохо? Ну можно defonce сделать, потом у фигвила есть пара мета параметров чтоб можно пометить что не перегружать
ну просто получается два блока, которые читают их одних и тех же каналов
а потом три и т д
я пытался сделать как-то так: http://dpaste.com/2XT7GF1#line-40
соответственно: http://dpaste.com/2XT7GF1#line-82
только вот сообщение "Go loop will exit" я вижу, но ощущение такое что он продолжает работать
последнее что я думал — это нужно дожидаться когда в канал, который возвращается go-блоком при его завершении поступит сообщение, а уже потом создавать новый
т.е. го блок пересоздается, а канал нет? Может проще с помощью
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)
пересоздавать каналы каждый раз?хм, интересно... мне кажется что эта опция у меня уже включена
ну да, ничего не меняется
дождаться тоже не получится, так как <!
нельзя использовать не в go-блоках
попробую ещё что-то придумать
спасибо за помощь @artemyarulin !
да не за что, я ж даже и не помог 🙂
ну я просто зачастую думаю, что иду не тем путём, особенно так как я отказался от React'а сейчас
хотя наверное все им пользуются
а почему и на что решил уйти если не секрет?
только не говори что на ангулярку 🙂
ну ангуляр я даже не знаю))
вот, просто на DOM. как js/document.createElement
(что можно заменить на более кроссбраузерное jQuery или Google Closure Library и т п)
причина была в том, что когда я делал один проект, мне был нужен виджет sortable
и я понял, как это трудно сделать в React. один код ReactDND (drag-n-drop) внушает ужас
я также понял, что с React'ом можно попрощаться с всем jQuery UI, Bootstrap-компонентами, также другими библиотеками и скорее всего теми, которые рисуют на canvas'е
например как sigma.js
да и эти же TinyMCE, CKEditor использовать нельзя
(хотя для тех или иных библиотек есть там "версии" для React)
@artemyarulin: а ты много используешь React/Om Next и т п?
Ох, ты два раза упомянул jQuery - по мне дак это шаг назад после реакта, хотя хз. Когда конечно один виджет то тащить 100кб (или скок там реакт весит?) это перебор да. Bootstrap вроде нормально с реактом дружит, у меня знакомые юзают все ок, хотя сам не пробовал. jQuery UI эт точно мимо реакта да - у них совсем разные идеологии, хотя может и можно смержить, хз Я да - везде юзаю реакт, начинал с om-next, плюнул, ушел на Rum ну и ессно пишу свой враппер “быстрее-выше-сильнее” 🙂
меня просто немного впечатлили слова Миши Нискина (Boot, Hoplon) — то что jQuery "самая battle-tested библиотека, а GC валится даже на простых примерах"
вот значит какой опыт у них был, но сам я ничего такого сказать не могу
ну тут зависит конечно от аудитории - если тебе нужно 100% покрытия и всякие IE8, Android 2.0, iOS 5 нужны то наверно и да. Когда же тебе надо 80% результата за 20% времени - то ну его нафег
хмм... ну это тоже верно. у меня и так, и так бывает. а по поводу Om Next — конечно, трудно сказать когда даже просто бета-версия выйдет 🙂
и что у них там за "catalog of approaches" по поводу простой задачи как роутинг
вот https://github.com/tonsky/rum очень легковесный - все сорсы можно за 10 минут прочитать, прям ах (особенно после ома, где без пол литры не разобраться)
без теории категорий не разобраться 😄
а как в Rum'е со state? покомпонентно или "в едином атоме"?
я просто ещё (в JS уже) пытался разобраться с Relay
дак в этом и фича - сам решай. Можешь на курсорах, можешь как в оме, хошь можешь несколько атомов
я думаю некоторые едва даже помнят что это такое
релей няшный когда на серваке у тебя GraphQL (или подобное Datomic), прям ах ах
дак писанины много очень
перефразирую - на презентациях и хелло ворлд примерах выглядит очень круто! 😄
я сам не пробовал)
а-а )))
ну он завязан на ES6
нам любителям CLJS и попробовать не хочется)))
автор Relay?
а, ну само собой. ну а речь про Relay шла
@artemyarulin: если бы с омом можно было с поллитрой разобраться...
хотя пока я тут нахлобучиваю на роме и датаскрипте, с учетом скоростей и отзывчивости юая - всё больше ом некст получается, смешанные чувства (* для ios)
меня кстати вот сейчас активно мучает вопрос какой выбрать фреймворк для работы со стейтом чтобы в комбинации с Rum было что то похожее на om.next
@rmuslimov: а в чем кажется "космичность"? Не понимаю, зачем использовать комбинацию фреймворков, чтобы сделать что-то похожее на om.next
"Не понимаю, зачем использовать комбинацию фреймворков” - правда не понимаете? Rum не предлагает ничего для работы со стейтом, поэтому хочется подсмотреть где то решение как это делать
> чтобы сделать что-то похожее на om.next ну не в смысле сделать тоже самое, а хотя бы выбрать стратегию работы со стейтом, на том же уровне
> а в чем кажется "космичность"? Тяжело читать, намного тяжелее чем других open-source решения. Много на мой взгляд соглашений в коде - например тот формат описания :keys + :tempids
могу перефразировать вопрос, свой начальный вопрос: “кто что использует для работы с данными в комбинации с Rum или другой легкой оберткой над реактом"?
вообщем насоветуйте мне чего нибудь пожта, на этой неделе решающий батл за рефакторинг большого проекта js vs. cljs. Хочется подготовленным к нему подойти
вроде был аналог redux гдет, тоже по мне дак отличное решение для стейта
может быть ага.
reframe — это как раз клон redux и есть... где-там доклад-то: https://www.youtube.com/watch?v=aI0zVzzoK_E
я правда только слышал, не разбирался
и доклад этот тоже не очень понял, т.е. на практике не использовал
да, скорее всего. так что @rmuslimov вам скорее всего придётся самому писать 🙂
можно взять сам redux и написать враппер для него и потом продать жсникам. Как там в презентации - “Вы сразу не говорите что вы пишете на ClojureScript. Вы скажите что у вас JavaScript и специальная библиотека для него” 😄
>что-то по типу redux нужно редукс на cljs очень легко заимплементить самому с core.async + transducers. берешь канал с трансдюсером (он же (map reducer-fn)), на диспатч кладешь ивенты туда, а с другой стороны канала atom или ratom, если ты юзаешь реагент. грубо говоря. я тут расписал примерно в ридми + сделал экспериментальную имплементацию – https://github.com/konukhov/redux-cljs
@rmuslimov: можешь попробовать. у меня работает, будет ли работать для твоих целей – не знаю. не будет – пиши, будем улучшать 🙂
@rmuslimov, @konukhov, а раскажите, в чем прикол редукса в ? в js мне понятно - минус куча кода, а в
- такое ощущение, что кода только прибавилось, нет?
может я упускаю что-то, типа транзакции сохраненные в карманчике (для отправки на сервер), или типа того?
так в том же, что и для джс. у тебя менеджмент стейта изолирован, а экшны – чистые функции.
@a.espolov: на elm
у меня и так стейт изолирован в неймспейсе, а экшены - чистые функции, но без каналов и макросов этих всех.
@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)?ну тут, как я понимаю, смысл в том, что у тебя есть dispatch и имя экшна твоего + один event bus. ты диспатчишь ивент, а с другой стороны меняется стейт. ты не вызываешь функцию отдельную на каждое изменение стейта, а ты мапишь своим редюсером стрим ивентов. с точки зрения абстракции – просто другой подход.
типа, у тебя есть отдельный ns, так? в нем у тебя лежит db-atom какой-то и куча функций для апдейта, так?
единственное отличие, что я увидел - это (предполагаю) - ивенты в одном басе, строго последовательно. но в атоме ж это и так - так?
Сори что вклиниваюсь. Подскажите, для тестов - есть данные [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])), но найти не могуя реально вижу бонус только в том, что можно транзакции хранить и отправлять на сервер/хранить не результат, а последовательность ивентов, из которых стейт считать потом, как в кафке (в кафке же, да?)
@artemyarulin: тебе апплай нужен, который раскроет список?
@artemyarulin: или тебе собрать со всех результаты в список?
а в целом – redux – это просто другой подход и все (типа, state = map(reducer, endless-event-stream). я не говорю, что это лучше того, что ты написал, например.
@misha: А все, протупил, отмена, всем спасибо 🙂
продолжайте важный холивар
@konukhov: я к корасинку не цепляюсь даже. хочу увидеть, зачем вообще "такой" подход, если есть атомы и эд-воч. почему последних нехватает
кста коли вы тут про вотчеры - если у меня 100500 раз атом изменится, то вотчер отработает для всех изменений или там опимизация и debounce какой есть? Просто думал юазать его как очередь как-то...
@konukhov: допустим ты выбросил макросы и корасинк, что осталось? диспатч - индерекция модификаций стейта: вместо функций с аргументами - экшены. зачем? что-то еще кроме этого останется?
@artemyarulin: думаю, для всех, это твоя задача померджить все апдейты в одну функцию (в меньше функций) и в свап отдать
тут даже add-watch в таком случае не нужен. у тебя есть
(ns db)
(def my-state (atom 0))
(defn inc []
(swap! inc my-state))
типа {:initial 0, :events [:inc :inc :inc :inc :dec :dec :inc :inc :inc]}
вместо тупо 5
просто такая изоляция теоретически могла бы быть прикольнее для супер стейта - свалки всего на свете для аппликейшена
и фишка его именно в том, что у тебя нет доступа к нему напрямую – только через интерфейс в виде экшнов
но вот я пишу ios реакт-нейтивом, и оно тупо здыхает на самом маленьком сабскрайбе в :will-mount - анимации перелистывания вьюх дергаются, всё пропало
особенно, если у тебя в стеке больше 1 вью, и все подписаны на что-то меняющееся. а если на один и тот же убер-атом - ...
а если не вариант, то начинается плодёжь Store и редюсеров, и тд, и тогда еще более неочевидно, зачем оно надо
повторюсь, на ванильном js - я бы такое с радостью использовал наверное, потому что там гайки
у нас в домашней дискуссии было долгое обсуждение и позиция ребят с js, что подход redux позволяет разделить данные и представление таким образом что тесты писать очень удобно
@rmuslimov: в кложе/скрипте с этим же по-умолчанию всё ок, нет?
то это все таки не так красиво, как с редуксом когда надо тестировать каждый метод который изменяет стейт
курсоры - дохлый номер на мобилах (даже моб браузерах, не реакт нейтив), да и вообще, кмк
если все-таки приложение большое, я все-таки согласился с точкой зрения что большой стейт тяжело вот так вот руками перебирать
@rmuslimov: {:onClick #(swap! STATE f)}
вместо` {:onClick f}` (что так же коротко, как и {:onClick (dispatch store action)}
)
и тогда тестируй свои чистые f сколько влезет
@rmuslimov: на деле в том же редуксе тебе все равно руками придется перебирать, но не сам атом, а кучу экшнов и гигантский редюсер.
судя по нашему разговору, я понял, что если для мобилы – то вообще почти все медленно 🙂
напрямую на базу не подпишешься - ласты склеиваются моментально (на атом, впрочем, тоже )
типа в аргументы приходит атом, оно так не захлебывается на анимациях перелистывания вьюх
а с серваком там руками надо общаться? или нужно еще на сервер ставить datomic какой-то и тд?
но релевантная к топику часть: атомы с данными, свапы и чистые функции для изменения, без всяких редуксов
разве что, если ты редуксовые логи отправлять будешь, тогда да - заменять вызовы функций на ивенты - самое оно