You may have noticed the out
directory which contains all of the compiled
JavaScript. There’s about 6 1/2 megabytes worth of JavaScript in there. This may
seem unwieldy but fortunately the ClojureScript compiler generates output
optimized for the Google Closure Compiler. The Google Closure Compiler performs
many optimizations and the most significant for browser-based clients are
minification and dead code elimination.
Let’s remove the REPL modifications we made earlier from src/hello_world/core.cljs
:
(ns hello-world.core)
(println "Hello world!")
We can create a release build by setting the appropriate value for the
--optimizations
flag. The default optimization level is none
, but this time
we want to use all the optimizations provided by both ClojureScript and Google
Closure Compiler - this can be done by specifying advanced
. Other valid
options for --optimizations
are whitespace
and simple
but these are less
commonly used:
clj -M -m cljs.main --optimizations advanced -c hello-world.core
java -cp "cljs.jar;src" cljs.main --optimizations advanced -c hello-world.core
This process will take significantly longer which is why we don’t use
this compilation mode for development.
Examine out/main.js
, the file size should be around 90K. If you zip
this file you’ll see that it’s around 20K. This is significantly smaller
than a jQuery dependency yet when using ClojureScript you have implicit
dependencies on the entire ClojureScript standard library (10KLOC) and
the Google Closure Library (300KLOC). You can thank dead code
elimination.
You can test that this file still works by running the built in simple web
server via the --serve
flag:
clj -M -m cljs.main --serve
java -cp "cljs.jar;src" cljs.main --serve
This command does not start a REPL, so a browser window
will not be automatically opened. Navigate to http://localhost:9000 using your
favorite browser. Check the JavaScript Console, you should see Hello world!
printed. The builtin web server gzips JavaScript content. Check your browser’s
JavaScript Console Network tab and you should be able to confirm that the total
JavaScript payload is now around 20K.