Cljs dead code elimination for foreign libraries?

The long answer is unfortunately a year long or so. Don’t really have any pointers to give. I wrote about a bunch of stuff on my blog but thats mostly about shadow-cljs and why it does the stuff it does.

Overall I have no clue anymore what CLJS does with :foreign-libs or the Javascript Modules stuff in general so I can’t comment on that.

I did however port your example to shadow-cljs since I know exactly what that does.

To compare you can look at the build-reports

In short these are 3 separate builds. One using your minimal no-deps entry and 2 using js-joda. One variant just includes the “regular” npm package (similar to what you’d get from cljsjs) and one actually trying to run everything through :advanced compilation. As you can see it does make a difference but not as much as you’d probably expect.

Note that I didn’t actually try running the compiled code at all. So no clue if it even survived the :advanced compilation (most packages nowadays don’t).

Overall the Closure Compiler is fully capable of running strict ESM code through :advanced compilation with full DCE. However the js-joda.dist.esm.js is not strict ESM code. It is some kind of processed “mess” that basically just has export added at the end to “pretend to be ESM”. All “modern” language features (eg. class) were rewritten by babel. Those produce problems for the Closure Compiler and hinder DCE.

1 Like