Несколько файлов 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
строить.