scala - 无法在 PhantomJSEnv 上运行 scala.js,requiresDOM 设置强制为 false

标签 scala sbt scala.js

我想使用网络套接字:

import org.scalajs.dom
import scala.scalajs.js.JSApp
import org.scalajs.dom.{CloseEvent, ErrorEvent, Event, MessageEvent}

object ExampleJS extends JSApp {

  def main(): Unit = {
    val data = ""

    val ws = new dom.WebSocket("ws://127.0.0.1:8182")
 // val ws = new dom.WebSocket("ws://127.0.0.1:8182, "whatever")

    ws.onmessage = (x: MessageEvent) => Console.println(x.data.toString)
    ws.onopen = (x: Event) => {}
    ws.onerror = (x: ErrorEvent) => Console.println("some error has occurred " + x.message)
    ws.onclose = (x: CloseEvent) => {}

    ws.send(data)
  }

}

但我仍然收到这样的错误:

[error] /home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1221
[error]   var ws = new ScalaJS.g["WebSocket"]("ws://127.0.0.1:8081");
[error]            ^
[error] TypeError: undefined is not a function
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.main__V (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1221:12)
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.$$js$exported$meth$main__O (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1243:16)
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.main (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1246:15)
[error]     at [stdin]:17:91
[error]     at Object.<anonymous> ([stdin]-wrapper:6:22)
[error]     at Module._compile (module.js:456:26)
[error]     at evalScript (node.js:532:25)
[error]     at Socket.<anonymous> (node.js:154:11)
[error]     at Socket.EventEmitter.emit (events.js:117:20)
[error]     at _stream_readable.js:920:16

> last fastOptStage::run
[info] Running com.viagraphs.ExampleJS
[debug] with JSEnv of type class scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv
[debug] with classpath of type class scala.scalajs.tools.classpath.CompleteCIClasspath$SimpleCompleteCIClasspath
[error] 
[error] /home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1221
[error]   var ws = new ScalaJS.g["WebSocket"]("ws://127.0.0.1:8081");
[error]            ^
[error] TypeError: undefined is not a function
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.main__V (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1221:12)
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.$$js$exported$meth$main__O (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1243:16)
[error]     at ScalaJS.c.Lcom_viagraphs_ExampleJS$.main (/home/lisak/src/viagraphs/scalajs-gremlin-client/js/target/scala-2.11/js-fastopt.js:1246:15)
[error]     at [stdin]:17:91
[error]     at Object.<anonymous> ([stdin]-wrapper:6:22)
[error]     at Module._compile (module.js:456:26)
[error]     at evalScript (node.js:532:25)
[error]     at Socket.<anonymous> (node.js:154:11)
[error]     at Socket.EventEmitter.emit (events.js:117:20)
[error]     at _stream_readable.js:920:16
java.lang.RuntimeException: node.js exited with code 8
        at scala.sys.package$.error(package.scala:27)
        at scala.scalajs.sbtplugin.env.ExternalJSEnv.runJS(ExternalJSEnv.scala:65)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv.scala$scalajs$sbtplugin$env$nodejs$NodeJSEnv$$super$runJS(NodeJSEnv.scala:76)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv$$anonfun$runJS$1.apply$mcV$sp(NodeJSEnv.scala:76)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv$$anonfun$runJS$1.apply(NodeJSEnv.scala:76)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv$$anonfun$runJS$1.apply(NodeJSEnv.scala:76)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv$$anonfun$withLibCache$1.apply(NodeJSEnv.scala:43)
        at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv.withLibCache(NodeJSEnv.scala:42)
        at scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv.runJS(NodeJSEnv.scala:76)
        at scala.scalajs.sbtplugin.ScalaJSPluginInternal$.scala$scalajs$sbtplugin$ScalaJSPluginInternal$$jsRun(ScalaJSPluginInternal.scala:356)
        at scala.scalajs.sbtplugin.ScalaJSPluginInternal$$anonfun$48$$anonfun$apply$18$$anonfun$apply$19.apply(ScalaJSPluginInternal.scala:420)
        at scala.scalajs.sbtplugin.ScalaJSPluginInternal$$anonfun$48$$anonfun$apply$18$$anonfun$apply$19.apply(ScalaJSPluginInternal.scala:414)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
        at sbt.std.Transform$$anon$4.work(System.scala:64)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
        at sbt.Execute.work(Execute.scala:244)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
        at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
        at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
[error] (js/compile:fastOptStage::run) node.js exited with code 8

我尝试了RhinoJSEnv和NodeJSEnv,都以这样的错误结束。我无法在 PhantomJSEnv 上运行它,我已将它安装在 Linux 上,它位于 PATH 上并且可以工作。问题是 requiresDOM 设置始终为 false,即使我明确将其设置为 true,因此 PhantomJSEnv 从未被选为运行时:

  override lazy val settings =
    super.settings ++ Seq(
      version := "0.0.1",
      scalaVersion := "2.11.2",
      resolvers += Resolver.mavenLocal,
      offline := true
    )

  lazy val js = project.in(file("js")).settings(
    Seq(
      libraryDependencies ++= Seq(
        "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.7-SNAPSHOT",
        "com.lihaoyi" %%% "utest" % "0.2.0" % "test"
      ),
      test in Test := (test in (Test, fastOptStage)).value,
      testFrameworks += new TestFramework("utest.runner.JvmFramework"),
      requiresDOM := true
    ) ++ Plugin.internal.utestJsSettings ++ scalaJSSettings:_*
  )

最佳答案

将构建定义更改为以下内容:

lazy val js = project.in(file("js"))
  .settings(scalaJSSettings: _*)
  .settings(Plugin.internal.utestJsSettings: _*)
  .settings(
    libraryDependencies ++= Seq(
      "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.7-SNAPSHOT",
      "com.lihaoyi" %%% "utest" % "0.2.0" % "test"
    ),
    test in Test := (test in (Test, fastOptStage)).value,
    testFrameworks += new TestFramework("utest.runner.JvmFramework"),
    requiresDOM := true
  )

请注意顺序的更改(多次使用 .settings 不会改变任何内容,恕我直言,它只是更干净)。如果您首先放置项目特定设置,然后放置 Scala.js 设置。 scalaJSSettings 中的默认值将覆盖您的设置,并且 requiresDOM 将为 false。

关于scala - 无法在 PhantomJSEnv 上运行 scala.js,requiresDOM 设置强制为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25248986/

相关文章:

html - 我应该如何处理默认助手或 twitterBootstrap 助手在我的 Play 2 应用程序中生成的 html 输出

mongodb - 在 Scala 中从 mongoDB 读取

Scala 子字符串正确抛出 IndexOutOfBounds,但在 Scala.js 中不会

scala - 无法让 uTest 查看我的测试

scala - 是否可以记录 Scala REPL 的输出?

scala - 如何在 Scala 单元测试中创建临时目录

scala - 更改 sbt 的输出目录

scala - sbt.ResolveException Unresolved 依赖关系

scala.js - 在 Scala.JS 中是否有一个调用来获取我正在运行的平台?

scala - Keep组合的含义?