ClojureScript如何将其命名空间与Clojure命名空间区分开?

时间:2019-09-18 16:21:23

标签: clojure namespaces clojurescript

我正在使用Clojure进行 Web开发,我注意到作者提供的ClojureScript示例使用常规的app-name.core名称空间,该名称空间也被Clojure部分使用。 Luminus的许多样板代码的应用程序。

ClojureScript和Clojure通常分别用于评估应用程序的客户端和服务器端的相同代码,那么,如何区分ClojureScript核心名称空间和Clojure核心名称空间中的代码?是否使用目录结构?可以同时使用两个都不需要指定的代码吗?

2 个答案:

答案 0 :(得分:0)

无论您的代码是在Node.js还是在浏览器中运行,都可以使用JavaScript进行编程。显然,取决于平台,API并不相同。

我的理解是ClojureScript只是一个编译器。您使用普通的Clojure(带有API的一个子集)编写代码,然后使用ClojureScript将Clojure编译为JavaScript。

因此,我认为名称空间的管理方式没有任何区别:

  • .替换为/
  • 追加cljcljs
  • -替换为_
  • 除非进行了其他配置,否则假设src是根目录

例如,app-name.core“解析”为src/app_name/core.cljs

认为(可能是错误的),在JVM上,如果磁盘上不存在文件,则编译器将查看JAR内部(如果有)。显然,使用ClojureScript不会发生这种情况。

答案 1 :(得分:0)

我在其他答案中说过恕我直言,在同一个git仓库中同时包含前端代码(CLJS)和后端代码(CLJ)是错误的。从根本上说,您有两个不同的程序,它们独立运行,在单独的硬件上并通过网络进行通信。这两个程序使用的所有公用程序都应放在单独的公用程序库中,这将是第三个存储库。

该组织为2(或3)个代码库提供了最大的独立性和清晰度,而与使用的语言无关。它同样适用于两个程序使用的任何语言组合:

  • Python和Python
  • Python和Java
  • JS(浏览器)和Python
  • CLJS(浏览器)和Java
  • CLJS(浏览器)和Clojure
  • 任何其他组合...

因此,您将*.clj文件用作后端代码,并将*.cljs文件用作前端代码[1]。如果您有任何常用的实用程序,请进行第三个存储库,并将*.cljc文件用于此共享库。

对于前端CLJS代码,恕我直言,使用新的figwheel-main和Clojure Deps工具比使用旧的lein工具要容易得多。有关详细信息,请参见figwheel.org。这也使得将CLJ repl和CLJS repl分开保持更加容易(不需要“ piggieback”东西)。它还将CLJ编译和CLJS编译分开,这也简化了事情。


如上所述,希望您对原始问题的回答更加清楚。 CLJS代码可能具有名称空间demo.core,该名称空间已编译为JavaScript,并在用户计算机上的浏览器中运行。 CLJ代码可能还具有命名空间demo.core,该命名空间已编译为Java字节码,并在云中的后端服务器上运行。因此,每个执行环境中只有一个ns demo.core,因此它们永远不会发生冲突。

因此,我们看到2个编译器将CLJ和CLJS代码库视为独立程序。这就是为什么恕我直言,使用两个不同的git存储库来防止混淆两个独立的代码库的原因。


脚注:

[1]。如果CLJS前端代码中包含宏,则由于CLJS编译器中的古怪之处,您还需要在*.clj*.cljc文件中定义它们。在这里,我们将忽略这种复杂性。

相关问题