首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sscalaJSModuleKind := ModuleKind.CommonJSModule -不能再调用main方法了:(

sscalaJSModuleKind := ModuleKind.CommonJSModule -不能再调用main方法了:(
EN

Stack Overflow用户
提问于 2017-01-27 22:54:36
回答 1查看 494关注 0票数 1

我正在尝试构建一个使用大量JSImport语句的新外观。我想把它放在我目前正在做的一个项目的子文件夹中,以改进它。

在根build.sbt之前,scala.js部件如下所示:

代码语言:javascript
复制
lazy val client = (project in file("modules/client"))
      .enablePlugins(ScalaJSPlugin, ScalaJSWeb)
      .settings(generalSettings: _*)
      .settings(
        name := "client",
        libraryDependencies += CrossDependencies.scalaTags,
        persistLauncher := true
      )

现在我添加了以下内容:scalaJSModuleKind := ModuleKind.CommonJSModule,它与persistLauncher设置不兼容,因此我删除了persistLauncher := true

当然,在我看来,我不能再只添加client-launcher.js了。因此,我尝试手动包装主方法调用,如下所示:

代码语言:javascript
复制
<script type="text/javascript">
    tld.test.Test().main()
</script>

现在,如果将 scalaJSModuleKind := ModuleKind.CommonJSModule添加到my build.sbt中,则该操作不再是 work 。如果我去掉那个设置,一切都很好。

这是我的测验

代码语言:javascript
复制
package tld.test

import org.scalajs.dom
import scala.scalajs.js.JSApp

object Test extends JSApp
{
  import scalatags.JsDom.all._

  def main(): Unit =
  {
    // Add js script dynamically
    val s = script(
      "alert('Hello World!')"
    )
    dom.document.getElementsByTagName("head")(0).appendChild(s.render)
  }
}

现在,如果我删除这个ModuleKind-设置一个警报弹出'Hello‘,但如果它在那里没有。是什么导致了这一切,我该如何预防呢?

在@sjrd回答后,编辑,我尝试了以下操作:plugins.sbt

代码语言:javascript
复制
addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.5.0")
addSbtPlugin("ch.epfl.scala" % "sbt-web-scalajs-bundler" % "0.5.0")

build.sbt

代码语言:javascript
复制
lazy val client = (project in file("modules/client"))
  .enablePlugins(ScalaJSBundlerPlugin, ScalaJSWeb) // ScalaJSBundlerPlugin automatically enables ScalaJSPlugin
  .settings(generalSettings: _*)
  .settings(
    name := "client"
    , libraryDependencies += CrossDependencies.scalaTags
    //, scalaJSModuleKind := ModuleKind.CommonJSModule // ScalaJSBundlerPlugin implicitly sets moduleKind to CommonJSModule enables ScalaJSPlugin
  )

lazy val server = (project in file("modules/server"))
  .enablePlugins(PlayScala, WebScalaJSBundlerPlugin)
  .settings(generalSettings: _*)
  .settings(
    name := "server"
    ,libraryDependencies ++= Seq(
      CrossDependencies.scalaTest,
      CrossDependencies.scalactic,
      CrossDependencies.scalaTags,
      "com.typesafe.play" %% "play-json" % "2.6.0-M1")
    ,scalaJSProjects := Seq(client)
    ,pipelineStages in Assets := Seq(scalaJSPipeline)
    //,pipelineStages := Seq(digest, gzip)
    ,compile in Compile := ((compile in Compile) dependsOn scalaJSPipeline).value
  )

但在编译过程中,我得到:

未找到./directory Launcher.js信息模块中的错误:错误:无法解析/home/sorona/scalajstestbed/modules/client/target/scala-2.12/scalajs-bundler/main中的“文件”或“目录”

编辑:解决方案是包括client-fastopt-bundle.js和瞧

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 23:40:40

更改模块类型会显着地改变输出文件的形状,包括它的外部“规范”。特别是,它不再是一个可以嵌入到Web页面中的脚本。相反,它是一个CommonJS模块。

为了能够将其包含在网页中,您需要将其捆绑在一起。这样做的最好方法是太过使用scalajs-bundler

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41904346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档