rationale | usage | deployment | getting help
Tenzing is a Clojurescript template offering the following features:
In contrast to some of the options out there it is opinionated in the following ways:
In contrast to Leiningen Boot offers a clear strategy when it comes to composing multi-step build processes such as compiling stylesheets and Javascript whenever a relevant file changes.
Many Leinigen plugins come with an `auto` task that allows similar behavior. If you want to run multiple of those tasks it's usually done by starting multiple JVM instances which can lead to high memory usage. Boot allows this sort of behaviour to reside in one JVM process while making sure that build steps don't interfere with each other.
You can learn more about Boot in a blog post by one of the authors, its github project or a blog post I wrote about it. Mimmo Costanza's modern-cljs tutorial also uses Boot throughout - Tutorial 2 walks through the setup of a typical Boot-based development environment.
Tenzing is designed with prototyping in mind. Instead of writing your own backend you're encouraged to use services like Firebase, Usergrid and others.
If you figure out that you need a Clojure based backend down the road it's simple to either add it yourself or create it as a standalone service that's being used by your clients.
Please, also consider offline first as an approach for building early iterations of your application.
If you're wondering how files are served during development: there is a boot task `serve` that allows you to serve static files.
To create a new project, install boot and run:
$ boot -d boot/new new -t tenzing -n your-app
Template options are specified using the -a
switch. For example:
$ boot -d boot/new new -t tenzing -n your-app -a +reagent -a +test
Alternatively, if you have leiningen installed, you can run
$ lein new tenzing your-app
or to specify options:
$ lein new tenzing your-app +reagent +test
There are a bunch of options that determine what your newly created project will contain:
+om
provides a basic Om
application and adds relevant dependencies+reagent
provides a basic
Reagent application
and adds relevant dependencies+rum
provides a basic
Rum application
and adds relevant dependencies+garden
sets up Garden and
integrates into the build process+sass
sets up Sass and integrates into
the build process (requires libsass)+less
sets up Less and integrates into
the build process.+test
adds a
cljs test-runner
and adds a test
task.+devtools
adds a
cljs-devtools through
boot-cljs-devtools+dirac
adds a
dirac through
boot-cljs-devtools.If you want to add an option, pull-requests are welcome.
After you installed Boot you can run your Clojurescript application in "development mode" by executing the following:
$ boot dev
After a moment of waiting you can head to
localhost:3000 to see a small sample app. If
you now go and edit one of the Clojurescript source files or a SASS
file (if you've used the +sass
option) this change will be picked up
by Boot and the respective source file will get compiled. When a
compiled file changes through that mechanism it will get pushed to the
browser.
If you used the +test
option, then you'll be able to run unit
tests via boot test
. Use boot auto-test
to have tests
automatically rerun on file changes.
After you started your application with boot dev
there will be a
line printed like the following:
nREPL server started on port 63518 on host 0.0.0.0
This means there now is an nREPL server that you can connect to. You
can do this with your favorite editor or just by running boot repl --client
in the same directory.
Once you are connected you can get into a Clojurescript REPL by
running (start-repl)
. At this point I usually reload my browser one
last time to make sure the REPL connection is properly setup.
Now you can run things like (.log js/console "test")
, which should
print "test" in the console of your browser.
If you look at the build
and run
tasks in the build.boot
file of
your newly created project you will see something like the following:
(deftask build [] (comp (speak) (cljs) (sass :output-dir "css")))
(deftask run [] (comp (serve) (watch) (cljs-repl) (reload)
(build)))
Basically this composes all kinds of build steps into a unified run
task that will start our application. From top to bottom:
The build
task consists of three other tasks:
speak
gives us audible notifications about our build processcljs
will compile Clojurescript source files to Javascriptsass
will compile Sass source files to CSSNow if we just run boot build
instead of the aforementioned boot dev
we will compile our Clojurescript and Sass exactly once and then
the program will terminate.
This is where the run
task comes in:
serve
starts a webserver that will serve our compiled JS, CSS
and anything else that is in resources/
watch
will watch our filesystem for changes and trigger new
builds when they occurcljs-repl
sets up various things so we can connect to our
application through a browser REPLreload
will watch the compiled files for changes and push them
to the browserbuild
does the things already described above**Please note that all tasks, except the one we defined ourselves have extensive documentation that you can view by running `boot