Clojurescript与JavaScript的互操作性

时间:2014-11-14 16:57:26

标签: angularjs clojurescript

我已经构建了一个主要使用Angular的应用程序。现在我想将项目转换为Clojurescript。我们都知道Clojurescript与JavaScript的互操作非常好,但是反过来可行吗?

常规JavaScript / Angular代码如何利用Clojurescript生成的JavaScript?

梦想是在clojurescript中编写新功能,让它们与遗留代码并行工作。

欢迎任何关于此的提示或技巧。

2 个答案:

答案 0 :(得分:13)

Clojurescript变量,函数和deftypes /记录是正常的JS变量,函数和构造函数/对象,因此您可以在javascript中使用cljs.core.abc()并调用clojurescript而不会出现问题。

警告是:

  1. 名字改变。 Clojurescript名称允许比javascript更广泛的字符,因此许多函数名称将被释放。例如。 cljs.core/<变为cljs.core._LT_
  2. 宏。宏仅存在于clojurescript编译时,因此您无法使用javascript中的CLJS宏。
  3. 高级编译。 Clojurescript核心非常大,它依赖于Google Closure编译器来消除死代码,这只能在高级编译中使用。在纯粹的clojurescript代码but harder in javascript code中,使用高级编译非常容易。 (最大的危险是混合字符串和符号属性访问。)
  4. 您有多种选择:

    • CLJS将遗留代码嵌入为库。您的程序入口点是CLJS,但使用您的遗留代码,如外部库。您的遗留代码为CLJS调用遗留代码的位置提供了外部代码。传统代码仅调用使用^:export(如果您定义名称)或类似goog.exportSymbol显式导出的CLJS函数。 CLJS和遗留代码部署在单独构建的独立JS文件中。
    • CLJS直接嵌入遗留代码。程序入口点是CLJS,但您的遗留代码是编译到同一项目中的其他js。 CLJS和遗留代码部署在由clojurescript编译器构建的单个JS文件中。要使用高级编译,您的遗留代码必须安全地与高级编译一起使用,并且结构化以与Google Closure编译器一起使用(goog.provides / requires,type annotations等)。 Angular可能必须保持独立,但有一个angular extern available
    • 旧版代码将CLJS代码称为库。这与&#34基本相同; CLJS将遗留代码作为库嵌入,&#34;除了你的入口点是遗留代码,它调用导出的cljs函数。
    • 旧版代码通过mori等库使用一些CLJS功能。这里你没有直接使用CLJS,而是一个JS库,它将clojurescript的一些功能公开为普通的JS。它仍然是一个单独的js库,你永远不会写任何clojurescript。

答案 1 :(得分:1)

对于ClojureScript中的Angular集成,您可以使用the gyr extension。 对于从Clojure类型到Java Script类型的数据转换,您可以使用clj->js