lein cljsbuild gives "Could not write JavaScript nil" error

293 Views Asked by At

Every time I try to run lein cljsbuild once I get an error:

Could not write JavaScript nil

Any thoughts or ideas would be appreciated as I have been stuck on this for a while and unfortunately cannot go any further.

Here is what I have been doing.

  1. Create a new project called finance by runnin lein new app finance
  2. Update the project.clj file with dependencies, cljsbuild, plugin and main spec(see below)
  3. Run lein deps and this works.
  4. Run lein run and that also works, spitting out 'Hello World' in the console.
  5. Try to run lein cljsbuild once and then I get this error that Could not write JavaScript nil

    (defproject finance "0.1.0-SNAPSHOT"
            :description "FIXME: write description"
            :plugins [[lein-cljsbuild "1.1.7"]]
            :url "http://example.com/FIXME"
            :license {:name "Eclipse Public License"
                      :url "http://www.eclipse.org/legal/epl-v10.html"}
            :dependencies [[org.clojure/clojure "1.8.0"]
                           [org.clojure/clojurescript "1.10.238"]
                           [reagent "0.8.0-alpha2"]]
            :main ^:skip-aot finance.core
            :target-path "target/%s"
            :profiles {:uberjar {:aot :all}}
            :cljsbuild {
                :builds [{
                    :source-paths ["src"]
                    :compiler {
                        :output-to "resources/public/javascripts/dev.js"
                        :output-dir "resources/public/javascripts/cljs-dev"
                        :optimizations :none
                        :pretty-print true}}]})
    
1

There are 1 best solutions below

1
On BEST ANSWER

Start over in a new directory. Your error was using app instead of figwheel in creating the project:

> lein new figwheel fred
> cd fred
> lein cljsbuild once      ; => works fine
> lein figwheel            ; => starts interactive browser repl

Normally you would just use figwheel, but cljsbuild once also works.

Your project.clj now looks like the following. Note in particular the :plugins section you were missing:

(defproject fred "0.1.0-SNAPSHOT"
  :min-lein-version "2.7.1"
  :dependencies [[org.clojure/clojure "1.9.0"]
                 [org.clojure/clojurescript "1.9.946"]
                 [org.clojure/core.async  "0.4.474"]]

  :plugins [[lein-figwheel "0.5.15"]
            [lein-cljsbuild "1.1.7" :exclusions [[org.clojure/clojure]]]]

  :source-paths ["src"]
  :cljsbuild {:builds
              [{:id "dev"
                :source-paths ["src"] 
                ;; The presence of a :figwheel configuration here will cause figwheel to inject the
                ;; figwheel client into your build
                :figwheel {:on-jsload "fred.core/on-js-reload"
                           ;; :open-urls will pop open your application in the default browser once
                           ;; Figwheel has started and compiled your application.  Comment this out
                           ;; once it no longer serves you.
                           :open-urls ["http://localhost:3449/index.html"]}

                :compiler {:main fred.core
                           :asset-path "js/compiled/out"
                           :output-to  "resources/public/js/compiled/fred.js"
                           :output-dir "resources/public/js/compiled/out"
                           :source-map-timestamp true
                           ;; To console.log CLJS data-structures make sure you enable devtools in Chrome
                           ;; https://github.com/binaryage/cljs-devtools
                           :preloads [devtools.preload]}}
               ;; This next build is a compressed minified build for production. You can build this
               ;; with: lein cljsbuild once min
               {:id "min"
                :source-paths ["src"]
                :compiler {:output-to "resources/public/js/compiled/fred.js"
                           :main fred.core
                           :optimizations :advanced
                           :pretty-print false}}]}

  :profiles {:dev {:dependencies [[binaryage/devtools "0.9.9"]
                                  [figwheel-sidecar "0.5.15"]
                                  [com.cemerick/piggieback "0.2.2"]]
                   ;; need to add dev source path here to get user.clj loaded
                   :source-paths ["src" "dev"]
                   ;; for CIDER
                   ;; :plugins [[cider/cider-nrepl "0.12.0"]]
                   :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}
                   ;; need to add the compliled assets to the :clean-targets
                   :clean-targets ^{:protect false} ["resources/public/js/compiled"
                                                     :target-path]}})