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

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


person robertjlooby    schedule 24.09.2013    source источник
comment
компиляция Clojurescript с модулями Google Closure разделяет вывод оптимизированной сборки в несколько файлов javascript. Возможно, это та функциональность, которую вы ищете?   -  person Terje Norderhaug    schedule 12.12.2015


Ответы (2)


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

«Правильный» способ решить вашу проблему - создать два вывода, которые используются изолированно: файл main.js для запуска вашего приложения и файл spec.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"}}]})

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

person Stephen Nelson    schedule 20.10.2013

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

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

person Jared314    schedule 24.09.2013
comment
Проблема с использованием расширенного режима заключается в том, что Javascript в main.js и mainSpec.js будет конфликтовать, поскольку Google Closure использует искажение имен при компиляции в расширенном режиме. - person yazz.com; 04.10.2013