如何在ClojureScript中使用“外部”的JavaScript依赖?

3
我正在尝试理解如何在Clojurescript中使用"外部"JavaScript依赖项。我已经阅读了谷歌关于这个主题的大部分内容,但我仍然无法理解这个过程。特别是,我想知道如何从Clojurescript依赖jsonld.js库。
我还有一些问题:
  1. 您将:foreign-libs放入deps.cljs还是编译器选项(例如project.clj中的:compiler映射)中?

  2. :foreign-libs中的:file值是否被解释为Java资源?您将用作外部库的JavaScript文件放在哪里?我尝试将它们放入resources和其他地方,但所有尝试都导致java.lang.NullPointerException

重现步骤:
# Create an empty Clojurescript project
lein new figwheel jsonld

# Download jsonld.js library
cd jsonld/resources
curl -O http://cdnjs.cloudflare.com/ajax/libs/jsonld/0.3.15/jsonld.js

# Configure foreign libs in project.clj.
# Add the following into `:compiler` in the dev build:
# :foreign-libs {:file "resources/jsonld.js"
#                :provides ["jsonld"]}

lein figwheel # => java.lang.NullPointerException

或者,如果我提供以下内容的deps.cljs

{:foreign-libs {:file "jsonld.js"
                :provides ["jsonld"]}}

然后Figwheel启动,但是当我调用(require '[jsonld])时,会出现以下错误:

WARNING: JavaScript file found on classpath for library `jsonld`, but does not contain a corresponding `goog.provide` declaration
clojure.lang.ExceptionInfo: No such namespace: jsonld, could not locate jsonld.cljs, jsonld.cljc, or Closure namespace "jsonld" {:tag :cljs/analysis-error}
1个回答

1
更新: :foreign-libs 选项接受一个外部库的向量而不是单个映射。 :foreign-libs 选项可以直接提供给编译器,也可以通过 jars 中的 deps.cljs 文件提供。当您想要将 JavaScript 库打包到其他人可能使用的 jar 中时,deps.cljs 很有用,但现在不是你需要的。

您可以在wiki中找到更多关于编译器选项的信息。还有一个专门介绍在 ClojureScript 中使用/打包外部依赖项的页面

我认为在你的特定示例中,问题是你提供的:file路径。该路径是相对于类路径的,而resources/目录的内容被添加到类路径中,这意味着如果你想以类路径相关方式指向resources/jsonld.js,只需使用jsonld.js即可。
PS:您也可以提供URL作为:file,编译器将为您下载它们。

由于我在堆栈跟踪中看到了 clojure.java.io/resource,导致了 java.lang.NullPointerException,因此我尝试仅将 :file 提供为 jsonld.js。然而,以这种方式引发了相同的异常。 - Jindřich Mynarz
:file 中使用 jsonld.js 库的 URL 会导致相同的异常(堆栈跟踪:https://gist.github.com/jindrichmynarz/ab0e532e94a6353f9f28)。 - Jindřich Mynarz
1
嘿,它是:foreign-libs [{:file ...}] - 注意向量! - Martin Klepsch
你说得对。然而,这只是将我移动到另一个堆栈跟踪:https://gist.github.com/jindrichmynarz/78411164cad89376bfa3。你知道这里发生了什么吗? - Jindřich Mynarz
1
这似乎是 figwheel 的问题。我建议您在 clojurians.net slack 团队的 #figwheel 频道中添加一个新问题或提问。不幸的是,我自己对 figwheel 不太了解。 - Martin Klepsch
不幸的是,即使在没有Figwheel的情况下(使用Leiningen mies模板),仍然存在相同的问题,因此该问题并非特定于Figwheel。 - Jindřich Mynarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接