binaryage / binaryage/cljs-devtools

Is dead code elimination really working?

Open
#37 11 comments 0 reactions 0 assignees View on GitHub
cljs-bug help wanted
Dominant language
Clojure
Stars
1.1k
Forks
51
PR merge metrics
No merged PRs in 30d

Description

I can't seem to bring the code size down with a barely empty project through dead-code elimination alone, even when following the installation instructions to the letter.

The template used was [reagent-figwheel](https://github.com/gadfly361/reagent-figwheel) with only `devtools` and `reagent` as dependencies. I've fiddled with the `goog.DEBUG` flag, and then removed `devtools` from the `:require` and `:dependencies` vectors.

| Type | Size |
|--------------------------------------------------------|-------:|
| `:dependencies` + `:require` + `goog.DEBUG true` | 1.9 MB |
| `:dependencies` + `:require` + `goog.DEBUG false` | 1.5 MB |
| `:dependencies` + `:require` + no mention at all | 1.6 MB |
| `:dependencies` + no `:require` + no mention at all | 763 KB |
| no `:dependencies` + no `:require` + no mention at all | 763 KB |

The first two rows followed the instructions from the [release notes](https://github.com/binaryage/cljs-devtools/releases/tag/v0.5.3). There's a single mention of ` (devtools/install!)` within a `(when ^boolean js/goog.DEBUG ...)` block. The other three had this line removed manually.

Google Closure's shaved 400kb of the build, but that's still a 800kb increase for a `:require` without a single mention of `devtools`! Is this the best I can expect from dead code elimination?

Here's the code used for the builds (e.g. `lein new reagent-figwheel +devtools`):
```clojure
;##################
;### profile.cljs

(defproject devtools-dce "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.9.229"]
[reagent "0.6.0"]
[binaryage/devtools "0.8.2"]]

[...]

:cljsbuild
{:builds
[{:id "min"
:source-paths ["src/cljs"]
:compiler {:main devtools-dce.core
:optimizations :advanced
:output-to "resources/public/js/compiled/app.js"
:output-dir "resources/public/js/compiled/min"
:closure-defines {goog.DEBUG false}
:pseudo-names true ;; added to exacerbate size difference
:pretty-print false}}

]})

;##############
;## core.cljs

(ns devtools-dce.core
(:require
[reagent.core :as reagent]
[devtools.core :as devtools]
))

[...]

(defn dev-setup [] ;; inlining into `main` made no difference
(when ^boolean js/goog.DEBUG
(enable-console-print!)
(println "dev mode")
(devtools/install!)
))

(defn ^:export main []
(dev-setup)
(reload))
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the build configuration in profile.cljs and the namespace and dev-setup entry point in core.cljs, using the reagent-figwheel template and the listed advanced-optimization settings. Reproduce the five builds and compare their output sizes; done means explaining whether the unused devtools dependency is eliminated and documenting or correcting the observed result.

Written by the indexing model from the issue text.

Assessment

Tech stack
clojure
Domain
build-system
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.