Fork me on GitHub
#clojure-russia
<
2016-02-18
>
prepor01:02:08

Ребята, а кто-то сюда скидывал недавно ссылку на какой-то явовский хттп сервер весь на билдерах такой и типя няшый. Напомните? artemyarulin ?

prepor05:02:29

неа ) более высокий уровень, с роутингом и всем таким. и не ratpack и не spark )

artemyarulin07:02:51

я его случайно нашел вот в этом бенче (https://www.techempower.com/benchmarks/#section=data-r11&amp;hw=peak&amp;test=plaintext), аж на 50% быстрее нетти. Сам не пробовал

artemyarulin07:02:31

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

artemyarulin07:02:32

кстати народ - никто не использует code coverage тулзы для кложуры? я вроде видел пару проектов на эту тему, как оно там вообще?

fxposter08:02:50

On.get("/size").json("msg", msg -> msg.length());
выглядит как-то странно simple_smile

artemyarulin08:02:50

ну враппер то можно по быстрому написать на кложуре, чтоб было идеоматично simple_smile

asolovyov08:02:35

я тут себе сделал серверный рендеринг на кложурке

asolovyov08:02:51

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

asolovyov08:02:13

и тут недавно открываю стейджинг свой, а оно мне говорит "слишком много открытых файлов"

asolovyov08:02:17

на создании http-клиента

asolovyov08:02:21

прям как-то в сердце %)

asolovyov08:02:36

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

asolovyov08:02:01

(<!! (httpc/request (httpc/client) {:url url :method method :body data})) отакое делаю

asolovyov08:02:13

неужели надо ловить эти клиенты и уничтожать их? 😞

artemyarulin08:02:25

<!! это core.async?

artemyarulin08:02:57

ну канал может не закрывается

artemyarulin08:02:41

какоф профит то кста всего этого? Ну т.е. client-side rendering 3s, server-side 0.5s или как?

asolovyov08:02:19

client-side это реактом в браузере или реактом в ноде?

asolovyov08:02:33

бо теперь же 3 опции, реакт в браузере, реакт в ноде, и rum в jvm

artemyarulin08:02:39

эм, браузер наверно. Или там что решаешь?

asolovyov08:02:48

ну в браузере охеренный профит

asolovyov08:02:53

аж два профита

asolovyov08:02:01

главный профит - гугл индексировать сможет

asolovyov08:02:21

второстепенный профит - ты открываешь сайт и сразу видишь контент, и там еще за секунду-полторы реакт развешивает хендлеры и все дела

asolovyov08:02:46

а node vs jvm тоже ацкий, во-первых не надо менеджить пул нод, а только 1 процесс жабы

asolovyov08:02:59

во-вторых, оно где-то в 3-10 раз быстрее в зависимости от страницы

asolovyov08:02:17

слушайте, а в кложе есть способ быстро организовать пул каких-то ресурсов?

asolovyov08:02:31

чтоб не писать пару часов, а так типа, фигак-фигак, сделал? )

misha09:02:48

последний апачи коммонс пулл оборачивает

misha09:02:46

пацаны еще так делают http://stackoverflow.com/a/35058951/1128985

asolovyov09:02:55

@misha: та шось все такое старое

asolovyov09:02:10

взял это как inspiration и поверх корасинка делаю

misha09:02:11

(def pool (ref ['a 'b 'c]))

(defn take' [pool]
  (dosync
    (let [[h & t] @pool]
      (ref-set pool (vec t))
      h)))

(defn put [pool x]
  (dosync
    (alter pool conj x)
    nil))

asolovyov09:02:35

да, это уже найс, ща доделаю своё страшко и покажу, вдруг я зря развлекаюсь и надо просто этот ref взять :))

misha09:02:32

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

misha09:02:50

clj-poolman - на атоме harold

asolovyov09:02:10

на атоме таймаут геморно

misha09:02:59

offtop:

5 reasons to use MERN: 
One language, JavaScript everywhere.
kappa

asolovyov09:02:41

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

andre09:02:03

@asolovyov: а расскажи в двух словах идею, для тех кто не в курсе, интересно

asolovyov09:02:47

нужен пул ресурсов

asolovyov09:02:02

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

asolovyov09:02:12

потом я его возвращаю, если уже max-size вернули, то он мой закрывает

asolovyov09:02:22

какое-то кол-во этих ресурсов выходит как бы в кеше, всегда наготове

asolovyov09:02:29

создаются, получается, динамически

andre09:02:22

это понял. а интересно про я тут себе сделал серверный рендеринг на кложурке [11:48] и подменяю клиентский xhr нормальным запросом по хттп к серверу

misha09:02:19

@asolovyov: а у тебя оно "компилится"?

asolovyov09:02:02

уже да Ж-)

