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公开命名空间的依赖(需要),则很容易构建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文件中读取提供和需要(需要),但它也不能用于foreign-deps。
  • 也许在Closure库中有一种按正确顺序重新加载文件的方式?
  • 支持foreign-deps可能不是必须的,但如果有一个好的方法,那就很好了。

5 答案

0
_由:deraen_发表的评论

我会在{{cljs.compiler.api}}中添加调用,并可以将其称为{{output-dependency-graph}}。

创建图需要列出所有节点及其每个节点的依赖关系,对于Cljs命名空间
这些可通过 {{all-ns}} 和 ns 分析图 {{:requires}} 获取。关于 foreign-deps 的数据
以及在编译状态下的 closure 库都可以在 {{: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 和 closure 库一起工作,但我认为这并不容易(或高效),例如使用只按文件路径索引的名称来检索 foreign-dep 的数据。
0
by

评论者:dnolen

现在 CLJS-1437 已经合并,完成这个还需要什么?

0
by

评论者:deraen

我目前的计划是使用 boot-cljs/boot-reload,它使用 Google Closure 依赖图来按正确顺序加载文件。因此我不再需要这个了。或许最好关闭这个,如果目前没有人需要它的话?

0
by

评论者:dnolen

这在未来可能仍然有用。将只降低优先级。

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