我有一个ClojureScript项目,它有以下barebone前端应用程序(main是入口点):
(ns shadowman.app
(:require
;; [cljs-http.client :as http]
;; [reagent.core :as r]
))
(defn main
""
[]
(js/console.log "hi from browser"))这将编译为预期的95,2 kB。一旦我取消注释[cljs-http.client :as http],总数将跃升到299,7 kB;包括reagent,将其进一步提高到457,4 kB。由于我没有从这些名称空间调用任何函数,所以Google闭包编译器不应该将它们作为死代码来消除吗?
我的影子cljs.edn的相关部分如下:(仅省略其他三个构建,我可能会提到,它们确实使用了注释掉的库):
{:source-paths [;; "env/prod"
"src/server" "test" "src/browser" "src/common" "src/plibs" "target/classes"]
:dependencies [[reagent "0.9.1"]
[bidi "2.1.6"]
[com.taoensso/timbre "4.10.0"]
;; [org.clojure/clojurescript "1.10.520"]
[macchiato/hiccups "0.4.1"]
[macchiato/core "0.2.16"]
[macchiato/env "0.0.6"]
[mount "0.1.16"]
;; [cljs-ajax "0.8.0"]
[cljs-http "0.1.46"]
[hickory "0.7.1"]
;; [markdown-to-hiccup "0.6.2"]
]
;; :dev-http {3001 "public"}
:builds {
:spa-prod
{
:target :browser
:output-dir "public/js/compiled"
:asset-path "/js/compiled"
:modules {:app-comp {:init-fn shadowman.app/main}}
:compiler-options
{:optimizations :advanced
}}
}}我通过运行shadow-cljs release spa-prod获得上面的数字。除非我弄错了从死代码消除中期望什么,否则这幅画就有问题了。如果是这样的话,我将非常感谢关于如何调查它的任何想法。
发布于 2020-02-05 08:14:47
您可以生成一个建设报告,以了解最终构建包括哪些内容。
影子-cljs和闭包编译器不对构建所需的npm依赖项执行DCE。一旦包含它们,就只完成基本的DCE (即。:simple),它不能完全消除代码。这是因为:advanced破坏了太多的npm依赖关系。因此,在reagent的情况下,它最终会默认地包括react和react-dom,即使reagent是,这也不会被消除。
然而,这并不局限于npm依赖性。并不是所有的CLJS代码,甚至闭包库代码都可以完全消除。有些代码模式只会阻止DCE的出现。一个例子是任何不能被删除的defmulti/defmethod。
https://stackoverflow.com/questions/60065121
复制相似问题