Несколько файлов ClojureScript на одной странице

У меня есть проект, который использует Жасмин для тестирования 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 и все .cljs в spec/clojurescript быть скомпилированным в mainSpec.js, Когда я загружаю страницу Жасмин, оба .js файлы загружены, но тесты не запускаются. В консоли я получаю Error: Namespace "goog.debug.Error" already declared.Оба .js файлы имеют одинаковые ~30 тыс. строк кода закрытия Google в верхней части, что вызывает ошибку. Если я удалю этот код из mainSpec.js работает нормально. Есть ли способ сказать cljsbuild, чтобы оставить этот код вне спецификации?

2 ответа

Решение

Как указали Jared314 и Zubair, проблема, с которой вы сталкиваетесь, вызвана попыткой включить два вывода компиляции clojurescript на одной странице. Clojurescript/Google Closure ожидают компиляции "всего мира", то есть компилятор ожидает, что весь код всей страницы передается компилятору, чтобы он мог оптимизировать его, переименовать функции и, в конечном итоге, выплюнуть один файл JavaScript. Он не предназначен для создания нескольких выходных файлов, которые работают вместе.

"Правильный" способ решения вашей проблемы заключается в создании двух выходных данных, которые используются изолированно: файл main.js для запуска вашего приложения и файл spec.js, который включает весь код в main и код в spec для тестирования., Вы можете сделать это, настроив свой проект примерно так:

: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"}}]})

Ваша страница с жасмином должна ссылаться на spec.js, но не на main.js - ссылка на оба является причиной вашей ошибки.

Проблема заключается в том, что обе сборки компилируются с включенной библиотекой Google Closure, поэтому возникает ошибка "уже объявлено". Вы можете попробовать использовать :optimizations :advanced, в :compiler варианты, чтобы уменьшить или устранить дублирующийся код.

Но, если вы все еще сталкиваетесь с той же проблемой, вы можете скомпилировать src а также spec вместе для mainSpec.js строить.

Другие вопросы по тегам