Electric Y Combinator – Electric Clojure
dustingetz.electricfiddle.net
dustingetz.electricfiddle.net
One question: what are the front end options with Electric? E.g. can I use electric together with some front end framework (React/jQuery/anything)? Or should I stick to writing front end components using electric?
[1] https://electric-examples-app.fly.dev/user.demo-reagent-inte...
we use tailwind in IRL projects
From what I understand, this allows people to arbitrarily decide which portions of their DOM get's run in the client or in the server? Essentially allowing us to make SSR pages with client side code sprinkled in, wherever we want. If so, this seems like a really big deal for Clojure world.
It's been worked on for several years AFAICT. It's only very recently that it got a public release, but it was built specifically for use in Hyperfiddle, the company of Dustin Getz (also the same person who developed Electric Clojure).
I am not sure what is a good way to determine whether something is production ready, but I know its developers have been dogfooding it for a while now. The only real problem I see is lack of other companies adopting it leading to nobody else wanting to try adopting it. The other big problem is that it's hard selling people Clojure either because it is a niche language or the parentheses scares people away.*
* Note I use Clojure in my day job. I do not think either of these two points are a valid excuse to not use Clojure, but they are the most common excuses I see.
the thing predating Electric is in prod at a series B startup, a series A startup is going live with a prod support app in a few weeks, and a seed stage startup is planning a rewrite of a consumer facing productivity tool onto electric after serious evaluation. Plus many serious POCs i’ve seen maybe 2-3 dozen repos this summer. (we only see them when they have a question)
- Is this a lot of bandwidth when done over websockets? I was looking at the starter todo list on your github and everytime I type something a character into the todo list, I have what looks like 3kb of messages in the websocket passed.
- Is there anyway to get this working with multiple nodes? It seems like the way to use it is to bind it to a dynamic var that's only available in the library (`hyperfiddle.electric-dom2/node`)
wire protocol is in verbose mode, we have a binary mode as well. it’s also not optimized at all because users already report tangible performance as “incredible” “unbelievable” as compared to the status quo graphql or http RPC or whatever. remember, http transport pays a TCP round trip just to syn/ack the connection before any app payload is sent! Electric wire traffic is also differential, i.e. collections are never sent twice only what changed.
It sounds like you're saying Websockets have an advantage as an open connection. It's great that everything is differential, but I'm wondering what exactly is being sent when I type into a `dom/input`? If I write 1000 characters, that's 3mb downloaded. That seems like a lot for typing into an input. What is being diffed here if none of this state is going to anyone but me?
I'm sure it's early days in terms of documenting this for the layman, but I hope some day there's a guide that's easy to digest so I know how I could use it myself.
The traffic here is "program debug state" — the electric callback was called on the client, so the client informs the server of this in case the callback has server regions. As you rightfully point out, there are in fact no server regions in that callback — and this is known at compile time — so there is no need to actually send that information, it is pure overhead.
The missing optimization is basically dead code elimination – we simply haven't gotten to it yet.
Note that the traffic is broadcast, not request/response, which means the user experiences no latency as the client is not awaiting any response from the server, it is simply keeping the server informed. Due to this, broadcasting "program debug state" like this is basically free, which is why we consider this optimization premature. We are much more interested in visible perf issues (how fast it "feels").
FWIW we are unhappy with dom/on (used in that tutorial) and it is about to be superseded, and the chattiness you observed is derived from one of the aspects of the design that we are fixing (there should not be a callback at all, the input should return its reactive state directly.) But to be clear the pattern is perfectly functional, it doesn't have bugs, and users are succeeding with it.
Don’t get me wrong, I don’t claim anything general with this, of course WebSockets have their uses and I’m sure Electric Clojure uses them more responsibly, it really is more of a question on what do you think of it. Elixir also has WebSocket solutions, so it seems to be a more common solution nowadays.
discord uses websockets, here are some more links: https://www.reddit.com/r/elixir/comments/pophiz/server_specs...
we'll have seamless reconnect soon, which means the ws connections can actually drop when inactive (no heartbeats!) and then reconnect when the client wants something, so the forum use case should be quite fine. Not everything needs to be realtime server push, so refactor your code so that queries run on page nav or something. Electric is network transparent but that doesn't mean the network is opaque, the reactivity graph is in userland control (as declared by your AST) and the network data flow is implied by that same AST, same reactivity graph!