使用 Scala.js 将 Scala 编译为 JavaScript

  • Zef Hemel
  • 臧秀涛

2013 年 6 月 23 日

话题:JavaScriptScala语言 & 开发

在上周的Scala Day上,Sébastien Doeraene演示了 Scala.js,这是一款将 Scala 编译为 JavaScript 的编译器。该编译器支持全部 Scala 语言特性,允许开发者用 Scala 开发从前端到后端的 Web 应用,而且也潜在地带来了在服务器和客户端之间复用代码的可能性。

面向 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。

Scala.js 编译器已基于Scala 许可证发布,可以在github上获取。

查看英文原文:Compile Scala to JavaScript With Scala.js

JavaScriptScala语言 & 开发