2024 State of Clojure 问卷调查!中分享您的想法。

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

0 投票
ClojureScript

当构建使用 {{cljs.js}} 命名空间的 cljs 源码时,生成的最终 js 文件非常大:6.4M。如维基百科中所述:[https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting](https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting),它主要由 {{cljs.core}} 命名空间的分析缓存组成。作为解决方案,维基百科文章建议将缓存导出到单独的文件中,并在运行时加载,而不是将其打包到 js 二进制文件中。我认为可以在不要求用户做额外工作的情况下进行优化,同时也能优化 js 文件的大小。这个想法是将缓存以原始的 clojure 数据结构的形式导出,而不是序列化为字符串。这样,编译器就不会将缓存编译成 js(增加了很多代码),而是将其留下为字符串。在运行时,这个字符串将使用 {{tools.reader}} 解析回 clojure。

以下是提议:[https://gist.github.com/nbeloglazov/0bf163fb62fa4b61d446](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 投票
by
参考:[https://clojure.atlassian.net/browse/CLJS-1601](https://clojure.atlassian.net/browse/CLJS-1601)(由nbeloglazov报告)
...