将Scala转变为Javascript的编译器:Scala.js
jopen
10年前
Scala.js是一个将Scala转变为Javascript的编译器。允许你完全使用Scala开发Web应用程序。
特性:
- Support all of Scala (including macros!), modulo a few semantic differences
- Very good interoperability with JavaScript code. For example, use jQuery and HTML5 from your Scala.js code, either in a typed or untyped way. Or create Scala.js objects and call their methods from JavaScript.
- Integrated with sbt (including support for dependency management and incremental compilation)
- Can be used with your favorite IDE for Scala
- Generates Source Maps for a smooth debugging experience (step through your Scala code from within your browser supporting source maps)
- Integrates Google Closure Compiler for producing minimal code for production. Compiled blobs range from 170-400kb
- Produces (very) efficient JavaScript code (benchmarks)
面向Scala.js编写的Scala代码可以与现有的JavaScript代码交互,既支持动态类型方式,又支持静态类型方式。前者更为灵活:可以访问全局窗口(window)对象,可以存取任何属性,还可以调用任何方法。不过Scala的静态类型特性没有得到应用。作为选择,可以提供JavaScript库的类型签名。比如对jQuery而言,就是提供如下信息:
利用这些类型信息,编译器可以进行类型检查,而IDE可以提供代码补全功能。现有库的类型签名仍然需要手工编写,但是Scala.js的作者正在研究,对于TypeScript拥有签名信息的所有库,能否利用TypeScript的签名自动生成这里需要的信息。Scala.js还有一个问题,Scala标准库在使用Google Closure编译器进行最小化处理后还有16MB,未来还需要进一步缩减。
下面是在Scala.js中使用jQuery是一个例子,这里使用id“button”在按钮上绑定了单击处理程序,单击之后,它会将id“pane”这个div后面附加上一段标记:
jQuery("#button").click { () => val paragraph = jQuery("<p>").html("Hello World!") jQuery("div#pane").append(paragraph) }
从JavaScript中调用Scala生成的代码也是可能的。该编译器会为编译的代码生成源代码映射信息(source maps),因此栈跟踪会指向原始Scala代码中的位置,而非指向生成的JavaScript。