asolovyov09:02:09

сильно быстро запастил )

ul09:02:25

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

ul09:02:33

может быть у уважаемого сообщества будут идеи

ul09:02:58

биди в последенм хроме стал выдавать nil на правильные руты

ul09:02:03

при вызове path-for

ul09:02:33

но! если я делаю

(set! bidi/unmatch-pair
      (fn [v m]
        (when-let [r (bidi/unresolve-handler (second v) m)]
          (str (bidi/unmatch-pattern (first v) m) r))))

ul09:02:44

то всё магически чинится

ul09:02:20

функция, которой я переопределяю unmatch-pair — в точности такая же, как оригинальная

ul09:02:45

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

ul09:02:57

так нет же, всё там в порядке

ul09:02:13

ну и в других браузерах всё работает

ul09:02:42

добрый, чудесный, волшебный чатик, не найдётся ли у тебя пары идей, как такое может быть и куда копать?

fxposter09:02:25

@asolovyov: ты хочешь пулл для http-коннекшенов?

fxposter09:02:44

или для чего?

prepor09:02:00

@asolovyov: подозреваю, что оно не закрое коннект, до тех пор, пока ты не прочитаешь :body. Ты точно ВСЕГДА читаешь бади полностью?

asolovyov09:02:18

@prepor: только если не ошибка

fxposter09:02:22

тогда тебе не подойдет “generic” пулл simple_smile

prepor09:02:23

ну вот

prepor09:02:34

на ошибках у тебя и сжираются дескрипторы, не?

fxposter09:02:42

потому что в общем-случае tcp-коннекшены шарить нельзя

fxposter09:02:54

только при условии, что они на один IP

asolovyov09:02:56

@fxposter: ну у меня все запросы к 1 адресу

asolovyov09:02:02

но я клиент шарю

asolovyov09:02:04

не коннекшен

fxposter09:02:09

что нет никаких других людей которые юзают коннекшен simple_smile

fxposter09:02:21

что такое клиент?

asolovyov09:02:22

@prepor: там очень странно это все, я ща тут освобожусь децл и расскажу

fxposter09:02:26

у него разве стейт есть

asolovyov09:02:28

fxposter: джетти-клиент

prepor09:02:48

> и rum в jvm у меня жвм8 жс энжин рендерил реакт примерно в 10 раз медленнее v8. и это после разогрева. до разогрева в 100 раз медленнее. так что я поднял рядом процесс с нодой и рендерю через него )

prepor09:02:39

@misha: > (def pool (ref ['a 'b 'c])) тебе тут ref не нужен, достаточно атома. это в десятки раз быстрее

asolovyov09:02:58

@prepor: ты про nashorn?

asolovyov09:02:02

nashorn отстой

asolovyov09:02:06

я не юзаю его

prepor09:02:10

бля запутался

prepor09:02:16

какой там в жвм8? )

fxposter09:02:20

Cаша, а почему не взять один http клиент и все

asolovyov09:02:21

я вот это делаю

asolovyov09:02:28

@fxposter: не знаю! :-)))

asolovyov09:02:32

а можно? )

misha09:02:34

@prepor: это я кобы для того, чтобы одновременно двум чувакам одно и то же не раздать

asolovyov09:02:44

у меня много тредов одновременно его юзают

asolovyov09:02:54

блин, сори, занят децл, ща вернусь объясню

prepor09:02:55

@misha: я понимаю для чего это и говорю, что STM тут не нужен и вреден

prepor09:02:46

> https://github.com/tonsky/rum/tree/server что это, как работает, где почитать? )

misha09:02:24

@prepor: подробнее, пожалста (мопед не мой)

fxposter09:02:02

@asolovyov: If you are using httpclient 4.x, the connection manager is called ThreadSafeClientConnManager. See this link for further details (scroll down to "Pooling connection manager").

prepor09:02:08

@misha: stm нужен для координации нескольких рефов в одной транзакции. тут у тебя один реф, ничего ни с чем координировать не надо, все это можно выразить через атом

fxposter09:02:11

