2014-11-14 83 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