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

欢迎!请参阅关于页面以了解有关此工作的更多信息。

0 投票
ClojureScript

当存在 node_modules 中的循环依赖时,编译器会报错缺少提供项。

原因是 out/cljs_deps.js 中 'goog.addDependency' 语句的顺序。

goog.addDependency("../node_modules/lib1.js", (link: 'lib1'), (link: 'lib2')); // 这行将失败,因为 'lib2' 还未提供
goog.addDependency("../node_modules/lib2.js", (link: 'lib2'), (link: 'lib1'));

受影响的 node_modules 例子:apollo-client 1.9.2

我不确定这是 closure 编译器的限制还是明确不支持,但确实减少了可以用于 node_modules 的节点包的数量。

当前的解决方案是重写库代码以消除循环依赖,或将 cljsjs 作为替代方案。

2 答案

0 投票

评论由:deraen 提出

在用最新的 Cljs 变化测试 Apollo-client 1.9.2 时,我没有注意到循环依赖,但有其他奇怪的事情发生。

`}
// Apollo-client 中的代码引用了某些模块时使用了错误的名字
goog.provide("module$home$juho$Source$reagent$test_environments$browser_node$node_modules$apollo_client$transport$networkInterface");
goog.require("module$whatwg_fetch");
goog.require("module$graphql$language$printer");

// 来自 whatwg 文件
goog.provide("module$home$juho$Source$reagent$test_environments$browser_node$node_modules$whatwg_fetch$fetch");
`
}

这可能是由于 Cljs 的一个 bug 导致的,因为提供(provide)名称是我们创建的,而需要(require)名称由 Closure 提供。

0 投票
参考资料: https://clojure.atlassian.net/browse/CLJS-2382(由 hpnm 提供)
...