и юзай себе на здоровье

fxposter09:02:16

(похоже) simple_smile

prepor09:02:19

> https://github.com/tonsky/rum/tree/server вдуплил, хорошая идея, годная, да

prepor09:02:04

а я жс прям в жвм рендерил, получилось хреново. но у нас фронт на жсе и пишется.

misha09:02:48

а, да, точно, атом же синхронный

prepor09:02:08

@misha: ну и если в рамках добавления в пул у тебя есть какие-то сайд-эффекты (а ты ведь именно ради этого все делаешь, так ведь), то нужно все чуть сложнее

prepor09:02:24

что такое "синхронный" и что тогда "не синхронное"? )

misha09:02:10

ну агенты несинхронные, и там будет борода с клеймом/возвращением ресурсов в пулл

misha09:02:38

а рефы, действительно, использовать парами и больше есть смысл

prepor10:02:52

примерно вот так такое делать можно:

(def pool
  (atom {}))

(defn with-pool
  [f name]
  (if-let [res (@pool name)]
    @res
    (let [delay-f (delay (f))]
      (swap! pool assoc name delay-f)
      @delay-f)))

misha10:02:08

получается, что если одновременно 2 треда запросят ресурс из атом-треда – один из запросов выполнится сразу, а второй заретраится

fxposter10:02:34

> https://github.com/tonsky/rum/blob/server/src/rum/server_render.clj я правильно понимаю, что это кастомная реализация части того, что реакт делает на клиенте напрямую исполняемая в джаве?

prepor10:02:38

хотя бля, не, не так )

misha10:02:09

сложно как-то )

fxposter10:02:20

@prepor: твой пример не thread-safe simple_smile

asolovyov10:02:21

@fxposter: а откуда это?

asolovyov10:02:42

это я про httpclient

asolovyov10:02:45

про server-render - да

asolovyov10:02:48

правильно simple_smile

fxposter10:02:50

уже закрыл, где-то на stackoverflow

asolovyov10:02:01

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

asolovyov10:02:05

и у меня сча все приложение в .cljc

asolovyov10:02:21

@fxposter: wow, судя по тому ответу на SO, таки нужно просто глобальный клиент сделать и все?

prepor10:02:41

@misha: @fxposter вот так

(defn with-pool
  [f name]
  (if-let [res (@pool name)]
    @res
    (let [res (atom nil)]
      (swap! pool #(if-let [v (% name)]
                     (do (reset! res v)
                         %)
                     (do (let [f' (delay (f))]
                           (reset! res f')
                           (assoc % name f')))))
      @@res)))

fxposter10:02:42

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

prepor10:02:07

@fxposter: да знаю, вытащил код коллеги, и тут же баги нашел, хехе )

asolovyov10:02:07

устраивают, супер

asolovyov10:02:34

щит, зря такой прикольный пул написал

prepor10:02:43

@asolovyov: @fxposter если у тебя есть проблема с ликом дескрипторов, то пул коннектов тебе или заставит его разрастаться бесконечно или задедлочить или по таймауту закрывать будет ) завист от пула

asolovyov10:02:45

@prepor: я отвлекся к сожалению, мой пул сосет или не?

asolovyov10:02:57

@prepor: слушай, ну с бади там ваще дурацкая история

asolovyov10:02:59

попробую ща код найти

asolovyov10:02:09

мож мне надо jet сменить на что-то?:))

prepor10:02:17

@asolovyov: я пропустил, ты скидывал линк на свой пул? )

asolovyov10:02:33

@fxposter: блин, SO не про jetty9 :-)))

fxposter10:02:39

там это… кроме всего прочего не совсем понятно, что из себя представляет простой httpclient (сколько чего он хранит внутри и т.д.)

asolovyov10:02:51

@fxposter: да шось стремно, да

fxposter10:02:53

прости 😞

fxposter10:02:07

может не туда посмотрел simple_smile

fxposter10:02:51

в любом случае - если это вопрос не лика коннекшенов, а именно лика http-клиентов - можно просто в thread local положить клиенты и все

asolovyov10:02:10

ну мне ж не хочется выдумывать магическое число, когда их начнет хватать

fxposter10:02:11

будешь ликать только если у тебя регулярно создаются новые треды

asolovyov10:02:13

а, тьфу, тредлокал

asolovyov10:02:32

