I should add that on both server and in browser your code base will usually be a lot smaller than most other languages, which greatly speeds workflow as well. As an example I once ported an Elm project to Clojurescript and it was a 4x reduction in lines.
Using Heroku to just git push the project works well too. Deploys in seconds.
If your project becomes more, it all scales well. Clojure is quite fast compared to Ruby or Python, and Heroku scales with the click of a button. You won’t have to port to a more performant language or host if you suddenly get popular.
There are some great choices for the server side too. Plus libraries for pretty much every DB. When something is missing, there's definitely a fallback option in Java.
Plus you get hot-reloading on both sides (e.g. boot-reload and ring-reload). And the ability to bundle everything into one neat jar file so the only dependency for deployment is Java.
Here's a getting started project that I found helpful: https://github.com/oakes/full-stack-boot-example
Because I've been interesting to get an excuse and try Clojure out and what you're saying is really interesting.
Clojurescript offered the first and still (in my opinion) best option for hot reloading via "figwheel" which nearly all Clojurescript developers use. It automatically updates the UI as you code it.
Clojure, on the server, being a proper lisp with a real REPL, lets you poke and inspect and reload parts of the running program with no recompile cycle. A typical workflow there is to reload individual expressions or functions in the context of the running program to alter behavior as you develop.
Can the REPL on the server be used to update production systems with no downtime?
For distributed computing across multiple machines, you are right that the actor model has an edge there. Most applications don't require that, however. There is however Onyx and other tools for this in Clojure:
I think the choice between Clojure and Elixir really comes down to how much your particular idea or requirement genuinely depends on the actor model. The vast majority of applications don't specifically require that, in which case you have more flexibility.
The vast majority of apps don't require distribution but I'd like to use a model of computation that would support it when needed so as to avoid large refactoring. And, preferably, allow for code reuse with systems that are distributed.
EDIT: Watching a talk about the internals of Onyx made by the creator. I gotta say, I'm liking it more and more.
(This is just one way to use Akka).
You might just have converted me to clojure, haha.
I think I'll start with a hobby-project and see how well it goes.
has that out of the box. As for an actor model implementation, there is pulsar:
Which has erlang-like actors, though some might suggest that core.async and its channel implementation provides everything you might need an actor for, YMMV.
My main interest with actors is that these can be made to support hot code reloading on the server side. They also tend to be easily composable. Also also, they can be optimized by locality (eg. same-node, same-cluster, different-cluster)
I'm biased though, having not worked with CSP or other models.
I'm curious to hear more about this. I'm someone who's used Elm at work, and on the side is interested in Lisp.
Elm could have been something, but I don’t expect it gain any mindshare, and the boat has sailed.
Clojurescript is a dynamic language, with easy JS interop and nearly zero boilerplate, so I still think it is the fastest route to a production app.