5

我正在尝试编译我们使用 lein-cljsbuild 拥有的一些 JS 库,以将它们集成到我们的 ClojureScript 代码库中。首先,我在每个文件的顶部添加了一些 goog.provide,这些文件根据它们的命名空间(就像在 Java 中一样)在目录树中分层组织。那就是命名空间 abc 在 src-js/libs/a/b/c.js

我已将 JS 文件放在 src-js/libs 中项目的根目录中,并且我有以下 : lein-cljsbuild 的编译器选项:

{:id "prod",
 :source-paths ["src-cljs" "src-js"]
 :compiler
 {:pretty-print false,
  :libs ["libs/"]
  :output-to "resources/public/js/compiled-app.js",
  :optimizations :simple}}

没有任何 JS 文件被编译到已编译的应用程序文件中。怎么了?

我还尝试将它们放入 resources/closure-js/libs 中,但没有成功。

我正在使用 lein-cljsbuild 0.3.0。

4

1 回答 1

4

首先,与某些文本中建议的不同,您不需要在 project.clj 的任何类路径配置语句中包含您的私有闭包库位置。因此,除非您的“source-paths:”语句中包含的“src/js”目录用于其他目的,否则您可以将其删除。

其次,为了引入您的私有闭包代码,唯一要添加到您的 project.clj 的是您所做的“libs:”引用;但与您输入的内容不同,该引用必须指向特定的 *.js 文件(或多个文件),而不仅仅是目录。因此,如果您要使用的库位于名为 test.js 的文件中并且位于 /src/js 目录中,则您的 libs: 条目将为:“src/js/test.js”。如果您想使用该插件的默认 :libs 目录选项,请参阅 cljs-build 发行说明。

第三,(看起来您已经知道这一点,但这让我感到困惑)如果您使用的是浏览器支持的 REPL(cljsbuild 的 repl-listen 选项),您仍然无法加载/引用/使用来自该 REPL 的私有库资产,直到您在已编译的 app.js 的源代码中的某处包含 :require 语句(例如“(ns testing (:require [myprivatelib]))”),然后您必须重新编译(lein cljsbuild once)并重新加载您的浏览器页面,其中包含指向已编译应用程序.js 的链接。这带来了该代码库。否则,你的浏览器 REPL 会一直坚持你的闭包库中提供的命名空间没有定义。

我希望这有帮助。

于 2013-03-25T18:47:27.283 回答