Clojurescript устранение мертвого кода, очевидно, не работает - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть проект 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 кБ. После того, как я раскомментирую [cljs-http.client :as http], общий скачок достигнет 299,7 кБ; в том числе reagent дополнительно повышает его до 457,4 кБ. Поскольку я не вызываю никаких функций из этих пространств имен, не должен ли компилятор Google Closure исключить их как мертвый код?

Соответствующие части моего shadow-cl js. 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. Если я не ошибаюсь по поводу того, что ожидать от устранения мертвого кода, что-то не так с этой картиной. Если это так, я буду благодарен за любые идеи о том, как его исследовать.

1 Ответ

1 голос
/ 05 февраля 2020

Вы можете сгенерировать отчет о сборке , чтобы узнать, что входит в вашу окончательную сборку.

shadow-cl js и компилятор Closure не выполняют DCE для зависимостей npm, которые были необходимы вашей сборки. Как только они включены, выполняется только базовый c DCE (ie. :simple), который не способен полностью удалить код. Это сделано потому, что :advanced нарушает слишком много npm зависимостей. Таким образом, в случае reagent это будет включать в себя react и react-dom по умолчанию, которые не будут устранены, даже если reagent.

Это не ограничено npm зависимости однако. Не весь код CL JS или даже код библиотеки закрытия может быть полностью исключен. Некоторые паттерны кода просто не допускают, чтобы DCE включался. Одним из примеров может быть любой defmulti/defmethod, который нельзя удалить.

...