ClojureScript如何区分其名称空间与Clojure名称空间?

ClojureScript如何区分其名称空间与Clojure名称空间?,clojure,namespaces,clojurescript,Clojure,Namespaces,Clojurescript,我正在与Clojure一起进行Web开发,我注意到作者提供的ClojureScript示例使用了传统的app name.core名称空间,应用程序的Clojure部分也在使用该名称空间来获取Luminus的大量样板代码 ClojureScript和Clojure通常分别用于计算应用程序客户端和服务器端的相同代码,那么它如何区分ClojureScript核心命名空间和Clojure核心命名空间中的代码呢?它使用目录结构吗?您是否可以使用来自这两个站点的代码,而不必指定?无论您的代码是在Node.j

我正在与Clojure一起进行Web开发,我注意到作者提供的ClojureScript示例使用了传统的
app name.core
名称空间,应用程序的Clojure部分也在使用该名称空间来获取Luminus的大量样板代码


ClojureScript和Clojure通常分别用于计算应用程序客户端和服务器端的相同代码,那么它如何区分ClojureScript核心命名空间和Clojure核心命名空间中的代码呢?它使用目录结构吗?您是否可以使用来自这两个站点的代码,而不必指定?

无论您的代码是在Node.js上运行还是在浏览器中运行,您都可以使用JavaScript编程。显然,根据平台的不同,API是不同的

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

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

  • 替换为
    /
  • 追加
    clj
    cljs
  • -
    替换为
    .
  • 除非另有配置,否则假定
    src
    是根目录
例如,
app name.core
“解析”为
src/app\u name/core.cljs


我认为(可能是错误的)在JVM上,如果磁盘上不存在文件,编译器将查看JAR(如果有的话)。显然,ClojureScript不会出现这种情况。

我在其他回答中说过,在同一个git存储库中同时包含前端代码(CLJS)和后端代码(CLJ)是错误的。基本上,您有两个独立运行的不同程序,它们位于不同的硬件上,并且通过网络进行通信。两个程序使用的任何通用UTIL都应该在单独的实用程序库中,这将是第三个repo

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

  • Python&Python
  • Python与Java
  • JS(浏览器)和Python
  • CLJS(浏览器)和Java
  • CLJS(浏览器)和Clojure
  • 任何其他组合
因此,后端代码使用
*.clj
文件,前端代码使用
*.cljs
文件[1]。如果您有任何通用工具,请进行第三次回购,并使用此共享库的
*.cljc
文件

对于前端CLJS代码,使用新的
figwheel main
和Clojure Deps工具比使用旧的lein工具容易得多。详情请参阅。这也使得将CLJ repl和CLJS repl分开变得更容易(不需要“背驮”的东西)。它还将CLJ编译和CLJS编译分开,这也简化了事情


说了以上,我希望你原来问题的答案变得更清楚。CLJS代码可能有一个名称空间
demo.core
,它被编译成JavaScript,在用户计算机上的浏览器中运行。CLJ代码还可能有一个名称空间
demo.core
,它被编译成Java字节码,运行在云中的后端服务器上。因此,每个执行环境中只有一个ns
demo.core
,因此它们从不冲突

因此,我们看到这两个编译器将CLJ和CLJS代码基视为独立的程序。这就是为什么IMHO使用两个不同的git存储库来防止两个独立的代码库合并会更简单


脚注:


[1] 。如果CLJS前端代码中有宏,则由于CLJS编译器中存在的问题,还需要在
*.clj
*.cljc
文件中定义宏。这里我们将忽略这个复杂问题。

取决于您的构建工具。约定是使用
.cljc
文件作为clj和cljs之间共享的代码。据我所知,在命名名称空间方面没有任何约定。你可能想要不同的名字,我会说这更像是一个命名问题。所有模板在这方面都非常糟糕。一开始就有一个
.core
名称空间是绝对没有理由的。将它们转移到独立的git回购协议并不能让情况变得更好。一个名字仍然有两种不同的含义。只需使用更好的名称,如
demo.server
demo.frontend
,或者更好地遵循JVM命名约定,使用
my.company.frontend
my.company.server
。我同意拥有
*.core
命名空间的约定并不总是很合适的。但是,它可以用于表示中心或“核心”ns,其中其他名称空间更专业,并充当核心的支持角色。它有点类似于Java的
main(String[]args)
方法——它为读者提供了从何处开始的信息。也许吧,但我的论点是它将是
demo.frontend.core
demo.server.core
。永远不应该有具有相同名称的名称空间服务于完全不同的角色。对于实际具有相同用途的
.cljc
和宏名称空间来说,这很好。