2013-09-24 1 views
4

У меня есть проект, который использует Jasmine для проверки JavaScript. Я пытаюсь переключиться на использование ClojureScript для переднего конца. Мой project.clj подобенНесколько файлов ClojureScript на одной странице

(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 имеют те же самые ~ 30k строки кода закрытия google вверху, что вызывает ошибку. Если я удалю этот код с mainSpec.js, он работает нормально. Есть ли способ сказать cljsbuild оставить этот код вне спецификационного файла?

+0

[Компиляция Clojurescript с модулями закрытия Google] (https://swannodette.github.io/2015/02/23/hello-google-closure-modules/) разбивает выходные данные оптимизированной сборки на несколько файлов javascript. Возможно, это функциональность, которую вы ищете? –

ответ

1

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

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

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

0

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

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

+1

Проблема с использованием расширенного режима заключается в том, что Javascript в main.js и mainSpec.js столкнется, поскольку Google Closure использует перехват имен при компиляции в расширенном режиме – Zubair

 Смежные вопросы

  • Нет связанных вопросов^_^