2014-11-14 84 views
7

我已經構建了一個主要使用Angular的應用程序。現在我想將這個項目轉換成Clojurescript。我們都知道Clojurescript與JavaScript有很好的互操作性,但是用其他方法可行嗎?Clojurescript與JavaScript的互操作性

常規JavaScript/Angular代碼如何利用從Clojurescript生成的JavaScript?

這個夢想是在clojurescript中編寫新的特性,並讓它們與遺留代碼並行工作。

有關這方面的任何提示或技巧值得歡迎。

+3

一個很好的博客文章http://www.spacjer.com/blog/2014/09/12/clojurescript-javascript-interop/ – archie 2014-11-14 17:27:25

回答

12

Clojurescript變量,函數和deftypes /記錄是正常的JS變量,函數和構造函數/對象,所以你可以去你的javascript中的cljs.core.abc()並調用clojurescript沒有問題。

注意事項有:

  1. 名稱改寫(munging)。 Clojurescript名稱允許比javascript更廣泛的字符,所以很多函數名稱將被消除。例如。 cljs.core/<變成cljs.core._LT_
  2. 宏。宏只存在於clojurescript編譯時,所以你不能使用javascript中的CLJS宏。
  3. 高級編譯。 Clojurescript核心非常龐大,它依靠Google Closure編譯器來消除死代碼,只有在高級編譯中才能使用它。在純粹的clojurescript代碼中,安全地使用高級編譯非常容易,but harder in javascript code。 (最大的危險是混合字符串和符號屬性訪問。)

你有多種選擇:

  • CLJS嵌入遺留代碼作爲一個庫。您的程序入口點是CLJS,但使用您的遺留代碼,如外部庫。您的遺留代碼爲CLJS調用您的遺留代碼提供了一個外部。傳統代碼只調用使用^:export(如果您定義名稱)或類似goog.exportSymbol顯式導出的CLJS函數。 CLJS和遺留代碼部署在單獨構建的單獨JS文件中。
  • CLJS直接嵌入遺留代碼。程序入口點是CLJS,但您的遺留代碼是其他js編譯到同一個項目中。 CLJS和遺留代碼部署在由clojurescript編譯器構建的單個JS文件中。要使用高級編譯,您的遺留代碼必須可以安全地用於高級編譯,並且可以與Google Closure編譯器(goog.provides/require,type annotations等)結合使用。 Angular可能必須保持獨立,但有一個angular extern available
  • 傳統代碼將CLJS代碼作爲庫調用。這與「CLJS將遺留代碼作爲庫嵌入」非常相似,除了您的入口點是遺留代碼並且它調用了導出的cljs函數。
  • 傳統代碼使用一些CLJS功能通過庫,如mori。這裏你不直接使用CLJS,而是一個JS庫,它將clojurescript的一些特性公開爲普通的JS。它仍然是一個單獨的js庫,並且你從不寫任何clojurescript。
+0

謝謝你的徹底破敗。它讓我更好地瞭解可行的選擇。作爲一個後續問題:Mori在瀏覽器中是否適合數據量大的應用?我在談論速度還是會比直接去Cljs慢? – droidballoon 2014-11-14 21:12:47

+1

森*是* clojurescript,只是包裝很好,從js使用。與數據結構無關的cljs中的東西通過無效代碼消除自動刪除。所以沒有速度差異。 Facebook有一個ImmutableJs庫,其目的與Mori類似,但是根本不與cljs共享代碼。它的速度也是可比的。 – 2014-11-15 15:28:21

1

對於ClojureScript中的角度集成,您可以使用the gyr extension。 對於從Clojure類型到Java腳本類型的數據轉換,您可以使用clj->js

+0

不錯。必須仔細檢查。 – droidballoon 2014-11-17 07:59:19