首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一页面上的多个ClojureScript文件

同一页面上的多个ClojureScript文件
EN

Stack Overflow用户
提问于 2013-09-24 16:39:40
回答 2查看 1.6K关注 0票数 4

我有一个用茉莉花来测试JavaScript的项目。我正试图切换到前端使用ClojureScript。我的project.clj就像

代码语言:javascript
复制
(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,而spec/clojurescript中的所有.cljs都被编译成mainSpec.js。当我加载Jasmine页面时,两个.js文件都被加载,但是测试没有运行。在控制台中,我得到一个Error: Namespace "goog.debug.Error" already declared.,两个.js文件的顶部都有相同的30k行谷歌闭包代码,这导致了错误。如果我从mainSpec.js中删除这段代码,它就运行得很好。有没有办法告诉cljsbuild将这些代码从规范文件中删除?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-20 22:43:04

正如Jared314和Zubair所指出的,您所遇到的问题是由于试图在同一个页面中包含两个clojurescript编译输出而造成的。Clojurescript/Google闭包期望做一个“整个世界”的编译,也就是说,编译器希望整个页面的所有代码都传递给编译器,这样它就可以优化它,重命名函数,并最终输出一个javascript文件。它不是为了产生多个一起工作的输出文件而设计的。

解决问题的“正确”方法是产生两个单独使用的输出:一个用于运行应用程序的main.js文件和一个包含主程序中所有代码的spec.js文件,以及用于测试的规范中的代码。您可以通过设置项目来做到这一点,如下所示:

代码语言:javascript
复制
: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 --两者都是导致错误的原因。

票数 1
EN

Stack Overflow用户

发布于 2013-09-24 23:55:29

问题是,这两个构建都包含了Google闭包库,因此出现了“已经声明”的错误。您可以尝试在:optimizations :advanced选项中使用:compiler,以减少或消除重复代码。

但是,如果仍然遇到相同的问题,您可能希望将srcspec一起编译到mainSpec.js构建中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18987333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档