无法在ScalaJS中编写一个CommonJS模块,该模块可以导入"导入"在Atom编辑器中作为插件

时间:2017-04-18 14:32:42

标签: scala atom-editor commonjs scala.js

如果我想将一些ScalaJS方法导出为CommonJS模块,该怎么办?我有以下但它似乎不起作用:

@ScalaJSDefined
@JSExportTopLevel("default")
object SourceFetch extends js.Object {
  def activate(state: js.Dynamic): Unit = {
    global.console.log("activate")
  }
  def deactivate(): Unit = {
    global.console.log("deactivate")
  }
}

是的,scalaJSModuleKind:= ModuleKind.CommonJSModule在build.sbt中。

我想要的输出是一个看起来像这样的commonjs模块;

export default {
  activate(state) {
    console.log("activate");
  }.
  deactivate() {
    console.log("deactivate");
  }
};

我最终做的是使用弃用的sbt键" scalaJSOutputWrapper"并追加' module.exports = exports ["默认"];'在输出JS文件的末尾。

我确实试过" scalaJSUseMainModuleInitializer"但我只能抓住" module.exports"不是"出口"以及" module.exports"的价值未定义。

1 个答案:

答案 0 :(得分:1)

您的上述代码段确实对应于您编写的ECMAScript 2015代码段。但是,这不会将方法导出为模块的直接成员,而是作为default对象的成员导出。不,default导出与模块本身不同(尽管很多人都这么认为)。

要将函数导出为模块的直接成员,您应该写:

object SourceFetch {
  @JSExportTopLevel("activate")
  def activate(state: js.Dynamic): Unit = {
    global.console.log("activate")
  }
  @JSExportTopLevel("deactivate")
  def deactivate(): Unit = {
    global.console.log("deactivate")
  }
}