请分享您的想法,参加2024 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 vs 6m的本地/简单开发文件大小是一所美妙的胜利。唯一的缺点是速度,但我觉得大幅减少大小比轻微的速度损失更好。

0

评论者:mfikes

补丁不再适用。

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