Skip to content

boot-clj/boot-figreload

Repository files navigation

boot-figreload

Clojars Project

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

Usage

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)))

Dirac

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}}})))

Node.js

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

Figwheel Integration Status

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"

Other tasks to complete:

  • 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)

To be thorougly tested:

  • Node client
  • Web-worker client
  • Trigger of multiple js-onloads

Additional Info

You can see the options available on the command line:

boot reload --help

or in the REPL:

boot.user=> (doc reload)

Examples

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.

License

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.