请分享您的想法,参与 2024 年 Clojure 状态调查!

欢迎!欲了解更多关于如何操作的信息,请参阅 关于 页面。

0 投票
ClojureScript

我一直追踪一个问题,在某些开发者的机器上编译 CLJS 项目时会看到栈溢出错误,而在其他机器上则不会有。

我认为这主要是因为在执行依赖项的拓扑排序时,cljs.js-deps/dependency-order 添加了一个额外的 require。

(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"],它没有出现在输入中。
如果输入顺序被交换,则不会添加额外的 require

  (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 的 bug 是有效的(它应该只对依赖项进行排序,而不是向它们添加额外的 require),但修复核心问题(在同一个项目中具有 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
欢迎来到 Clojure Q&A,您可以在此处提问并获得 Clojure 社区成员的回答。
...