当构建使用 {{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}},它将启用缓存的字符串化序列化。
这个主意听起来合理吗?