4

我有一个使用 Jasmine 测试 JavaScript 的项目。我正在尝试切换到使用 ClojureScript 作为前端。我project.clj的就像

(defproject myproject "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/clojurescript"0.0-1889"]
                 [org.clojure/google-closure-library-third-party "0.0-2029"]
                 [domina "1.0.0"]
                 [hiccups "0.2.0"]]
  :plugins [[lein-cljsbuild "0.3.3"]]
  :cljsbuild {
              :builds [{
                        :source-paths ["src/clojurescript"]
                        :compiler {
                                   :output-to "public/javascripts/main.js"
                                   :optimizations :whitespace
                                   :pretty-print true}}
                       {
                        :source-paths ["spec/clojurescript"]
                        :compiler {
                                   :output-to "spec/javascripts/mainSpec.js"
                                   :optimizations :whitespace
                                   :pretty-print true}}]})

因此,所有.cljs文件都src/clojurescript被编译为main.js,所有文件.cljsspec/clojurescript被编译为mainSpec.js. 当我加载 Jasmine 页面时,两个.js文件都已加载,但测试未运行。在控制台中,我得到Error: Namespace "goog.debug.Error" already declared. 两个.js文件在顶部都有相同的 ~30k 行 google 关闭代码,这导致了错误。如果我从中删除此代码mainSpec.js运行良好。有没有办法告诉 cljsbuild 将此代码从规范文件中删除?

4

2 回答 2

1

正如 Jared314 和 Zubair 所指出的,您遇到的问题是由于试图在同一页面中包含两个 clojurescript 编译输出而引起的。Clojurescript/Google Closure 期望做一个 'whole-world' 编译,即编译器期望整个页面的所有代码都传递给编译器,以便它可以优化它,重命名函数,并最终吐出一个单个 javascript 文件。它的设计目的不是生成可以一起工作的多个输出文件。

解决问题的“正确”方法是生成两个单独使用的输出:一个用于运行应用程序的 main.js 文件,以及一个包含 main 中的所有代码以及用于测试的规范中的代码的 spec.js 文件. 您可以通过设置您的项目来做到这一点,如下所示:

:cljsbuild {
          :builds [{
                    :source-paths ["src/clojurescript"]
                    :compiler {:output-to "public/javascripts/main.js"}}
                   {
                    :source-paths ["src/clojurescript" "spec/clojurescript"]
                    :compiler {:output-to "spec/javascripts/spec.js"}}]})

您的 jasmine 页面应该引用 spec.js 而不是 main.js - 引用两者是您的错误的原因。

于 2013-10-20T22:43:04.910 回答
0

问题是两个版本都是使用包含的 Google Closure 库编译的,因此出现“已声明”错误。您可以尝试:optimizations :advanced:compiler选项中使用 来减少或消除重复代码。

但是,如果您仍然遇到同样的问题,您可能希望将srcandspec一起编译以进行mainSpec.js构建。

于 2013-09-24T23:55:29.740 回答