理解Clojurescript和Google Closure编译器之间的关系

时间:2014-10-08 09:50:45

标签: javascript google-closure-compiler clojurescript

许多tutorials的脚本标记中包含goog/base.js文件,然后使用goog.require('your_script')启动应用运行。例如,以下是链接教程中HTML文件的标题:

<script type="text/javascript" src="out/goog/base.js"></script>
<script type="text/javascript" src="hello.js"></script>
<script type="text/javascript">goog.require('hello');</script>

据我所知,Google Closure Library用于将Clojurescript编译成Javascript。为什么HTML页面也需要它?它不能将自身(或使用高级编译的必要组件)编译到上面示例中的hello.js中吗?

我真正想要的只是需要一个javascript文件而不是/goog/中的几十个文件。这不是编译器的用途吗?我只是不明白为什么它需要包含在页面中。

1 个答案:

答案 0 :(得分:9)

在编译时,只需要包含goog / base.js标头:​​optimizations:none。

原因:优化:none产生多个文件是因为使用此设置,Google Closure编译器根本不运行。相反,ClojureScript编译器只是将编译后的JavaScript直接写入文件,而不是通过Closure编译器传递它。因此,生成的JavaScript既没有优化也没有多个文件连接成一个JavaScript文件。 ClojureScript第21页还提供了有关此编译模式的讨论:启动和运行(包含第21页的免费样本here

我个人很少使用:优化:无,而是使用:在开发过程中简单,并且:用于生产。

两者:simple和:advanced只生成一个JavaScript文件作为输出,然后只需要一个脚本标记,例如:

  <script src="/js/myapp.js" type="text/javascript"></script>

我在下面提供了一个示例cljsbuild配置:

 :cljsbuild {:builds [{:id "dev"
                       :source-paths ["src"]
                       :compiler {:output-to "resources/static/js-dev/myapp.js"
                                  :output-dir "resources/static/js-dev"
                                  :optimizations :simple
                                  :preamble ["react/react.min.js"]
                                  :externs ["react/externs/react.js"]
                                  :source-map "resources/static/js-dev/myapp.js.map"
                                  :pretty-print true}}

                      {:id "live"
                       :source-paths ["src"]
                       :compiler {:output-to "resources/static/js-live/myapp.js"
                                  :output-dir "resources/static/js-live"
                                  :optimizations :advanced
                                  :pretty-print false
                                  :preamble ["react/react.min.js"]
                                  :externs ["react/externs/react.js"]}}]}