shadow-cljs添加依赖后是否编译?为何文件数量无变化
问题与解答
问题背景
我按照shadow-cljs快速开始文档搭建了一个最小化项目,初始shadow-cljs.edn配置如下:
;; shadow-cljs configuration {:source-paths ["src/dev" "src/main" "src/test"] :dev-http {8080 "public"} :dependencies [] :builds {:frontend {:target :browser :modules {:main {:init-fn acme.frontend.app/init}} }}}
项目中/Users/pedro/projects/acme-app/src/main/acme/frontend/app.cljs代码为:
(ns acme.frontend.app) (defn init [] (println "Hello World"))
执行编译命令npx shadow-cljs compile frontend后,输出:
$ npx shadow-cljs compile frontend shadow-cljs - config: /Users/pedro/projects/acme-app/shadow-cljs.edn shadow-cljs - updating dependencies shadow-cljs - dependencies updated [:frontend] Compiling ... [:frontend] Build completed. (79 files, 0 compiled, 0 warnings, 4.88s)
之后我添加了一系列依赖:
:dependencies [[day8.re-frame/re-frame-10x "1.2.1"] [proto-repl "0.3.1"] [re-frame "1.2.0"] [com.degel/re-frame-firebase "0.9.6-SNAPSHOT"] [bidi "2.1.5"] [re-com "2.13.2-106-180ea1f-SNAPSHOT-TALLYFOR"] [com.andrewmcveigh/cljs-time "0.5.2"] [com.pupeno/free-form "0.6.0"] [binaryage/dirac "RELEASE"] [hickory "0.7.1"] [cljs-hash "0.0.2"] [medley "1.2.0"]]
但重新编译后,日志中的files、compiled、warnings数值均未改变(仍显示79 files, 0 compiled, 0 warnings),仅耗时略有波动。我并未调用依赖中的函数,想咨询:
- 添加的依赖是否真的被shadow-cljs编译?
- 若已编译,为何文件数量保持不变?
解答
添加的依赖没有被编译:shadow-cljs默认启用严格的Tree Shaking(摇树优化)机制,只会将代码中实际被引用、执行的部分打包进最终产物。你没有在项目代码中调用任何依赖的函数或引用其模块,这些依赖的代码完全不会进入编译流程,自然不会被编译。
文件数量不变的原因:编译日志里的
79 files指的是shadow-cljs处理的核心基础文件(比如ClojureScript标准库、shadow-cljs自身的辅助代码),并非你的项目代码+所有依赖的文件总和。未被引用的依赖不会被加载到编译队列中,所以这个数字不会变化。验证依赖是否可正常引入的方法:如果想确认依赖是否能被正确识别,可以在
app.cljs中显式引用某个依赖,比如:
(ns acme.frontend.app (:require [re-frame.core :as rf])) (defn init [] (println "Hello World") (rf/dispatch [:test-event]))
重新执行编译命令,就能看到compiled数值增加,files数量也会相应变化,证明依赖已被正确编译。
内容的提问来源于stack exchange,提问作者Pedro Delfino
相关产品推荐
相关产品推荐

