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

欢迎!有关该页面的更多信息,请参阅关于页面。

0
ClojureScript

boot-cljs和boot-reload的使用案例

编译后,boot-reload重新加载了变更的JS文件。为了使文件能够按正确顺序重新加载,boot-cljs使用依赖关系图对文件进行排序。目前,boot-cljs直接访问编译器状态并使用{{:js-dependency-index}}中的数据来构建图:[https://github.com/adzerk-oss/boot-cljs/blob/0.0-3308/src/adzerk/boot_cljs/impl.clj#L17-L36](https://github.com/adzerk-oss/boot-cljs/blob/0.0-3308/src/adzerk/boot_cljs/impl.clj#L17-L36)

简单解决方案

如果通过API公开命名空间的依赖关系(requires),则可以轻松构建 ClojureScript 命名空间依赖关系图:[https://github.com/adzerk-oss/boot-cljs/blob/d479f10935be321232e2363e2ae3e9cc515a81af/src/adzerk/boot_cljs/impl.clj#L12-L32](https://github.com/adzerk-oss/boot-cljs/blob/d479f10935be321232e2363e2ae3e9cc515a81af/src/adzerk/boot_cljs/impl.clj#L12-L32)

此解决方案的问题是{{all-ns}}、{{ns-dependencies}}或{{target-file-for-cljs-ns}}与foreign-deps不兼容。虽然foreign-dep文件通常不会更改并且不需要重新加载,但用户可能在项目中使用 foreign-deps 有本地JS文件,这些文件可能会更改。

问题、注释和问题

  • 是否应该在API中公开{{cljs-dependency-graph}},或者只提供{{ns-dependencies}}等用户可以使用以创建依赖关系图的数据是否足够?
  • {{cljs.build.api/parse-js-ns}}也可以用于从编译后的JS文件中读取 Provides 和 requires,但这同样不与 foreign-deps 兼容
  • 也许在Closure库中有一种方式可以按正确顺序重新加载文件?
  • 可能不需要支持 foreign-deps,但是如果有一种好方法,那会很不错。

5 答案

0
_评论者:deraen_

我会添加对{{cljs.compiler.api}}的调用,并可以将其命名为{{output-dependency-graph}}。

创建该图需要所有节点的列表和每个节点的依赖关系。对于Cljs命名空间:
这些可以通过 {{all-ns}} 和 ns 分析图 {{:requires}} 访问。关于 foreign-deps 的数据
以及闭包库在生产编译状态下可以通过 {{:js-dependency-index}} 键获取。要创建这个
图,我们需要

1. 获取所有节点的列表
2. 获取给定节点的依赖关系
3. 获取给定节点的输出文件

由于步骤 2 和 3 都依赖于节点的类型,因此最好在步骤 1 中收集这些
值。因此,步骤 1 大概会这样做

{{(get-nodes ...) => [{:provides "goog.net" :file "out/goog/net.js" :dependencies #{"goog.foo"}} {:provides "frontend.core" :file "out/frontend/core.js" :dependencies #{"cljs.core"}}]}}

这可以通过从 {{all-ns}} 等获取的 cljs 命名空间数据合并
与 {{:js-dependency-index}} 的数据来实现。下一步和最后一步是使用 reduce 构建图。

使用此实现会有一个新 API 调用:{{output-dependency-graph}}。

我正在考虑一种替代方法,使用 {{all-ns}}、{{find-ns}} 等版本的版本,该方法也可以与 foreign-deps 和闭包库一起工作,但是我认为这并不容易(或效率高),例如,仅使用名称来检索 foreign-dep 数据,因为它们按文件路径索引。
0

评论者:dnolen

现在 CLJS-1437 已合并,完成这项工作需要什么?

0

评论者:deraen

我目前使用 boot-cljs/boot-reload 的计划是使用 Figwheel 客户端代码,该代码使用 Google Closure 依赖图按正确顺序加载文件。所以我不再需要这个了。也许最好把它关闭掉,因为没有人在使用它?

0

评论者:dnolen

它可能在某个时刻还有用。我们只是降低优先级。

0
参考:https://clojure.atlassian.net/browse/CLJS-1407(由 deraen 报告)
...