无法在PhantomJSEnv上运行scala.js,requiresDOM设置被迫为false

无法在PhantomJSEnv上运行scala.js,requiresDOM设置被迫为false,scala,sbt,scala.js,Scala,Sbt,Scala.js,我想使用WebSocket: 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:/

我想使用WebSocket:

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

将生成定义更改为以下内容:

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设置。
scalajsettings
中的默认值将覆盖您的设置,并且
requiresDOM
将为false。

如果您尝试使用PhantomJS运行
fastOptStage::run
,会发生什么?打字错误?你也可以试着在浏览器中运行这个吗?我无法重现任何意外的行为。请提供更多细节。请看这里:(但在0.5.3中已修复)。主要问题是,尽管我满足了
fastOptStage::run
文档中指定的使用PhantomJS的条件,但它只使用Node.js,而不是PhantomJS。你是在告诉我,如果你用这个构建设置和代码来设置项目,它会工作吗?我更新了来自fastOptStage::run(在Node.js上)的堆栈跟踪,我忘了提到,当我把它放在html页面中时,chrome运行得很好。。。只是它在Rhino、Node.js中不起作用,我觉得它会用PhantomJS运行,但我不能让它运行脚本来尝试它是否起作用。。。我正在做的应用程序没有UI,因此实际上不需要html和浏览器,所以我想使用Rhino、Node或PhantomJSIt!它可以工作:-)我确信我试图改变顺序,但没有效果,但现在它确实改变了,并且它最终使用了PhantomJS,所以它可能以前没有重新加载过或者其他什么。。。虽然WebSocket在PhantomJS上也不起作用——只是什么都没有发生,即使我在最后让它保持忙碌状态,这样运行时就不会在完成连接之前杀死它……不幸的是,这是PhantomJS的问题。你知道他们只支持hixie-76 WebSocket,根据这个:我明白了,Node和Rhino呢?我在我的问题上粘贴的错误使它崩溃了。如何开发scalajs上没有UI的websocket客户端?我应该通过html吗?
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
  )