2013-04-10 27 views
2

我在使用簡單的clojurescript程序在高級模式下編譯時遇到問題。例如,下面是一個簡單的程序在高級模式下編譯clojurescript和angularjs

(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文件,以便編譯器可以運行如下一切融合在一起?

回答

1

Angular不支持高級編譯。但他們正在努力。

2

如果您包含相應的'extern'文件,那麼高級模式編譯將不會重命名外部庫中定義的符號。該實習醫生文件的角度,可以發現:

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

一個有趣的事情是圖書館本身可以因爲所有關於extern文件的Closure編譯器都是定義符號(純javascript對象及其內部的符號 - 屬性,方法和嵌套對象)。

而且,我做了,幫助避免編寫的extern文件庫: https://github.com/myguidingstar/fence