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 文件通常不更改且因此不重新加载,但用户在项目中可能使用了 local JS 文件来使用 foreign-deps,而且这些文件可能会更改。

问题、注释和问题

  • 应该在 API 中暴露 {{cljs-dependency-graph}},还是只提供 {{ns-dependencies}} 等,让用户自己使用它们创建依赖图?
  • {{cljs.build.api/parse-js-ns}} 也可以用来从编译后的 JS 文件中读取提供者(providers)和需要者(requires),但这与 foreign-deps 一样不可行
  • 也许Closure库中有某种方式可以按正确顺序重新加载文件?
  • 支持 foreign-deps 可能不是必需的,但如果存在很好的方式,那就更好了。

5 个回答

0
_评论者:deraan_

我会添加对 {{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"}}]}}

这可以通过将来自cljs命名空间从{{all-ns}}等处检索到的数据与数据{{:js-dependency-index}}连接起来实现。
接下来和最后一步将是使用reduce构建图。

使用这种实现,只需进行一个新API调用:{{output-dependency-graph}}。

我考虑了另一个使用{{all-ns}}、{{find-ns}}等不同版本的方法,这些方法也会与foreign-deps和闭包库一起工作,但我认为这不是很容易(或高效)的,例如,仅通过名称检索foreign-dep的数据,因为它们是根据文件路径索引的。
0
by

由dnolen发表评论

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

0
by

由deraen发表评论

我目前的计划是与boot-cljs/boot-reload一起使用Figwheel客户端代码,该代码使用Google Closure依赖关系图按正确的顺序加载文件。因此,我不再需要此功能。也许最好在目前没有人在使用它的情况下关闭此功能?

0
by

由dnolen发表评论

它可能在某个时候还有用。只是将优先级降低。

0
by
...