javascript - Scala.js 运行时编译为 Javascript

标签 javascript scala scala.js runtime-compilation

嘿,大家。我想弄清楚如何在运行时使用 Scala.js 工具将 Scala 表达式编译为 Javascript。作为示例,这是一个简化的设置。

假设我们有一个简单的 DSL,它由 Ctx => Boolean 函数及其 bool 运算组成,如下所示:

implicit class Simple[Ctx](f: Ctx => Boolean) {
  def &&(g: Ctx => Boolean): Ctx => Boolean = ctx => f(ctx) && g(ctx)
  def ||(g: Ctx => Boolean): Ctx => Boolean = ctx => f(ctx) || g(ctx)
  def unary_!: Ctx => Boolean = ctx => !f(ctx)
}

假设我们有一些“构建 block ”被硬编码、编译成 Javascript 并导出,如下所示:

@ExportJSTopLevel("foo") def foo[Ctx](ctx: Ctx): Boolean = ???
@ExportJSTopLevel("bar") def bar[Ctx](ctx: Ctx): Boolean = ???
// and so on

现在可以用这些构建 block 组装简单的 bool 表达式,例如:foo && barfoo || !bar

假设一些持久实体是在运行时创建的,并以此类表达式作为它们的主体。我希望能够将它们编译为 Javascript,作为与上面的构建 block 具有相同签名的函数,这些函数调用这些构建 block 。

我在 Scala.js 工具中的某个地方找到了一些关于名为 ScalaJSOptimizer 的神秘类的在线引用。然而,提供给该类的链接总是被破坏,或者显示它属于最新版本的“scalajs-tools”工件甚至没有的包。

完成我想做的事情的最佳方法是什么?

最佳答案

我也不知道你的最终目标是什么,但如果你真的想在运行时编译 Scala.js,你最好的选择是查看 scalafiddle.io 的源代码,它正是这样做的,并且首先复制它所做的一切,然后从那里更改它。

下面的代码处理从 Javascript 到 Scala.js 的 IR 的编译,然后从 IR 到 Javascript String 的编译:

这里有趣的方法是 compilelink(fastOptJSfullOptJS)和 export 。我知道 StackOverflow 不鼓励外部链接,但代码确实太大且粗糙,不值得在这里内联复制。最好的选择是克隆该存储库,在 IDE 中打开它,然后跳转查看代码如何转换该 Compiler 构造函数中的 Scala.js code: String code> 类,通过所有中间步骤,直到从 export 方法返回的最终 Javascript String

关于javascript - Scala.js 运行时编译为 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572811/

相关文章:

javascript - 对 redux reducer 中的数组进行多次更新

javascript - MongoDB 根据日期更新变量

scala - 在 Scala 中一次捕获多个异常

java - Maven 只选择 src/main/java 或 src/main/scala 作为源文件夹,从不选择两者

future - 在 Scala.js 中沉睡在 Future 中

javascript - 使用替换为返回数组的最后一个值

javascript - 编写干净的 jQuery

scala - 从 ensime 运行 sbt 时出现 java.io.IOException?

javascript - 斯卡拉JS : Call a Javascript function on an element

commonjs - 如何将 Scala.js 应用程序转换为 CommonJS 模块?