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)

简单解决方案

如果通过API公开命名空间的依赖项(requires),则很容易构建cljs命名空间依赖关系图:[链接](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文件通常不变,因此不需要重新加载,但用户项目中有可能存在本地的JS文件使用foreign-deps,这些文件可能会更改。

问题、注释和问题

  • {{cljs-dependency-graph}}是否应在API中公开,或者是否只需提供{{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 的数据
以及闭包库在编译状态下的 {{: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}} 等 {{:requires}} 版本的替代方法,该方法也适用于 foreign-deps 和闭包库,但我认为它可能并不容易(或高效),例如仅使用名称检索 foreign-dep 的数据,因为它们按文件路径索引。
by

Comment made by: dnolen

现在随着 CLJS-1437 的合并,需要哪些步骤来完成这个任务?
0 投票
by

Comment made by: deraen

由于 boot-cljs/boot-reload 当前使用 Google Closure 依赖图来按正确顺序加载文件的客户代码,因此我不需要这个功能 anymore。也许最好关闭它,如果现在没有人需要它的话?

0 投票
by

It may still be useful at some point. Will just lower the priority.

by

0 投票
Comment made by: deraen

Comment made by: deraen

它可能在某个时候仍然有用。只会降低优先级。

0 投票
by
Reference: https://clojure.atlassian.net/browse/CLJS-1407 (reported by deraen)
...