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> 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.
> 
> To post to this group, send email to clojur...@googlegroups.com.
> 
> 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.

Attachment: foo.tgz
Description: GNU Unix tar archive

Reply via email to