创建&;在Clojure和ClojureScript中使用库

创建&;在Clojure和ClojureScript中使用库,clojure,clojurescript,Clojure,Clojurescript,我刚刚编写了一些ClojureScript代码,却发现我无法访问我的project.clj依赖项中列出的库之一。这是正确的吗,也就是说,你不能使用CLJS中的Clojure库,除非它们是专门设计允许的 如果是这样的话,需要做多少额外的工作才能获得一个不使用任何Java互操作的Clojure库,并且它本身就是有效的ClojureScript代码,并且可以从ClojureScript中使用?环顾GitHub,许多lib似乎都有单独的clj和cljs代码源目录。这样的库是否可以添加到我的project

我刚刚编写了一些ClojureScript代码,却发现我无法访问我的
project.clj
依赖项中列出的库之一。这是正确的吗,也就是说,你不能使用CLJS中的Clojure库,除非它们是专门设计允许的


如果是这样的话,需要做多少额外的工作才能获得一个不使用任何Java互操作的Clojure库,并且它本身就是有效的ClojureScript代码,并且可以从ClojureScript中使用?环顾GitHub,许多lib似乎都有单独的clj和cljs代码源目录。这样的库是否可以添加到我的
project.clj
中,并立即从任一平台使用?

有一些ClojureScript

“project.clj”中的依赖项可以通过ClojureScript应用/可见/可用,例如,查看“”。您可以将其包括在“project.clj”中:

然后在ClojureScript文件中使用它:

(ns xyz.some.cljs
  (:require ...
            ...
            [clojure.browser.repl :as repl]
            [jayq.core :as jq])
虽然“jayq”不是“后端”意义上的“Clojure”库,因为它只是包装JavaScript,但它是在ClojureScript端使用“project.clj”依赖项的一个示例

此外,大多数核心库和几个非核心库已经移植到ClojureScript端:

  • clojure.set
  • clojure.string
  • 克洛朱尔·沃克
  • clojure.zip
  • clojure.core.reducers
  • fold目前是reduce的别名
  • 核心匹配
  • 核心逻辑(工作中)
其他Clojure库必须符合ClojureScript子集才能在ClojureScript中工作

克隆并了解它所支持的功能是值得的(如果您喜欢冒险,还可以添加您自己的功能:)


ClojureScript依赖项通常基于“前端”(包括从后端移植的依赖项)。换句话说,最终目标是由V8编译并作为JavaScript运行,因此可以使用ClojureScript编译器(上面的repo)编译的任何东西。

我看到答案是在2013年给出的,但到2020年,
CLJS 1.10版仍然是这样。仍然不可能只使用任何Clojure库,除非该库已与CLJS兼容。使用
shadow CLJS
生成时会出现如下生成错误:

The required namespace "clojure.data.json" is not available, it was required by "bharati/binita/frontend/demo3/main.cljs".
"clojure/data/json.clj" was found on the classpath. Should this be a .cljs file?

除了使用任何其他与CLJS兼容的库之外,我看不到任何解决方案。

谢谢。因此,当我将jayq添加到project.clj文件时,编译器如何知道它是ClojureScript?我看到jayq自己的项目文件几乎是空的:那它是怎么说的呢?另外,作为上面的扩展,如果我想写一个从“两端”都能工作的库,我会怎么做?通常在Clojure/ClojureScript中开发时,你会使用一个插件,允许通过“project.clj”配置CLJS编译器,以及可以在Clojure和ClojureScript之间重用名称空间的位置。当然:“请记住,由于Clojure和ClojureScript都将使用名称空间,因此它只需要使用两种语言提供的功能子集”OK。所以,如果我用project.clj编写了一个库,它指向一个交叉名称空间,其中包含了我的所有代码,那么这个库可以从Clojure和ClojureScript中工作?如果是这样,为什么jayq的项目中没有任何内容。clj?正确。假设新库文件位于
:source dir
/
:extra classpath dirs
+中,则它们位于“ClojureScript”支持的功能子集中。此外,从Clojure 1.8(2016)开始,如果库编写者将其源文件命名为“.cljc”而不是“.clj”,则可以直接使用库“.clj”文件(例如,
lein cljsbuild
更容易管理类路径和监视更改),而不必构建新的库“jar”。请参阅发行说明。cljc文件应该主要使用可移植语言功能,但可以在需要的地方提供JVM/JS/CLR变体。总之,clojure.data.json是JVM程序的一种解药,这些程序必须跳转才能读取json。浏览器本机读取JSON;不需要这样的图书馆。您可以使用ClojureScript的JS互操作来读写JSON。
The required namespace "clojure.data.json" is not available, it was required by "bharati/binita/frontend/demo3/main.cljs".
"clojure/data/json.clj" was found on the classpath. Should this be a .cljs file?