为什么我的 lein re-frame 模板中有 clj 和 cljs 文件夹,如下所示?为什么它们都包含.core
似乎使用相同命名空间的文件?有人告诉我这是学习重新框架时开始的地方,但我找不到任何解释为什么模板按照它们的方式设置或创建,包括它们包含的内容。
对于任何 lein 模板附带的任何样板或代码都没有任何解释,这使得它们很难被初学者使用。
提前致谢。
为什么我的 lein re-frame 模板中有 clj 和 cljs 文件夹,如下所示?为什么它们都包含.core
似乎使用相同命名空间的文件?有人告诉我这是学习重新框架时开始的地方,但我找不到任何解释为什么模板按照它们的方式设置或创建,包括它们包含的内容。
对于任何 lein 模板附带的任何样板或代码都没有任何解释,这使得它们很难被初学者使用。
提前致谢。
此设置用于将 Clojure 后端代码与 ClojureScript 前端分开。这实际上没有必要,我也不特别推荐它,但我可以解释它的历史以及你为什么要这样做。
对于 ClojureScript 方面,这根本不重要。
在构建 Clojure 后端时,您通常会部署在一些“uberjar”或“uberwar”设置中。这意味着所有源文件和依赖项都打包到一个.jar
文件中(基本上只是一个 zip 文件)。这通常是通过包含一组指定目录中的所有文件来完成的,因此它将包含src/clj
但不包含src/cljs
. 如果所有内容都在一个目录中,它也会添加.cljs
文件,尽管 Clojure 后端从未使用它们。所以本质上它只是让你的“uberjar”更大。这不是一个重要的优化,但有些人更喜欢保持精简和清洁。
此外,一些开发人员更喜欢以这种方式分离代码。在这种情况下,模板作者做到了。
一个答案:
正如评论所指出的,一些项目在同一个项目 repo 中开发后端代码 (Clojure) 和前端代码 (ClojureScript)。我认为这是一个错误,因为它很容易导致混乱和纠缠(尤其是如果使用 lein 同时启动两个项目)。恕我直言,最好将前端和后端部分保存在单独的存储库中。我还强烈建议使用figwheel-main和 Clojure deps 构建工具来构建 CLJS 代码。
另一个答案:
对于 CLJS 代码,必须在“早期”编译阶段定义任何宏。因此,对于定义宏的命名空间,您经常会看到类似util.clj
或util.cljc
定义宏的文件,然后util.cljs
是使用宏的文件。
您可以在下面找到更多信息,但这很微妙且令人困惑: