我遇到了一个简单的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>
代码运行正常:简单但是当我打开时:高级,它只是不起作用。 .controller
和.module
调用会被编译为符号,因此我得到了
Uncaught TypeError: Object #<Object> has no method 'Uf' basic.js:5105
Uncaught Error: No module: basics
有没有办法以某种方式包含angular.js文件,以便编译器可以将所有内容缩小在一起?
答案 0 :(得分:2)
如果包含相应的“外部”文件,则:高级模式编译不会重命名外部库中定义的符号。角度的外部文件可以在以下位置找到:
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"]
}
}
]
}
答案 1 :(得分:1)
Angular尚不支持高级编译。但他们正在研究它。
答案 2 :(得分:0)
有趣的是库本身可以用作extern文件,因为所有Closure编译器都关心extern文件是定义的符号(普通javascript对象及其中的符号 - 属性,方法和嵌套对象)。
另外,我创建了一个有助于避免编写extern文件的库: https://github.com/myguidingstar/fence