我正在尝试使用"foreign" JavaScript dependencies in Clojurescript来解决问题。我已经阅读了Google在该主题上提供的所有内容,但仍然无法理解该过程。特别是,我对如何依赖Clojurescript中的jsonld.js库感兴趣。

我没有得到一些要点:

  • 您是否将:foreign-libs放入deps.cljs或编译器选项(例如project.clj中的:compiler映射)?
  • :file:foreign-libs的值是否解释为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}
    

    最佳答案

    更新: :foreign-libs选项采用外国库的 vector ,而不是单个 map 。
    :foreign-libs选项可以直接提供给编译器,也可以通过jar中的deps.cljs文件提供给编译器。当您要将Javascript库打包在其他人可以使用的jar中时,deps.cljs最有用-稍后可能有用,但现在不需要。



    我认为在您的特定示例中,问题在于您作为:file提供的路径。路径是相对于classpath的,并且resources/目录的内容已添加到classpath中,这意味着,如果您想以相对于classpath的方式指向resources/jsonld.js,则只是jsonld.js

    PS:您也可以将URL作为:file提供,编译器将为您下载它们。

    关于javascript - 如何在Clojurescript中使用 “foreign” JavaScript依赖项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34352645/

    10-11 05:37