在高级模式下编译clojurescript和angularjs



我有一个简单的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文件,以便编译器可以将所有内容缩小在一起?

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

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"]
            }
        }
    ]
}

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

一个有趣的事情是库本身可以用作外部文件,因为所有闭包编译器关心的外部文件是定义符号(普通javascript对象及其内部的符号-属性,方法和嵌套对象)。

同时,我做了一个库来帮助避免写外部文件:https://github.com/myguidingstar/fence

最新更新