Up and Running

Piggieback Setup

ClojureScript support relies on the piggieback nREPL middleware being present in your REPL session. There’s one exception to this, though: shadow-cljs. It has its own nREPL middleware and doesn’t rely on piggieback at all.

If cider-inject-dependencies-at-jack-in is enabled, which it is by default, then piggieback will be automatically added and configured for your project when doing cider-jack-in-cljs.

If cider-inject-dependencies-at-jack-in is disabled or you’re going to connect to an already running nREPL server using cider-connect-cljs, use the configuration in the following section.

Manual Piggieback Setup

To setup piggieback, add the following dependencies to your project (project.clj in a Leiningen based project or build.boot in a Boot project or deps.edn):

;; use whatever are the most recent versions here
[cider/piggieback "0.5.3"]
[org.clojure/clojure "1.11.1"]

as well as piggieback nREPL middleware:

in project.clj:

:repl-options {:nrepl-middleware [cider.piggieback/wrap-cljs-repl]}

or in build.boot:

(task-options!
  repl {:middleware '[cider.piggieback/wrap-cljs-repl]})

or in deps.edn:

{:aliases { :cider-cljs { :main-opts
  ["-m" "nrepl.cmdline" "--middleware"
   "[cider.nrepl/cider-middleware,cider.piggieback/wrap-cljs-repl]"]}}}

or in build.gradle:

dependencies {
  devImplementation 'nrepl:nrepl:0.9.0'
  devImplementation 'cider:cider-nrepl:0.47.0'
  devImplementation 'cider:cider-piggieback:0.5.3'
}

tasks.named('clojureRepl') {
  middleware = ['cider.nrepl/cider-middleware', 'cider.piggieback/wrap-cljs-repl']
}

Starting a ClojureScript REPL

Open a ClojureScript file in your project and type M-x cider-jack-in-cljs RET. With the correct configuration and after answering a few prompts this will start up the nREPL server and create a ClojureScript REPL buffer.

Prior to CIDER 0.18, cider-jack-in-cljs would create both a Clojure and a ClojureScript REPL. In CIDER 0.18+ if you want to create both REPLs you’ll have to use cider-jack-in-clj&cljs instead.

When you have a combination of Clojure and ClojureScript REPLs, CIDER will automatically direct all the usual CIDER commands to the appropriate REPL based on whether you’re currently visiting a .clj or .cljs file.

cider-jack-in-cljs will prompt you for the type of ClojureScript REPL you want to start. Keep in mind that some of the REPLs will require you to configure additional setup. For example, you’ll need to have Node.js installed to be able to start a Node REPL.

The only ClojureScript REPL type that doesn’t require any additional setup is the browser REPL. To use the Node.js REPL you’ll need to install Node.js.

CIDER will automatically try to check if the required dependencies (e.g. Clojure libraries and/or additional tools like Node.js) to start a certain ClojureScript REPL are present. If you happen to run into a faulty requirements check you can disable them like this:

(setq cider-check-cljs-repl-requirements nil)

Working with .cljc files

Ordinarily, CIDER dispatches code from clj files to Clojure REPLs and cljs files to ClojureScript REPLs. Butcljc files have two possible connection targets, both of which are valid. So, by default, CIDER tries to evaluate cljc files in all matching connection buffers, both clj and cljs, if present.

Thus, if you’re evaluating the code (+ 2 2) in a cljc file and you have both an active Clojure and ClojureScript REPL then the code is going to be evaluated twice, once in each of the REPLs. In fact, you can create multiple clj and cljs sibling connections (C-c C-x C-s C-s/j) within a CIDER session and evaluation will be directed into all REPLs simultaneously. See Managing Connections for more details.

If you would prefer to evaluate cljc files in only one of the matching REPLs, you can customize the variable cider-clojurec-eval-destination to either clj or cljs. For example, to evaluate cljc files in the ClojureScript REPL only, add the following to your Emacs configuration:

(setq cider-clojurec-eval-destination 'cljs)

Note: This variable can also be set on a per-buffer basis using setq-local, or project-wide in dir-locals.el.