2

我在获取一个简单的 clojurescript 程序以在高级模式下正确编译时遇到问题。例如,这是一个简单的程序

(ns cljs-basics.core)

(.write js/document "hello, cljs")

(def basicsApp (.module js/angular "basics" (array)))

(def testController 
  (.controller basicsApp "TestCtrl" (fn [$scope])))
(aset testController "$inject" (array "$scope"))

和html文件:

<!doctype html>
<html ng-app="basics" lang="en">
<head>
    <meta charset="utf-8">
    <title>Simple CLJS</title>
    <script src="components/angular/angular.js"></script>
    <script src="js/basic.js"></script>
</head>
<body ng-controller="TestCtrl">
    {{testvar}}
</body>
</html>

代码在 :simple 上运行良好,但是当我打开 :advanced 时,它就不起作用了。和调用被编译为符号.controller.module所以我得到

Uncaught TypeError: Object #<Object> has no method 'Uf' basic.js:5105
Uncaught Error: No module: basics 

有没有办法以某种方式包含 angular.js 文件,以便编译器可以将所有内容一起缩小?

4

3 回答 3

2

如果包含适当的 'externs' 文件, :advanced 模式编译不会重命名外部库中定义的符号。可以在以下位置找到 angular 的 externs 文件:

https://code.google.com/p/closure-compiler/source/browse/contrib/externs/angular.js

如果您使用 cljsbuild,Leiningen 编译器配置如下所示:

:cljsbuild {
    :builds [
        {
            :source-paths ["src"]
            :compiler {
                :output-to "target/main.js"
                :optimizations :advanced
                :externs ["externs/angular.js"]
            }
        }
    ]
}
于 2013-07-17T15:52:58.280 回答
1

Angular 还不支持高级编译。但他们正在努力。

于 2013-04-10T13:23:01.243 回答
0

有趣的是,库本身可以用作外部文件,因为所有 Closure 编译器关心的外部文件都是已定义的符号(普通的 javascript 对象和其中的符号 - 属性、方法和嵌套对象)。

另外,我创建了一个库来帮助避免编写外部文件: https ://github.com/myguidingstar/fence

于 2014-11-29T09:56:48.860 回答