@prepor: https://github.com/mpenet/jet/blob/master/src/clj/qbits/jet/client/http.clj#L336 - body-ch закрывается, когда запрос закончился

asolovyov10:02:45

по идее, его gc должен собрать, даже если я его не юзал

prepor10:02:39

> async/put! юзают

prepor10:02:42

странное это все

prepor10:02:50

т.е. если ты отложил чтение бади на потом

prepor10:02:55

то оно просто проебет контент

prepor10:02:59

молча

asolovyov10:02:15

@prepor: почему это проебет?

asolovyov10:02:21

оно закинет в канал и закроет его

asolovyov10:02:33

можешь этот канал с собой таскать туда-сюда

prepor10:02:49

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

asolovyov10:02:09

почему это места не будет?

asolovyov10:02:18

no comprendo твой reasoning

prepor10:02:38

async/chan 1

prepor10:02:16

body-ch (async/chan 1

prepor10:02:23

буферед канад размером 1

prepor10:02:26

*канал

prepor10:02:41

один раз закинул, на второй уже места нет

prepor10:02:47

никакого backpressure

prepor10:02:11

с fold-chunked-response? true оно будет фолдить и в канал влазить

prepor10:02:33

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

prepor10:02:16

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

asolovyov10:02:38

@prepor: а туда только раз закидывается

asolovyov10:02:45

http-kit гамно внутри )

asolovyov10:02:51

меня раздражает :))

prepor10:02:59

это ты говно юзаешь

prepor10:02:00

(onContent [this response bytebuffer] (async/put! body-ch bytebuffer))

prepor10:02:08

закидывается на каждый чанк из сокета

prepor10:02:10

а не один раз

asolovyov10:02:12

хм, кстати да

asolovyov10:02:21

так это я говно юзаю потому что все говно

prepor10:02:41

@misha: вообще можно проще написать simple_smile

(def pool
  (atom {}))

(defn with-pool
  [f name]
  (->
   pool
   (swap! #(if (% name) %
               (assoc % name (delay (f)))))
   (get name)
   (deref)))

misha10:02:38

а почему (atom {}), а не (atom [])?

fxposter10:02:10

@prepor: а смысл в delay?

prepor10:02:28

@fxposter: что бы не выполнять f несколько раз

fxposter10:02:29

ты же все равно сразу же здесь сделаешь deref

fxposter10:02:39

да, норм

prepor10:02:15

@misha: ну у тебя другой интерфейс там предполагался, я его не особо осознал ) ну тут короче про то как нужно добавлять в атом вещи с сайдэффектами

misha10:02:00

а. так тот мопед не мой. если это исключительно иллюстрация атома вместо рефа - тогда всё понятно

misha10:02:41

кстати, а есть какие-то аргументы в пользу первого, а не второго (скобки вокруг функций одного аргумента в контексте threading макросов)?:

(-> [:a :b] (first))
(-> [:a :b] first)

ul10:02:53

никаких, курсив оставляет эту форму просто потому что не делает лишнего движения на проверку количества аргументов

misha10:02:42

что значит "оставляет"? и при чем тут курсив?

misha10:02:59

заметил, что @prepor написал (deref) там, где можно deref, и подумал, может не знаю чего. работать будет и так и так, но без лишней пары скобок - чище

prepor10:02:07

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

prepor10:02:15

но я как бы не форсю это ни разу )

misha10:02:00

кстати #(...) уже не работает, нужно (#(...))

prepor10:02:25

а, а тред макросах. ну да, конечно

ul11:02:08

курсив притом, что он делает как @prepor

ul11:02:20

была попытка угадать причину вопроса

misha12:02:17

@ul делает когда? за меня курсив что-то ничего не делает : )

larhat12:02:59

так ты что, сам что ли код пишешь?!

ul12:02:19

@misha когда ты ctrl-t нажимаешь

ul12:02:37

структурное редактирование курсива умеет threading/unthreading

misha12:02:15

а, ты об этом. ок

asolovyov14:02:12

кароче я напряг булки и убрал http из серверного рендеринга, оно теперь у меня собирает запрос и идёт исполняет ring-app напрямик; надо канеш потестировать, что все работает, но в теории все кул

asolovyov14:02:24

я стока электричества теперь сэкономлю, кошмар

asolovyov14:02:27

похвастался, теперь надо бы чтоб оно все-таки заработало везде...

dottedmag14:02:23

@asolovyov: BTW, гугель уже исполняет жабоскрипт-код для индексирования.

