中分享您的想法!

欢迎!有关如何使用本站的更多信息,请参阅关于页面。

0
ClojureScript

研究 cljs.spec 对 :advanced 构建的影响。

目前所有规范都保存在 (private) cljs.spec/registry-ref 原子中。这个原子不被 Closure Compiler 所理解,并且不能作为废弃的代码消除。所以即使规范在 "生产" 阶段未使用,它们仍然会增加生成的 JS 大小。一些规范可能在运行时使用,但不能删除,而生成部分在 :advanced 构建中可能永远不需要,应该以某种方式省略。

在一个测试构建(1.9.93)中,只要 cljs.spec 在某处 require,就会增加 11 KB(从 91 KB 到 102 KB),并且随着定义的每个规范的增加而增加。

11 答案

0

评论者:orestis

在当前 CLJS 版本(1.10.439)中,我观察到有少量规范的使用增加了(优化后的)60 KB 的 JavaScript —— 我只是定义规范和 fdefs, never 使用生产代码中的 spec/valid? 或类似调用。我使用 shadow-cljs 报告中的数字。

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

0

评论者:dnolen

我将注意到这个问题似乎非常类似于多方法。鉴于规范是一个非常动态的特件,我对这个问题能做的事情不多持怀疑态度。

0

评论者:greybird

我明白您所说的多方法(使用全局注册表)的问题,但据我所知,当 编译断言 被设置为 false,且不使用 s/valid 时,可以完全通过构建过程去除 specs。
(或类似功能)。

0

评论者:dnolen

马克,compile-asserts 仅适用于实际的 assert 使用。因此,它与 specs 完全无关,可能不太可能有关。

0

评论者:greybird

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

我认为在没有一种能够在生产构建中移除它们的方法的情况下,无法在 CLJS 中使用 specs,因为这对于非常注重尺寸的移动应用程序来说会增加代码的大小。当然,并不是每个人都会处于这种情况,但在这个情况下使用 specs 对于测试和开发时的调试将非常有益。

0

评论者:thheller

如果需要,specs 可以完全删除,问题在于如果您想保留一些,您必须保留所有,因为我们无法在编译时知道将使用哪些内容。

因此,我同意我们可能对此无能为力。我们可以减少生成的代码量。考虑到其中一些是在运行时立即构建和抛弃的。例如,{{cljs.spec.alpha/def-impl}} 通过宏代码传递了 3 个参数。一个是第二个 {{spec}} 参数的原始代码 {{form}}。对于一个大量的 specs,{{form}} 参数将立即被丢弃并从未使用,因为第二个 {{spec}} 参数会取代它。关闭将永远不删除 {{form}},因此我们可能在宏中会更加聪明。

0

评论者:greybird

使用新的变量或编译器选项完全删除 specs 将满足我的需求。

我发现通过将它们放在单独的命名空间中并操纵开发构建来从生产构建中删除规范词组很困难,而且我无法完全以这种方式摆脱它们。我怀疑其他人也会觉得很难。此外,对于规范和其函数之间存在大距离的做法,我并不十分满意,我更愿意把它们放在一起。

目前我只是在坚持使用assert。

0

评论者:thheller

Closure编译器有几种选项可以通过名称或前缀/后缀从构建中删除代码(链接:1)。我最近将其添加到shadow-cljs中(链接:2)。这允许通过以下方式对spec进行暴力剥离:

: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

谢谢托马斯。了解strip选项很好,我现在正在使用Shadow。

0

评论者:thheller

请注意,Closure不喜欢某些模式,并且目前无法完全删除{{cljs.spec}}。它对像{{cljs.pprint}}这样的代码运行良好,但对于由{{defonce}}生成的代码存在问题,因此可能需要调整。

0
参考资料:https://clojure.atlassian.net/browse/CLJS-1701(由thheller提交)
...