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

欢迎!请参阅关于页面以获取如何使用本网站的一些更多信息。

0
ClojureScript

调查cljs.spec对:advanced构建的影响。

目前,所有规范都保存在(私有)cljs.spec/registry-ref原子中。这个原子不被Closure Compiler理解,无法将其作为死代码删除。因此,即使在“生产”中不使用规范,它们仍然会使生成的JS大小膨胀。一些规范可能在运行时使用,无法删除,但是生成的部分在:advanced构建中可能永远不会需要,应该以某种方式省略。

在测试构建(使用1.9.93)中,只要有地方require了 cljs.spec,就会增加11kb(102kb对91kb),每个定义的规范都会进一步增加。

11 个答案

0

评论由:orestis

在当前CLJS版本(1.10.439)中,我观察到带有几个规范(优化过的)的JavaScript达到了60kb -- 我只是定义规范和fdefs,在我生产的代码中从未使用过spec中的s/valid?或类似调用。我的数字来自shadow-cljs报告。

cljs/spec/alpha.cljs 35.84 KB
cljs/spec/gen/alpha.cljs 27.33 KB

0

评论由:dnolen

请注意,这个问题与multimethods非常相似。鉴于spec是一个非常动态的特性,我怀疑能否对这个问题做些什么。

0

评论由:greybird

我理解你关于多方法(全局注册表的使用)的看法,但据我理解,在设置 compile-asserts 为 false 的情况下,如果不需要使用 s/valid,它们应该可以被构建过程完全移除。
(或类似设置)。

0

评论由:dnolen

马克,compile-asserts 仅适用于实际的 assert 使用。所以它与规范完全无关,很可能不会。

0

评论由:greybird

也许可以添加一个新的变量(compile-specs?),以防止规范被添加到注册表中。

我的观点是,如果没有在产品构建中删除规范的方法,则在 CLJS 中使用规范是不可能的,因为这对大小敏感的移动应用来说会增加代码大小。当然,并非所有人都会处于这种情况,但在这种情况下,使用规范对于测试和开发调试将会非常有益。

0

评论人:thheller

如果需要,规范可以很容易地完全移除,问题是如果你想保留一些,你必须保留所有,因为我们不能在编译时告诉会使用哪些。

所以,我同意,我们可能没有办法解决这个问题。不过,我们可以减少生成的代码量。考虑到其中一些在运行时立即构建和丢弃。例如,cljs.spec.alpha/def-impl 通过宏代码传入 3 个参数。其中一个是第二个参数 spec 的原始代码 form。对于大量的规范,form 参数将在运行时立即被丢弃并且永远不会使用,因为第二个参数 spec 取代了它。但是,闭包会保留 form,所以我们在宏中可以对此更加精明。

0

评论由:greybird

对于这个目的或编译器选项,使用新的变量来完全删除规范将满足我的需求。

我发现通过将它们放入独立的命名空间和配置开发构建来从产品构建中删除规范非常困难,而且我没有能够完全通过这种方式去除它们。我认为其他人也会觉得很难。此外,我将规范及其功能分开有一定距离对我来说完全不可接受,我更愿意将它们并排放置。

目前,我只坚持使用断言(assert)。

0

评论人:thheller

Closure Compiler提供了一些选项,可以根据名称或前缀/后缀从构建中删除代码(链接:1)。我最近将其添加到了shadow-cljs(链接:2)。这允许通过

:strip-type-prefixes #{"cljs.spec"}

只允许完全删除,但如果这是您想要的,效果合理。可能应该打开一个独立的票据来移植这些选项。

(链接:1) https://shadow-cljs.github.io/docs/UsersGuide.html#_code_stripping
(链接:2) https://github.com/thheller/shadow-cljs/blob/69316cfd0e041ef064696479cd33a65cfd4167d2/src/main/shadow/build/closure.clj#L165-L175

0

评论由:greybird

感谢Thomas。了解strip选项很好,我现在正在使用Shadow。

0

评论人:thheller

注意,Closure不喜欢某些模式,目前无法完全删除{{cljs.spec}}。对于{{cljs.pprint}}等事物,它运行良好,但与{{defonce}}生成代码有问题,因此需要进行调整。

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