请在 2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于页面 了解更多关于此功能的信息。

0
ClojureScript

我在某些开发机的 CLJS 项目编译中遇到了堆栈溢出的问题,但其他地方没有。

我认为这归结于在执行依赖关系拓扑排序时,cljs.js-deps/dependency-order 添加了一个额外的依赖。

(require '[cljs.js-deps :as deps])
=> nil
(deps/dependency-order
  '({:file "libs.js", :provides ["react" "cljsjs.react"], :requires [] :foreign true}
    {:file "libs.js", :provides ["react" "react-dom" "webpack.bundle"] :foreign true}
    {:file "libs.js" :provides ["react-dom" "cljsjs.react.dom"], :requires ["react"] :foreign true}))
=>
({:file "libs.js", :provides ["react" "cljsjs.react"], :requires [], :foreign true}
 {:file "libs.js", :provides ["react" "react-dom" "webpack.bundle"], :foreign true, :requires ["react"]}
 {:file "libs.js", :provides ["react-dom" "cljsjs.react.dom"], :requires ["react"], :foreign true})

注意输出中的第二个映射多了一个额外的 :requires ["react"],输入中没有。
如果输入顺序改变,则不会添加额外的依赖。

  (deps/dependency-order
    '({:file "libs.js", :provides ["react" "react-dom" "webpack.bundle"] :foreign true}
      {:file "libs.js", :provides ["react" "cljsjs.react"], :requires [] :foreign true}
      {:file "libs.js" :provides ["react-dom" "cljsjs.react.dom"], :requires ["react"] :foreign true}))
  =>
  ({:file "libs.js", :provides ["react" "react-dom" "webpack.bundle"], :foreign true, :requires []}
   {:file "libs.js", :provides ["react" "cljsjs.react"], :requires [], :foreign true}
   {:file "libs.js", :provides ["react-dom" "cljsjs.react.dom"], :requires ["react"], :foreign true})

这是一个有效的问题吗?

1 个答案

0

David Nolan 通过 Slack 帮助我诊断出问题。

项目包含了这个配置

:foreign-libs [{:file "libs.js"
             :global-exports {react React
                              react-dom ReactDOM}
             :provides ["react" "react-dom" "webpack.bundle"]}]

其中 "react" 和 "react-dom" 由一个外部 JS 文件提供,该文件已经被 webpack 打包。

结果是,项目中的另一个依赖项也通过 cljsjs 引入了 "react" 和 "react-dom"。

多余的 react/react-dom 包含导致 deps/dependency-order 的输入不正确。

在 deps.edn 中添加排除项修复了问题

re-graph/re-graph {:mvn/version "0.1.15"
                     :exclusions [cljsjs/react cljsjs/react-dom]}

我认为 deps/dependency-order 的错误是有效的(它应该仅对依赖项进行排序,而不是向它们添加额外的依赖),但修复核心问题(在同一个项目中拥有 cljsjs/react 和 react)足以绕过这个问题。

我将原始 StackOverflow 错误的输出添加在此以增强可检索性

[Figwheel:WARNING] java.lang.StackOverflowError
                    clojure.lang.RT/seqFrom at RT.java(543)
                        clojure.lang.RT/seq at RT.java(537)
        clojure.core$seq__5402/invokeStatic at core.clj(137)
          clojure.core$reduce1/invokeStatic at core.clj(930)
           clojure.core$get_in/invokeStatic at core.clj(6142)
                 clojure.core$get_in/invoke at core.clj(6142)
    cljs.module_graph$deps_for/invokeStatic at module_graph.cljc(150)
          cljs.module_graph$deps_for/invoke at module_graph.cljc(147)
             clojure.lang.AFn/applyToHelper at AFn.java(160)
                   clojure.lang.AFn/applyTo at AFn.java(144)
            clojure.core$apply/invokeStatic at core.clj(665)
     clojure.core$memoize$fn__6877/doInvoke at core.clj(6353)
                 clojure.lang.RestFn/invoke at RestFn.java(436)
 cljs.module_graph$deps_for$fn__4858/invoke at module_graph.cljc(151
...