Clojurescript与JavaScript的互操作性

dro*_*oon 10 clojurescript angularjs

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

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

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

有关这方面的任何提示或技巧都是受欢迎的.

Fra*_*ila 14

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

注意事项是:

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

你有很多选择:

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

  • Mori*是*clojurescript,只是很好地打包用于js.通过消除死代码自动删除与数据结构无关的cljs中的东西.所以没有速度差异.Facebook有一个库ImmutableJs,其目的与Mori相似,但根本不与cljs共享代码.它的速度也是可比的. (2认同)