asolovyov14:02:38

@dottedmag: ток очень херово и наказывает тебя

asolovyov14:02:49

у меня SEO не основной источник бабла, но нормальный

dottedmag14:02:53

Шоа, наказывает все хипстер-стартапы?

asolovyov14:02:09

хипстер-стартапы, которым SEO важно, пишут всё на рельсах :))

dottedmag14:02:53

Это уже не хипстер-стартапы, это уже старпёр-энтерпрайз. Хипстер-стартапы все на ангуляре 2.

asolovyov14:02:38

это те, которым SEO не нужно

prepor15:02:30

ну лично для нас серверсайд рендеринг это скорость рендеринга прежде всего

prepor15:02:05

бросил страничку быстренько и чувака уже все показывается. без подгрузок реакта и его инициализации

prepor15:02:22

ну вот у них вообще алтимат штука

prepor15:02:10

рендеринг напрямую реакт-компонентов в хтмл без создания реакт-компонентов это очень хорошо )

dottedmag16:02:21

@asolovyov: А это у тебя на $dailyjob или что-то побочное?

dottedmag16:02:45

@asolovyov: конкретно эта рендерилка

fxposter16:02:48

@dottedmag: я думаю это основная работа у него simple_smile

fxposter16:02:11

о, народ. есть вопрос.

fxposter16:02:25

есть ring reload, есть component (с его релоадами в шелле и clojure.tools.namespace). в посте стюарта написано что они не работают вместе, потому что разные версии clojure.tools.namespace и т.д.

fxposter16:02:53

но это было больше 2х лет назад

fxposter16:02:14

сейчас у них вроде clojure.tools.namespace 0.2.x у обоих

fxposter16:02:32

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

fxposter16:02:58

кто-то в курсе - есть ли какие-то более новые посты об этой связке?

asolovyov16:02:46

@prepor: yes, прям дико прет меня, когда все заработает клево, напишу пост, чтоб все так делали )

larhat16:02:07

А igrigorik не писал ещё про такое?

asolovyov16:02:28

если писал, то я не видел

asolovyov16:02:33

ваще это arohner придумал

asolovyov16:02:36

на clojure/conj рассказал

asolovyov16:02:58

но он foam как-то подзабросил

asolovyov16:02:24

жду ваще с нетерпением react 0.15

niquola16:02:19

Дима такое на reagent делал, тоже руки чешутся попробовать.

asolovyov16:02:07

но у него там немного игровой пост

asolovyov16:02:11

"мы сделали, усё"

asolovyov16:02:22

там proof-of-concept такого же левела, как foam

asolovyov16:02:35

только с полурабочим генератором reactid

asolovyov16:02:03

вот я реакт 0.15 жду именно потому, что в нем обещают убрать reactid, а его генерация это немного черная магия

asolovyov16:02:18

я в 95% случаев угадываю, но у меня есть место, которое я не понимаю, как исправить simple_smile

prepor17:02:42

вообще как будето реакт то не нужен, нужен просто виртуальный дом, не?

prepor17:02:51

а не эти компоненты

prepor17:02:06

а сверху виртуального дома уже построить функции какие хочется

prepor17:02:18

rum не обсуждалось без реакта сделать?

potapenko18:02:02

> ну лично для нас серверсайд рендеринг это скорость рендеринга прежде всего а почему? Гугл индексирует ведь не часто?

potapenko18:02:10

Я для Angular на node.js поднимал phantom.js который отдавал статических HTML. На ректе как я понимаю тот же принцип? Определить что пришел гугл и переправить его на статику. Плюс внутри приложения сделать роутер…. Чтобы все данные брать из урла.

dottedmag18:02:11

@potapenko: Потому что каждая 0.1s рендеринга на клиенте -- это уходящие клиенты.

dottedmag18:02:40

@prepor: Нет же ещё настоящего кложурного виртуального дома, только js-библиотеки.

dottedmag18:02:00

@prepor: Кстати, для пререндеринга как раз virtual dom не нужен, а нужно компоненты порендерить.

fxposter18:02:00

так не нужен виртуальный DOM-то simple_smile

fxposter18:02:06

не нужны коллбеки

fxposter18:02:14

не нужны всякие хендлеры

fxposter18:02:44

из минусов - получится, что есть 2 разные имплементации этого всего

potapenko18:02:47

чет нифига не понял, серверный рендеринг отменяет рендеринг дом на клиенте?

