【问题标题】:Multiple ClojureScript files on same page同一页面上有多个 ClojureScript 文件
【发布时间】:2013-09-24 16:39:40
【问题描述】:

我有一个项目正在使用 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}}]})

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

【问题讨论】:

标签: clojurescript cljsbuild


【解决方案1】:

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

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

: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 - 引用两者都是您的错误的原因。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 使用高级模式的问题是,由于 Google Closure 在高级模式下编译时使用名称修改,main.js 和 mainSpec.js 中的 Javascript 会发生冲突
    猜你喜欢
    • 2011-08-03
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多