常规JavaScript / Angular代码如何利用Clojurescript生成的JavaScript?
我们的梦想是在clojurescript中编写新功能,并让它们与遗留代码并行工作.
有关这方面的任何提示或技巧都是受欢迎的.
警告是:
>名字改变. Clojurescript名称允许比javascript更广泛的字符,因此许多函数名称将被释放.例如. cljs.core /<成为cljs.core._LT_.
>宏.宏仅存在于clojurescript编译时,因此您无法使用javascript中的CLJS宏.
>高级编译. Clojurescript核心非常大,它依赖于Google Closure编译器来消除死代码,这只在高级编译中可用.在纯粹的clojurescript代码but harder in javascript code中,使用高级编译非常容易.(最大的危险是混合字符串和符号属性访问.)
您有很多选择:
> CLJS将遗留代码嵌入为库.您的程序入口点是CLJS,但使用您的遗留代码,如外部库.您的遗留代码为CLJS调用遗留代码的位置提供了外部代码.传统代码仅调用使用^:export显式导出的CLJS函数(如果您定义名称)或类似于goog.exportSymbol
.CLJS和遗留代码部署在单独构建的单独JS文件中.
> CLJS直接嵌入遗留代码.程序入口点是CLJS,但您的遗留代码是编译到同一项目中的其他js. CLJS和遗留代码部署在由clojurescript编译器构建的单个JS文件中.要使用高级编译,您的遗留代码必须安全地与高级编译一起使用,并且结构化以便与Google Closure编译器一起使用(goog.provides / requires,type annotations等). Angular可能必须保持独立,但有一个angular extern available.
>旧代码将CLJS代码称为库.这与“CLJS将遗留代码作为库嵌入”几乎相同,除了您的入口点是遗留代码并且它调用导出的cljs函数.
>传统代码通过库(如mori)使用一些CLJS功能.这里你没有直接使用CLJS,而是一个JS库,它将clojurescript的一些功能暴露为普通的JS.它仍然是一个单独的js库,你永远不会写任何clojurescript.