使用 ScalaJSBundlerPlugin(webpack 捆绑器)时无法从 Javascript 访问 JSExport

JSExport not accessible from Javascript when using ScalaJSBundlerPlugin (webpack bundler)

我正在尝试以下找到的 scalajs 导出的 hello world 示例 here:

@JSExportTopLevel("HelloWorld")
object HelloWorld {
  @JSExport
  def sayHello(): Unit = {
    println("Hello world!")
  }
}

我的 html 看起来像这样:

<!DOCTYPE html>
<html>
<head>
  <title>Example Scala.js application</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body style="margin: 0px">

<script type="text/javascript" src="./../../../target/scala-2.13/scala-js-tutorial-fastopt.js"></script>
<script>
    HelloWorld.sayHello();
</script>
</body>
</html>

效果很好。

现在,如果我尝试使用 ScalaJSBundlerPlugin(在后台使用 webpack),运行 fastOptJS::webpack 并将路径更改为“./../../../target/scala-2.13/scalajs-bundler/main/scala-js-tutorial-fastopt-bundle.js”,我得到“HelloWorld 未定义”。

捆绑后如何访问 HelloWorld?

默认情况下,scalajs-bundler 使用“应用程序”捆绑模式,可以丢弃 top-level 导出。如the cookbook explains,当使用@JSExportTopLevel时,需要使用“LibraryAndApplication”捆绑模式,使用

webpackBundlingMode := BundlingMode.LibraryAndApplication()