【问题标题】:Creating & using libraries in both Clojure and ClojureScript在 Clojure 和 ClojureScript 中创建和使用库
【发布时间】:2013-03-27 13:03:18
【问题描述】:

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

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

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    有一些 ClojureScript differences from Clojure.

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

    (defproject xyz/xyz "0.1.0-SNAPSHOT"
      :dependencies [[clj-time "0.4.3"]
                     [jayq "2.2.0"]
                      ....
    

    然后在 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.walk
    • clojure.zip
    • clojure.core.reducers
    • fold 当前是 reduce 的别名
    • core.match
    • core.logic(工作中)

    其他 Clojure 库必须符合 ClojureScript 子集才能在 ClojureScript 中工作。

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

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

    【讨论】:

    • 谢谢。那么当我将 jayq 添加到我的 project.clj 文件时,编译器如何知道它是 ClojureScript?我看到 jayq 自己的项目文件几乎是空的:github.com/ibdknox/jayq/blob/master/project.clj 那么它是如何说明的呢?
    • 另外,作为上述的扩展,如果我想编写一个从“两端”工作的库,我该怎么做?
    • 通常在 Clojure/ClojureScript 中开发时,您会使用一个 lein-cljsbuild 插件,该插件允许通过“project.clj”配置 CLJS 编译器,以及 share code,您可以在 Clojure 之间重用命名空间和 ClojureScript。当然:“请记住,由于 Clojure 和 ClojureScript 都将使用命名空间,因此它只需要使用两种语言提供的功能子集”
    • 好的。因此,如果我编写了一个带有 project.clj 的库,该库指向一个包含我所有代码的交叉命名空间,那么该库是否可以在 Clojure 和 ClojureScript 中运行?如果是这样,为什么 jayq 的 project.clj 中没有任何内容?
    • 正确。假设一个新的库文件位于:source-dir/:extra-classpath-dirs + 它们在“ClojureScript”支持的功能子集中。也可以先尝试,不要构建新的库“jar”,而是直接使用库“.clj”文件(例如,lein-cljsbuild 更容易管理类路径和监视更改)
    【解决方案2】:

    我看到答案是在 2013 年给出的,但截至 2020 年,CLJS version 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 的替代库之外,我看不到任何解决方案。

    【讨论】:

    • 自 Clojure 1.8 (2016) 以来,如果库编写者将其源文件命名为“.cljc”而不是“.clj”,则该库可用于 Clojure 的所有变体。请参阅发行说明github.com/clojure/clojure/blob/clojure-1.8.0/changes.md。 cljc 文件应该主要坚持可移植的语言特性,但可以在需要的地方提供 JVM/JS/CLR 变体。
    • 不管怎样,clojure.data.json 是 JVM 程序的良药,因为 JVM 程序必须跳过障碍才能读取 JSON。浏览器原生读取 JSON;不需要这样的图书馆。您可以使用 ClojureScript 的 JS 互操作来读写 JSON。
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多