请在2024年Clojure状态调查中分享您的观点!

欢迎!请参阅关于页面获取更多关于此工作方式的信息。

0
ClojureScript

当构建使用 {{cljs.js}} 命名空间的 cljs 源代码时,最终的 js 文件非常大:6.4M。如维基所述:https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting 它主要由 {{cljs.core}} 命名空间的分析缓存组成。作为一种权宜之计,维基文章建议将缓存转储到单独的文件,并在运行时加载它,而不是将其打包到 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时大约是800毫秒。

0

评论由:dnolen 提供

我在思考这到底有没有价值。在我看来,如果你真的在乎代码大小,你就可以使用Transit并将其分析异步加载?

0

评论由:nbeloglazov 提供

是的,如果大小至关重要,那么有更好的方法来手动调整加载分析的方式。同时,对于本地/简单开发来说,3M比6M的文件大小是个不错的改进。唯一的问题是速度,但我觉得比小小的速度损失更好地解决了大小的极大减少。

0

评论者:mfikes

当前的补丁不再适用。

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