0

Using clojurescript 1.10.758 and reagent 1.0.0, I am running into an error in which a file index.js tries to reference $jscomp, which is not defined.

I've seen a number of Stackoverflow and Github issues related to $jscomp being undefined in the context of shadow-cljs, but I'm not using that.

The problem occurs when I use a development mode build with figwheel (using Leiningen with cljsbuild and the figwheel plugin), and also occurs if I use cljsbuild for a once-only development build. Strangely, if I use webpack to create a bundle, the problem does not occur.

Before I tried to make webpack work, I did have working code without webpack. Something I changed seems to have affected the non-bundled build. The only change I can thing of was to install react and react-dom using npm, and exclude those packages from reagent in Leiningen's dependencies. But undoing the exclusion didn't make the non-bundled code work again.

Any suggestions for how to cause $jscomp to be defined when it's first needed?

Eric Schoen
  • 668
  • 9
  • 16

1 Answers1

2

$jscomp is related to the Closure Compiler and the Polyfills it creates.

It might be enough to tweak the :language-out :es6 compiler options which is somewhat similar to the :output-feature-set option used by shadow-cljs. The best way to debug this is finding the actual code that is getting polyfilled and why. Might require digging through some compiled JS though.

shadow-cljs uses the Closure Compiler more extensively than regular CLJS or figwheel but they also use it. Solutions that apply to shadow-cljs pretty much apply to other tools as well. Just the settings may work a little differently.

Thomas Heller
  • 3,842
  • 1
  • 9
  • 9
  • Thanks. That seems to have done it. I was looking for something like shadow-cljs' output-feature-set, and totally missed language-out because it was lumped with language-in and in the less common options group. – Eric Schoen Apr 20 '21 at 12:25