potapenko18:02:08

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

dottedmag18:02:16

@potapenko: Если серверный рендеринг есть, то страница грузится уже готовая, и клиент не ждёт, пока реакт прососёт первый дом через себя и нарисует.

dottedmag18:02:54

Статический дом тянуть не дольше -- нынешний интернет достаточно high-latency, но при этом совсем не bandwith-constrained на объёмах, которые нужны для HTML.

dottedmag18:02:02

@potapenko: 2016 на дворе, оптимизация производительности (~= customer retention) -- это оптимизация latency.

potapenko18:02:39

но в любом случае придется опять рендерить на клиенте? и заменить статику на динамику?

dottedmag18:02:49

Нет. Идея в том, что реакт видит, что уже отрендерено и говорит "ок, всё в порядке, когда будет эвент -- будем перерисовывать".

potapenko18:02:15

ну разумно, да

potapenko18:02:57

но глупость и мода.

potapenko18:02:10

а я так, бурчу.

dottedmag18:02:21

Latency никак не улучшить, господин Эйншейн лазеек не оставил.

fxposter18:02:33

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

potapenko18:02:35

я таких умных слов не знаю

dottedmag18:02:41

Только CDN'ом.

fxposter18:02:49

движки этих темплейтов могут быть разные

fxposter18:02:59

в случае с реактом и js-ом - движок один

fxposter18:02:11

но как показывает Саша - это не обязателньо

dottedmag18:02:16

@fxposter: Да, это пичаль. Про это выше Пиранья и пишет -- у него в 5% ID'ы не совпадают.

fxposter18:02:23

да пофиг

fxposter18:02:26

html есть

fxposter18:02:35

ну заменит реакт потом часть

fxposter18:02:39

визуально будет все то же самое

dottedmag18:02:42

Ну, не пофиг. Если реакт возбуждается от этого, то будет чего-то опять дёргать.

dottedmag18:02:01

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

artemyarulin18:02:55

а можно узнать о чем идет речь в цифрах? Т.е. клиентский рендеринг на реакте занимает первый раз ТАК долго что это заметно?

fxposter18:02:23

вот открываешь ты новомодное приложение

fxposter18:02:31

а оно тебе дает пустую страницу

fxposter18:02:37

а потом наконец-то загружается

fxposter18:02:54

в случае получше - дефолтный спиннер

potapenko18:02:55

вижу смысл только для мобилок, где слабый процессор, и действительно хорошо бы его поберечь. Батарейку Особенно если учесть что человек зашел на 2 секунды. . В остальных случаях вряд ли будет выгода. Лучше библиотеки тащить с CDN и все. Куда полезнее будет.

dottedmag18:02:01

@artemyarulin: Проблема в том, что рендеринг на клиенте начинается после того, как все статические asset'ы подгружены, а рисование HTML-страницы этим не блокируется.

petr.myain18:02:22

в 5% ID'ы не совпадают.

dottedmag18:02:39

Библиотеки с CDN (если это HTTP/1.1) тащить нужно обязательно, про это даже никто не говорит.

petr.myain18:02:43

в ract 0.15 уже не будет никаких id у элеметов, ждём!

artemyarulin18:02:08

ну рендеринг и статичные ассеты не обойти никоим образом в любом случае

dottedmag18:02:18

Браузеры параллелят.

dottedmag18:02:24

А JS не отпараллелить.

artemyarulin18:02:44

ааа, я понял - на сервере же данные еще небось фетчатся сразу, т.е. не надо отдавать HTML и потом запускать еще 10500 ajax запросов, так?

dottedmag18:02:10

Не только, но и это тоже в большой степени.

artemyarulin18:02:41

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

potapenko18:02:48

На само деле все тут чистый маркетинг, сделал Angular 2 серверный рендеринг (думали, думала и наконец придумали как реакт уязвить гугловские маркетологи), вот реактеры и стали подтягиваться. А медленная загрузка SPA - это дело опять же прямых рук. Макркетинг.

dottedmag18:02:49

@artemyarulin: Вот тут хорошо про всякое рассказано: http://chimera.labs.oreilly.com/books/1230000000545

artemyarulin18:02:25

@dottedmag: ага, читал давненько - перечитать надо

artemyarulin18:02:56

@potapenko: А в ангуляре2 сервер рендеринг прям из коробки? А как? тока с нодой небось или фантом и прочее тащить надо?

