What’s changed

  • code base has grown
  • speed has improved (even fast with leiningen)
    • analysis caching
    • avoiding analysis altogether
    • AOTed cljs.core (including analysis, source map)
    • AOTed compuled (eventally can get from Maven)


  • just need Java 8 (without lein or boot)
    • better for beinngers, fewer moving parts
    • better for the broader ecosystem


  • can include libraries that aren’t written in ClojureScript
  • escape from externs hell
    • allows the community to package useful foreigh libraries
  • CLJSJS now has 30+ popular packages


  • is official and works with every compiler
  • a port of clojure.test
    • works with :optimizations: none

Static Vars

  • a subset of Var abstract is available

macro usage

  • simpler now


  • it used to be easy to corrupt your build
  • child namespaces are recompiled now
  • works even for cold builds
  • for fans of figwheel: :recompile_dependents lets you disable it


  • code splits available (more powerful than what’s available for JavaScript)

conditional reading

  • official support for conditional reading by .cljc extension (works for ClojureCLR, Clojure, and ReplScript)
  • also works in REPLs


  • JDK 8 Nashorn REPL - almost as has as V8 & JavaScriptCore
  • node.js REPL
    • fastest option and reflective of browser JavaScript performance
  • all REPLs support stacktrace mapping via source maps


  • lets you write ClojureScript React apps to target web apps, iOS devices, and Android devices

What’s next for ClojureScript

  • API namespaces to hide the internals of ClojureScript
  • optional bootstrap (remove the dependency on Java)
  • ES2015
  • Externs inference (yes, compute your externs for you)