实际上,除了Scala.js和JScala之外还有更多工具,但Scala.js和JScala确实是两个仍在积极开发中的工具。
它们之间的区别是根本性的:Scala.js是从Scala到JavaScript的编译器,而JScala是用于生成JavaScript代码片段的基于宏的DSL。
正如@Gaurav在他的答案中解释的那样,Scala.js是常规Scala编译器,但它将其输出为JavaScript代码而不是JVM字节码。您编写的Scala代码永远不会由JVM运行。所有您的Scala代码都被翻译成JavaScript。因此,它支持整个Scala语言,包括例如集合库。这对于将整个客户端作为Scala应用程序编写非常有用。
另一方面,使用JScala,至少在调用javascript
宏之外的大部分应用程序仍在JVM上运行。该宏将其中的Scala-looking代码重写为相应的JavaScript AST(或直接作为代码字符串)。这意味着当JVM执行代码时,该程序会动态生成一个JavaScript AST/字符串。这对于生成要动态发送到客户端的代码片段非常有用。
因此,主要的决策标准是:
有关这两个工具的更详细比较可在http://www.sebnozzi.com/84/scala-to-javascript-comparison/上找到。
js-scala是一个Scala库,用于生成JavaScript代码,而scala.js是Scala编译器的JavaScript后端。
scala.js将您的Scala代码编译为JavaScript代码。它只是通常的Scala编译器,它接受您的Scala源文件并生成JavaScript代码,而不是JVM字节码。
.scala| === scalac ===> | .js
另一方面,js-scala是一个Scala库,提供可组合的JavaScript代码生成器。您可以在通常的Scala程序中使用它们来编写JavaScript程序生成器。使用通常的Scala编译器将您的Scala程序编译为JVM字节码,并执行此程序会生成JavaScript程序。
.scala| === scalac ===> |.class | === java ===> | .js
如需更多详细信息,建议阅读js-scala作者之一的博客http://julien.richard-foy.fr/blog/2013/12/19/js-scala-and-scala-js/