PHP is a terrible language in terms of design, but deploys are ridiculously easy, and refreshing a page is near instantaneous. There are plenty of other things to complain about with PHP, but part of its popularity is the relatively pleasant experience with the main tools.
Clojure deploys are pretty ridiculously easy - and refreshing pages on a Clojure based web stack is also instantaneous.
Seriously, Leiningen is great tooling. On pretty much every axis except startup speed I prefer it to everything else I've needed to use for work in other languages (Python, Ruby, and Node.js).
The main criticism I'd make, and this is something the boot (http://boot-clj.com) guys have mentioned (http://c2.com/cgi/wiki?CodeGenerationIsaDesignSmell), is that we are getting pretty dependent on code generation with lein templates, and they are getting increasingly larger and more complex just to handle our base scenarios (dev/prod builds, REPL, live reload). Maybe this is unavoidable, or not really an issue... I don't know.
I started using Django, as a relative newbie to python, back in 0.96, and it was a real pain in the ass to deploy. It took me a couple of days, minimum, all the while knowing I could have things halfway done in PHP.
Luckily I was given a stellar recommendation, and I stuck with it.
Django deploys now? Incredibly easy on the hosts I use (DO / Heroku). I expect Clojure to be the same in a year or so.
FWIW, I'm just starting to learn clojure. And just barely starting--these problems aren't annoying me yet.
I'd say it was there years ago. On Heroku you can deploy any Clojure project that specifies a ":main" namespace. Deploying Clojure to a VPN is no different to any other language that runs behind an nginx proxy.
Even so the point of the post is not to bash on Leiningen but to demonstrate how the overhead issues are not insurmountable - it just requires really knowing the tools (surprise) and which knobs to turn. In fact an implicit free idea for someone to explore is to automate all the optimizations for Leiningen that I covered.
As for cljsbuild, I'm guessing this is more a clojurescript compiler issue since again, I run leiningen once and leave it to recompile on file change in the background. Yes would be nice to have some compiler speed improvements but really it isn't that bad. I wait a second or two, not tens of seconds. At least, this is the case for me but then my cljs projects tend too be a couple of thousand lines at most.
There are JVMs with JIT caches and AOT compilers.
Even the reference JDK can start in a few ms using tiered compilation.
I just released a site based on Clojure + Clojurescript, with the front end written in Reagent, and it was a pretty good experience overall. The above was my main issue with the setup.
I've written more about the experience here (it seems there's not much interest in the site here, but at least the writeup should be interesting to those reading this post):
https://news.ycombinator.com/item?id=8791129
(Edit: it has since got a few upvotes, only to be killed by I guess the voting ring detection. C'est la vie.)
My overall impression was that ClojureScript was already 90% the way there, so you've done a damn fine job of maintaining and pushing the project forward. Thank you very much for that!
Besides being a prolific coder, he's a great writer with a knack for bridging the academic and the practical.
What's more, the Clojure community has a great number of similarly education-minded and highly talented and effective programmers.
Work is ongoing to improve the situation for Clojure 1.7, but apparently the slowness won't go fully away.
There as a post a few weeks ago on the mailing list about using ClojureScript instead, with compilation to Java bytecodes via Nashorn, before feeding the class files to Dalvik/ART.
All of this is just too hacky for me.
I would rather have a strong typed Clojure instead that wouldn't suffer from these pain points.
$ lein trampoline run -m clojure.main
Exception in thread "main" java.io.FileNotFoundException: Could not locate cljsbuild/compiler__init.class or cljsbuild/compiler.clj on classpath: , compiling:(.../target/66ddb53f4f237c7eb26e49c2637097e7cd8567d9-init.clj:1:4) ...
Everything else works fine.
Do we have a more complete example project that I can check mine against?
https://github.com/emezeske/lein-cljsbuild/issues/204
The suggestion seems to be "In the meantime: don't use trampoline, or chain the task explicitly, before the trampoline, e.g. lein do cljsbuild once, trampoline repl."
https://nicholaskariniemi.github.io/2014/02/11/jvm-slow-star...
And the other articles here: