ClojureScript可重用库

6

于是,我将我的大型Clojure项目拆分成了两个。

我编译了核心部分并制作了一个Uberjar(超级JAR包)。

然后输入:

lein deploy clojars

为了将那个jar文件公开,我在我的应用程序的project.clj文件中将其添加为依赖项。
这段代码是用cljx编写的,因此可以编译成JavaScript。
我需要采取哪些等效步骤才能将我的两个cljx代码库变成两个单独的JavaScript库,而不必重复整个ClojureScript虚拟机?
更新:澄清一些事情。
1)我知道我可以转到使用.cljc而不是.cljx。我唯一的关注点是这似乎非常新,我不知道我的代码的现有用户是否可能会使用它。但我很快可能会采取这种做法。以cljc形式回答也可以。
2)我已经成功地将我的代码编译成一个单一的主要.js文件。我要找的是如何编译cljs的单独库,这些库可以包含在其他cljs项目中。因为每次我当前编译cljs的时候,都会得到一个包含整个clojurescript VM的main.js文件。
3)我重新回到这个问题的一个动机是我想开始使用Figwheel。所以我想能够创建clojurescript中的库,以便将它们放入我正在通过Figwheel开发的新clojurescript项目中。因此,我想我会在这个新项目的project.clj文件中引用它们,并将它们作为已编译的.js文件包含在web页面中。我错了吗?

如果您能分享两个项目的 project.clj 文件,那就太好了。.cljx 配置中可能会出现多种问题: :output-path:source-path:resource-path,还有声明依赖项的方式(使用 :aot 可能会有问题),以及在 deploy clojars 之前是否先调用 cljx once 等等。 - nberger
我添加了一个答案,我认为它可以准确地指出你应该考虑的最重要的部分,并且如果你想深入了解,还包括一些链接。 - nberger
根据您更新的问题,我想说:是的,您错了,您不想将它们包含为已编译的.is文件。您希望库提供ClojureScript代码,就好像它们是类路径中的资源一样,因此在使用该库的项目的cljsbuild环境中可用。 - nberger
那么...你是说你从不以编译形式将ClojureScript库分发到其他项目中吗?总是原始源代码?而消费项目总是重新编译为一个单独的大型JavaScript文件?那么当我使用Figwheel时呢?据我所知,它似乎在浏览器中根本不包含ClojureScript VM,请问该怎么办? - interstar
没错,就是这样。以prismatic/schema jar为例:curl -O https://clojars.org/repo/prismatic/schema/0.4.0/schema-0.4.0.jar && unzip schema-0.4.0.jar。你在那里找不到任何.js文件,只有.cljs.clj文件。它肯定被用作库,从clj和cljs项目中使用,无论是否使用figwheel。顺便说一下,当你使用figwheel时,你会将“clojurescript VM”(你的意思是cljs.core和相关命名空间)带入浏览器中。 - nberger
显示剩余5条评论
2个回答

2
没有更多有关您的project.clj的细节,因此很难确定配置中的错误或缺失。但我会尝试涵盖其中最重要的部分,您应该仔细查看。

不要使用cljx,使用Reader Conditionals!

现在,cljx已被废弃,取而代之的是Reader Conditionals (cljc)。如果您有机会升级到clojure 1.7.0,那么我的建议是这样做,并放弃使用cljx:您将避免cljx的许多问题,因为cljc是clojure编译器知道的东西,而不是使用需要与其他构建流水线保持同步的构建工具。

如果您仍然要使用cljx...

我不会重复所有在cljx的优秀的自述文件中涵盖的内容,只会指出一些相关部分:
  1. 您必须确保在管道中下游的其他任务(javaccompileuberjar甚至是testcljsbuild test)之前调用cljx once。因此,您可能需要创建别名或修改project.clj中的默认:prep-tasks。更多信息:请参见安装部分

  2. 您的cljx :output-path 应该添加到您的cljsbuild :source-paths中。请参见使用部分

最后但并非最不重要的:

  1. 在使用cljsbuild时,不要将依赖声明为:classifier "aot"。只有当你知道自己在做什么时才使用它。如果在开发过程中遇到依赖问题,请将其移除。无论你是使用cljx、cljc还是纯cljs,都适用。

  2. 查看其他项目的cljx配置。例如:Prismatic/schemaSablono中的“切换到读取器条件”提交


nberger. 这是我的问题的答案吗?我已经成功地将cljx编译为cljs。问题是,我只得到了一个单一的庞大的main.js文件。我想知道的是如何将我的巨大的cljs拆分成不同的项目,从而给我单独的JavaScript文件,可以被其他项目安装/包含在内。 - interstar
@interstar 嗯,是的,它是作为你问题的答案而意图的,只是也许我没有理解你确切的问题。我现在认为我明白了:你不必担心编译后的js输出如何包含在你的uberjar中,而是要考虑如何将你的cljs文件包含在uberjar中,以便它们作为clojurescript代码可用。最常见的方法是有一个输出路径,然后将其添加为资源路径,你可以在我的答案中链接的prismatic schema project.clj中看到这一点。另一个选择是sablono的方式:输出到target/classes。 - nberger

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接