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

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

0 投票
ClojureScript by

当构建使用 {{cljs.js}} 命名空间的 cljs 源代码时,最终的 js 文件相当庞大:6.4M。如维基百科所述: https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting 它主要是由 {{cljs.core}} 命名空间的分析缓存组成。作为一个变通方法,维基百科文章建议将缓存转储到单独的文件并在运行时加载它,而不是将其捆绑到 js 二进制文件中。我认为可以在不需要用户进行额外努力的同时,还优化 js 文件大小的某种东西之间进行。这个想法是,将缓存而不是转储为原始 Clojure 数据结构序列化为字符串。这样编译器就不会将缓存编译到 js 中(这会添加很多代码),并留下一个字符串。在运行时,这个字符串将被解解析回 Clojure 使用 {{tools.reader}}。

以下是我的提议: https://gist.github.com/nbeloglazov/0bf163fb62fa4b61d446

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

这听起来合理吗?

9 个答案

0 投票
by

评论者:nbeloglazov

附加建议的修复。分析缓存被序列化为字符串,并在 cljs.js 初始化时将其读取回 Clojure 数据结构。

0 投票
by

评论者:dnolen

请根据您建议的使之成为可选的。

0 投票

评论者:dnolen

您已经提交 Clojure CA 了吗?

0 投票

评论者:nbeloglazov

将会这么做。是的,我已经提交了 CA。我在那里面使用了我的正式名,Mikita Belahlazau。

0 投票

评论者:nbeloglazov

更新了补丁,该补丁添加了将核心分析缓存序列化为字符串的选项。:dump-core 的可能值是::raw、:string、:none。为了与向后兼容性,支持旧的 true/false 值。

至于默认值,当前的补丁使用 :raw,但我认为使用 :string 更有意义。减少最终的 js 文件大小几 MB 是相当好的。我认为大多数开发者不会深入研究 js 的大小为什么大,而只是将其保持原样。:string 引入的额外一次性解析性能影响是可以接受的:当使用 :string 时,页面加载时间为 1 秒,而使用 :raw 时,时间为 ~800 毫秒。

0 投票

评论者:dnolen

我在想这真的有价值吗?在我看来,如果您对代码大小认真对待,您就会使用 Transit 然后异步加载分析?

0 投票

评论者:nbeloglazov

是的,如果大小是关键因素,那么有更好的方式手动调整分析加载的方式。同时,对于本地的简易开发来说,从 3M 到 6M 的文件大小是一个很大的优势。唯一的缺点是速度,但我觉得比小的性能惩罚,大小减少更重要。

0 投票

评论者:mfikes

补丁不再适用。

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