dottedmag18:02:02

Там как раз глава 10 про то, как HTML/CSS/JS между собой взаимодействуют и блокируют друг друга.

potapenko18:02:40

@artemyarulin: ага, я так понял. они это как однв из главных фич рекламировали сразу.

dottedmag19:02:09

У реакта давно пререндеринг есть.

dottedmag19:02:16

Но он как-то кратенько описан.

artemyarulin19:02:29

ну как я понимаю эта проблема встает далеко не сразу - на хелло ворлдах и бложиках разница будет незаметна

artemyarulin19:02:59

я имею ввиду эти оптимизации

dottedmag19:02:13

Ессно. Она встаёт у гугла и пейсбука :)

artemyarulin19:02:23

простите, не знал что тут чуваки оттуда сидят 😛

dottedmag19:02:42

Ну, вот у Пираньи тоже встала.

artemyarulin19:02:39

оо, чота подумалось что всякие ом-нексты и прочие фреймворки (да даже реактовский редукс) с одним глобальным стейтом - можно же прям на сервере все данные для пользователя вытащить и замержить прям в html

artemyarulin19:02:22

и можно это делать хоть жсон, хоть edn, чо есть на беке вобщем. И не нужен секес с фантомами и фреймворк агностик по идее, ненужны костыли для реакта

dottedmag19:02:47

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

dottedmag19:02:58

Подмножество выковырять можно, да.

artemyarulin19:02:58

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

potapenko19:02:10

ну в этом смысле да, хорошо, чем легче сделать тем меньше нареканий тех же SEO-шников к SPA. Вот только не могу понять почему самому же гуглу не индексировать SPA, поддержать так сказать прогресс...

dottedmag19:02:14

@artemyarulin: Хороший тост: за то, чтобы дорасти до оптимизиации round-trip'ов :)

asolovyov19:02:20

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

asolovyov19:02:28

я сча захожу на страницу и вижу акции сразу

asolovyov19:02:45

а с реактом захожу и вижу спиннер может 300, может 500 мс

asolovyov19:02:49

но это со своего ноута

asolovyov19:02:57

а когда с компа в колл-центре, файрфоксом - так 3 секунды

asolovyov19:02:21

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

asolovyov19:02:34

короче это экстраинтересная тема, а уж про мобилы (особенно андроиды) и речи нет

asolovyov19:02:55

ну и да, я экономлю на запросе initial-данных нормально

asolovyov19:02:17

и, бтв, на бложиках тоже заметно

dottedmag19:02:49

А почему :parrot: и :upside_down_parrot: с разной скоростью крутятся?

andre19:02:06

parrot на сервере рендерится upside_down_parrot на клиенте

potapenko19:02:37

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

dottedmag19:02:25

Пардон, не туда.

fxposter19:02:04

upside_down_parrot не использует requestAnimationFrame, и поэтому лагает

andre20:02:00

просто гифка криво склеена , http://ezgif.com/split/148de2fb44.gif

andre20:02:52

две разных гифки simple_smile

artemyarulin20:02:32

>а с реактом захожу и вижу спиннер может 300, может 500 мс @asolovyov: ну вот, т.е. проблема то не в рендеринге реакта - проблем в том что за данными надо еще раз сходить на сервак. Т.е. можно былоб заэмбедить данные в index.html и добиться того же не трогая реакт вовсе Другое дело что чтоб заэмбедить их не так просто может быть да, может проще и весь реакт прогнать на серваке

asolovyov20:02:19

@artemyarulin: проблема во всем подряд

asolovyov20:02:31

чем медленнее комп, тем больше в рендеринге реакта

asolovyov20:02:14

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

asolovyov20:02:23

я на сервере юзерские данные не фетчу

asolovyov20:02:32

и это не мгновенно энивей

artemyarulin20:02:39

прям вот именно рендеринг сам? без HTTP запросов? У тебя большое приложение?

artemyarulin20:02:51

дада, я понимаю что не мгновенно ессно

asolovyov20:02:31

ну нормальное

asolovyov20:02:33

я попробую померять

artemyarulin20:02:46

ага, если не сложно, интересно очень

artemyarulin20:02:35

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

misha20:02:52

@asolovyov: ну что там? меряешь?

asolovyov20:02:58

не, расслабляюсь, никаких сил колупать код нет сегодня уже %)

Kira Sotnikov21:02:49

bhavenger: welcome