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

欢迎!请查看 关于 页面以获取更多有关如何使用此功能的信息。

0
ClojureScript

当构建使用 {{cljs.js}} 命名空间 cljs 源代码时,最终的 js 文件非常大:6.4M。如 wiki 中所述:[可选自托管](https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting),它主要由 {{cljs.core}} 命名空间的分析缓存组成。作为解决方案,wiki 文章建议将缓存输出到单独的文件,并在运行时加载它而不是打包到 js 二进制文件中。我想我们可以找到一个折衷的办法,即不需要用户额外做功,同时也能优化 js 文件的大小。这个想法是将缓存以原始的 clojure 数据结构的形式序列化成字符串。这样编译器就不会将缓存编译成 js(添加了大量代码),而是将其保留为字符串。在运行时,将使用 {{tools.reader}} 将该字符串解析回 clojure。

以下是提议:[点击访问](https://gist.github.com/nbeloglazov/0bf163fb62fa4b61d446)

在本地检查后,将 js 文件的大小从 6.4M 减少到 2.7M,我认为这相当不错。不利的一面是,现在 js 在运行时必须做更多的工作(解析大字符串),而今天它只需简单地读取 js 代码并执行它。但我认为这不应该是一个很大的问题。如果希望保持所有行为,可以为 {{:dump-core}} 编译器设置添加一个新的选项,类似于 {{:dump-core :string}},该选项启用缓存的字符串序列化。

这听起来合理吗?

9 答案

0

评论者:nbeloglazov

附上建议的修复方案。分析缓存被序列化成字符串,并在�始化 cljs.js 时将其读回 clojure 数据结构。

0

评论者:dnolen

请按照您建议的将其改编为可选项。

0

评论者:dnolen

你提交了Clojure CA了吗?

0

评论者:nbeloglazov

我会做的。是的,我已提交CA。我在那里使用了我的正式名字,Mikita Belahlazau。

0

评论者:nbeloglazov

更新了补丁,增加了将核心分析缓存序列化为字符串的选项。:dump-core的有效值有:raw, :string, :none。支持向后兼容的旧true/false值。

就默认值而言,当前补丁使用:raw,但我觉得使用:string更合理。节省额外的几个MB最终JS文件大小是相当不错的。我认为大多数开发者不会深入研究为什么会加大JS的大小,只会让它保持原样。:string引入的一次性解析性能影响是可接受的:当使用:string时,页面加载时间为1秒,而使用:raw时,时间约为800ms。

0

评论者:dnolen

我在想这实际上有价值吗?我觉得如果你真的在乎代码大小,你就可以只使用Transit,并且异步加载数据分析?

0

评论者:nbeloglazov

是的,如果大小很重要,那么还有更好的方法手动调整加载分析的方式。同时,对于本地/简单开发来说,3M比6M的文件体积是一个很好的收获。唯一的缺点是速度,但我认为大小的显著减小比小的速度损失更好。

0

评论者:mfikes

补丁不再适用。

0
参考:[https://clojure.atlassian.net/browse/CLJS-1601](https://clojure.atlassian.net/browse/CLJS-1601)(由 nbeloglazov 报告)
欢迎来到Clojure问答社区,您可以在这里提出问题,并从Clojure社区成员那里获得答案。
...