许多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/
中的几十个文件。这不是编译器的用途吗?我只是不明白为什么它需要包含在页面中。
答案 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"]}}]}