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