Boot task to automatically reload resources in the browser when files in the project change. Featuring lein-figwheel.
- Provides the
reload
task - Reload client can show warnings and exceptions from ClojureScript build on heads-up display.
- Requires
adzerk/boot-cljs
>=2.0.0
- Requires
Add dependency to build.boot
and require
the task:
(set-env! :dependencies '[[adzerk/boot-cljs "LATEST" :scope "test"]
[powerlaces/boot-figreload "LATEST" :scope "test"]
[pandeiro/boot-http "0.7.6" :scope "test"]
[adzerk/boot-cljs-repl "0.3.3" :scope "test"]
[com.cemerick/piggieback "0.2.1" :scope "test"]
[weasel "0.7.0" :scope "test"]
[org.clojure/tools.nrepl "0.2.12" :scope "test"]])
(require '[adzerk.boot-cljs :refer [cljs]]
'[adzerk.boot-cljs-repl :refer [cljs-repl]]
'[powerlaces.boot-figreload :refer [reload]]
'[pandeiro.boot-http :refer [serve]])
Add the task to your development pipeline before (cljs ...)
:
(deftask dev []
(comp (serve)
(watch)
(reload)
(cljs-repl)
(cljs :source-map true
:optimizations :none)))
Boot-figreload is compatible with Dirac, enabling REPL evaluation in-browser on top of Figwheel's reloading.
Your dev
task could therefore become:
(set-env! :dependencies '[[adzerk/boot-cljs "LATEST" :scope "test"]
[powerlaces/boot-figreload "LATEST" :scope "test"]
[pandeiro/boot-http "0.7.6" :scope "test"]
;; Dirac and cljs-devtoos
[binaryage/dirac "RELEASE" :scope "test"]
[binaryage/devtools "RELEASE" :scope "test"]
[powerlaces/boot-cljs-devtools "0.2.0" :scope "test"]
[adzerk/boot-cljs-repl "0.3.3" :scope "test"]
[com.cemerick/piggieback "0.2.1" :scope "test"]
[weasel "0.7.0" :scope "test"]
;; Has to be `0.2.13`
[org.clojure/tools.nrepl "0.2.13" :scope "test"]])
(require '[adzerk.boot-cljs :refer [cljs]]
'[adzerk.boot-cljs-repl :refer [cljs-repl]]
'[powerlaces.boot-figreload :refer [reload]]
'[powerlaces.boot-cljs-devtools :refer [dirac cljs-devtools]]
'[pandeiro.boot-http :refer [serve]])
...
(deftask dev [D with-dirac bool "Enable Dirac Devtools."]
(comp (serve)
(watch)
(cljs-devtools)
(reload)
(if-not with-dirac
(cljs-repl)
(dirac))
(cljs :source-map true
:optimizations :none
:compiler-options {:external-config
{:devtools/config {:features-to-install [:formatters :hints]
:fn-symbol "λ"
:print-config-overrides true}}})))
It should work out of the box. Two things to be aware of:
-
you need to have a
main.cljs.edn
like:{:compiler-options {:target :nodejs} :init-fns [server.core/main]}
-
you need to launch your built artifact using node:
$ cd target $ node main.js
Ok this is a super alpha of the figwheel client in boot-reload
.
At the moment the implemented server to client messages are:
-
:files-changed
-
:compile-warning
-
:compile-failed
-
:css-files-changed
Whereas the implemented client to server messages are:
-
"file-selected"
-
"callback"
- Inject the Figwheel bootstrap script
- Handle individual
js-onload
per build id (untested but there) - Figwheel version
- Use Figwheel init code (?)
- Handle
boot-reload
's:asset-host
in Figwheel (link to comments) - Pass the right
:open-file
option to Figwheel - Solve the "first message lost" problem with a message queue (?)
- Assert needed dependencies
- Repl integration (at the moment supported via boot-cljs-repl)
- Node client
- Web-worker client
- Trigger of multiple
js-onload
s
You can see the options available on the command line:
boot reload --help
or in the REPL:
boot.user=> (doc reload)
For an up-to-date demo project check figreload-demo.
Legacy examples of how to use reload
in development can be useful as well. See
Boot templates and example projects in the ClojureScript wiki.
Copyright © 2014 Adzerk
Copyright © 2015-2016 Juho Teperi
Copyright © 2017 Juho Teperi and Andrea Richiardi
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.