Автоматическое создание файлов Clojurescript для приложения Compojure

У меня есть веб-приложение, в котором я использую Compojure на сервере и Clojurescript на клиенте. Я использую плагин leing-cljsbuild для автоматической компиляции файлов cljs в js.

Я могу генерировать необходимые файлы на стороне клиента и загружать их в браузер, когда я устанавливаю оптимизацию на :whitespace или :simple, но когда я устанавливаю для оптимизации значение none, файлы js ссылаются на свои зависимости, используя путь локальной файловой системы, который приводит к тому, что файлы вообще не загружаются в браузере.

Итак, мой вопрос заключается в том, как заставить сгенерированные файлы использовать URL-адреса сервера вместо локальных путей к файлам, когда они генерируются компилятором clojurescript.

Вот мой файл project.clj

(defproject my-proj-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"

  :dependencies [[org.clojure/clojure "1.5.1"]
                 [compojure "1.1.6"]
                 [org.clojure/tools.nrepl "0.2.3"]
                 [hiccup "1.0.3"]
                 [com.novemberain/monger "1.5.0"]
                 [org.clojure/clojurescript "0.0-2127"]
                 [jayq "2.5.0"]
                 ]

  :plugins [[lein-ring "0.8.8"]
            [lein-cljsbuild "1.0.1"] 
            ]

  :ring {:handler my-proj-clj.handler/app
                   }

  :cljsbuild { :builds 
              [{
                :source-paths ["src/my-proj-clj"]
                :compiler {
                           :output-dir "./resources/public/js"
                           :output-to "./resources/public/js/cljs-file.js"  
                           :pretty-print true
                           :source-map "./resources/public/js/cljs-file.js.map"
                           :optimizations :none
                           }}]}  

  :profiles {:dev {:dependencies [[javax.servlet/servlet-api "2.5"]]}}

person jack the lesser    schedule 04.01.2014    source источник
comment
Я не занимаюсь CLJS, но мне кажется, что исходная карта для сопоставления предварительно скомпилированного кода с скомпилированным кодом и не имеет ничего общего с URL-адресами внутри кода.   -  person Shepmaster    schedule 04.01.2014
comment
Да, прости. У меня исходные карты работают нормально, только когда я устанавливаю оптимизацию на :none, у меня возникают проблемы.   -  person jack the lesser    schedule 05.01.2014


Ответы (2)


Я считаю, что единственными допустимыми значениями оптимизации являются :whitespace, :simple или :advanced. См. строку 96 на странице https://github.com/emezeske/lein-cljsbuild/blob/1.0.1/sample.project.clj.

Таким образом, я бы использовал :whitespace в качестве уровня оптимизации (по крайней мере, чтобы что-то заработало).

Согласно вашему сообщению, уровень оптимизации :whitespace работает? Таким образом, возможно, вы можете уточнить.

Каких результатов вы ожидаете от уровня оптимизации ":none". Как ваш ожидаемый результат отличается от того, что дает уровень оптимизации :whitespace?

Уровень оптимизации :none означает, что cljsbuild не генерирует js из вашего исходного кода cljs (он будет генерировать несколько операторов goog.include, но больше ничего). Попробуйте использовать интерактивную реплику, чтобы помочь вам создать прототип. Попробуйте запустить следующее: lein trampoline cljsbuild repl-rhino

Надеюсь, это поможет.

person lorinpa    schedule 05.01.2014
comment
В то время как :whitespace работает, время компиляции составляет около 7 секунд, тогда как с :none компиляция заняла менее 1 секунды, поэтому я стремлюсь ускорить разработку. - person jack the lesser; 06.01.2014
comment
Запустите lein cljsbuild auto во время редактирования исходных файлов cljs. Это ускорит процесс разработки. Пожалуйста, рассмотрите возможность редактирования исходного сообщения. Ваша проблема не выглядит так, как будто файлы ссылаются на свои зависимости, используя путь локальной файловой системы? Если это так, пожалуйста, опубликуйте пример? Ваша проблема заключается в ускорении процесса разработки, верно. Не генерация ссылок на файлы? - person lorinpa; 06.01.2014
comment
Я использую lein cljsbuild auto для компиляции файлов cljs (компиляция по-прежнему занимает около 6 секунд, когда для оптимизации установлено значение :whitespace или :simple и т. д.). Эти две проблемы взаимосвязаны, когда для оптимизации установлено значение :whitespace, выходной файл js правильно устанавливает путь сервера к своим зависимостям (файлы закрытия, файлы cljs моего проекта и т. д.). Однако, когда я устанавливаю его: none, кажется, что при создании файлов cljs используются локальные пути к файлам, такие как (../../my-cljs-file.cljs). - person jack the lesser; 06.01.2014
comment
Оптимизация на :none означает, что cljsbuild не генерирует js из вашего источника cljs. Сравните вывод командной строки и js между двумя уровнями opt. Сделайте чистку lein cljsbuild между сборками (что гарантирует свежий вывод). Если вы хотите создать прототип своего кода cljs, попробуйте запустить repl с помощью: lein trampoline cljsbuild repl-rhino. Надеюсь, это поможет. - person lorinpa; 06.01.2014
comment
Я запустил lein cljsbuild clean, а затем с оптимизацией, установленной на :none, затем я запустил lein cljsbuild auto. Файлы cljs компилируются в соответствующие файлы js. Единственный выходной файл имеет несколько обязательных вызовов для других зависимостей, а также для моего сгенерированного файла js. К сожалению, он использует локальные пути к файлам, например, goog.addDependency("../clojure/string.js", ['clojure.string'], ['cljs.core', 'goog.string', 'goog.string.StringBuffer']); goog.addDependency("../cljs/reader.js", ['cljs.reader'], ['cljs.core', 'goog.string']); - person jack the lesser; 07.01.2014

У меня примерно такие же настройки, оптимизация установлена ​​на :none, сгенерированные файлы используют локальные пути. Однако браузер загружает скрипты.

У меня есть это в index.html:

<script src="js/development/goog/base.js" type="text/javascript"></script>
<script src="js/development/main.js" type="text/javascript" ></script>
<script type="text/javascript">goog.require("ixtlan.core");</script>

это в project.clj:

:cljsbuild {
  :builds [{:id "dev"
    :source-paths ["src/cljs"]
    :compiler {
      :output-to "resources/public/js/development/main.js"
      :output-dir "resources/public/js/development"
      :optimizations :none
      :source-map true}}
          ...

и маршруты содержат:

(defroutes routes
  (GET "/" [] (index))
    (route/files "/" {:root "resources/public"}))

Надеюсь это поможет.

person 0rca    schedule 11.04.2014