Stop using export. Use a console.log instead. Trust me DCE works.
On Wednesday, February 18, 2015, Edwin Park <edwin.p...@gmail.com> wrote: > Hmm. I do see that DCE behavior is the same with and without :modules, but > the fix in 0.0-2885 doesn't seem to do anything. > > For both clojurescript 0.0-2884 and 0.0-2885 I'm not seeing dead code > elimination in either the cljs_base.js (with :modules) or in the > consolidated foo.js (with :output-to "resources/assets/js/foo.js"). When > using :modules I wind up with a 4778 line cljs_base.js, and when using > :output-to I get a 4788 line foo.js. > > I have attached my test project for reference. > > Edwin > > > On Wednesday, February 18, 2015 at 11:13:24 AM UTC-5, David Nolen wrote: > > I just fixed the DCE regression for trivial programs in master: > https://github.com/clojure/clojurescript/commit/f1cb61a6a4985b2d3633fc2fb13d0c06f3718272 > > > > > > You'll see that :modules in no way whatsoever interferes with Google > Closure Compiler's DCE pass. > > > > > > David > > > > > > On Wed, Feb 18, 2015 at 9:47 AM, Edwin Park <edwin...@gmail.com > <javascript:;>> wrote: > > > I noticed that if I remove the module for com.foo.common, the code in > there gets included in cljs_base.js in the compiler temporary output, but > there is no dead code elimination performed there. This may be expected, it > just means that I need to declare all my code in modules if I want it > minified. > > > > > > > > > > > > > > > > > > > > This is not true. You do not need to declare all your code in modules. > It is the presence of ^:export that prevents DCE. > > > > > > > > I just want to clarify what I'm seeing. Here is the compiler config with > the com.foo.common module removed and the ':depends-on #{:common}' lines > removed: > > > > > > > > {:optimizations :advanced > > > > :output-dir "resources/assets/js/out" > > > > :modules { > > > > :landing > > > > {:output-to > "resources/assets/js/landing.js" > > > > :entries #{com.foo.landing} > > > > } > > > > :editor > > > > {:output-to > "resources/assets/js/editor.js" > > > > :entries #{com.foo.editor} > > > > }}} > > > > > > > > And here are my cljs files with ^:export on all the functions: > > > > > > > > src/cljs/com/foo/common.cljs: > > > > > > > > (ns com.foo.common) > > > > (defn ^:export blah [x] > > > > (str "[" x "]")) > > > > > > > > > > > > src/cljs/com/foo/landing.cljs: > > > > > > > > (ns com.foo.landing > > > > (:require [com.foo.common :refer (blah)])) > > > > (defn ^:export land [x] > > > > (str "landing:" (blah x))) > > > > > > > > > > > > src/cljs/com/foo/editor.cljs: > > > > > > > > (ns com.foo.editor > > > > (:require [com.foo.common :refer (blah)])) > > > > (defn ^:export edit [x] > > > > (str "editing:" (blah x))) > > > > > > > > > > > > When I compile, the landing and editor js files are generated: > > > > > > > > resources/assets/js/landing.js: > > > > > > > > da("com.foo.landing.land", function(a) { > > > > return[B("landing:"), B(ge(a))].join(""); > > > > }); > > > > > > > > > > > > resources/assets/js/editor.js: > > > > > > > > da("com.foo.editor.edit", function(a) { > > > > return[B("editing:"), B(ge(a))].join(""); > > > > }); > > > > > > > > > > > > There is also a resources/assets/js/out/cljs_base.js file generated in > the compiler temporary output with the code from com.foo.common appended at > the bottom of a lot of other stuff: > > > > > > > > ...4700+ lines... > > > > function ge(a) { > > > > return[B("["), B(a), B("]")].join(""); > > > > } > > > > da("com.foo.common.blah", ge); > > > > > > > > > > > > The issue is the 4700+ lines of unused preamble in the cljs_base.js. I > guess I was expecting the cljs-base file to simply contain the referenced > com.foo.common code and DCE to eliminate the rest of it so I'd have a > minimized file with just the code I need that I could load up into the > browser. > > > > > > > > > > > > > Also, about the explicit module dependencies declarations: it seems > like it should be possible to automatically generate these by analyzing the > namespace metadata. Is there a reason to force this to be explicitly > declared instead? > > > > > > > > > > > > > > > As far as I can tell both Thomas Heller & Google have come to the > conclusion that only explicit dependencies work reliably. I didn't bother > exploring alternatives since I didn't think I would do any better :) > > > > > > > > I'm curious about this. Thomas, can you comment on what the issues are? > I'm thinking if I scan all the namespaces listed in :entries and collect > all of their requires, I should be able to automatically generate the > :depends-on for all cljs dependencies. I can understand how arbitrary js/ > dependencies may need to be explicitly declared, but any cljs dependencies > should be knowable by inspecting the requires metadata on a given namespace. > > > > > > > > Thanks, > > > > Edwin > > > > > > > > > > > > -- > > > > Note that posts from new members are moderated - please be patient with > your first post. > > > > --- > > > > You received this message because you are subscribed to the Google > Groups "ClojureScript" group. > > > > To unsubscribe from this group and stop receiving emails from it, send > an email to clojurescrip...@googlegroups.com <javascript:;>. > > > > To post to this group, send email to clojur...@googlegroups.com > <javascript:;>. > > > > Visit this group at http://groups.google.com/group/clojurescript. > > -- > Note that posts from new members are moderated - please be patient with > your first post. > --- > You received this message because you are subscribed to the Google Groups > "ClojureScript" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojurescript+unsubscr...@googlegroups.com <javascript:;>. > To post to this group, send email to clojurescript@googlegroups.com > <javascript:;>. > Visit this group at http://groups.google.com/group/clojurescript. > -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojurescript+unsubscr...@googlegroups.com. To post to this group, send email to clojurescript@googlegroups.com. Visit this group at http://groups.google.com/group/clojurescript.