如何在仅客户端应用程序中使用 scalajs-bundler

How to use scalajs-bundler with client only app

I was advised to use ScalaJS bundler导入NPM依赖。

我想在一个简单的仅客户端 Web 应用程序中使用一些 Javascript NPM 包。 an example called static 显示了这一点。 我对示例的更改:

加入build.sbt:

npmDependencies in Compile += "esprima" -> "3.1.3"

加入Main.scala:

import Esprima._
import JsonToString._
val code = "answer = 42"
val tokens = tokenize(code)
val tokensStr = tokens.json

Main.scala 中的变化:"This is bold" 变为 s"This is bold $tokensStr"

Facade(有点简化,完整版本见GitHub):

import scala.scalajs.js
import scala.scalajs.js.annotation.JSName

@JSName("esprima")
@js.native
object Esprima extends js.Object {

  def tokenize(input: String, config: js.Any = js.native, delegate: String => String = js.native): js.Array[js.Any] = js.native

  def parse(input: String, config: js.Any = js.native): js.Dynamic = js.native
}

当 运行 使用 fastOptJS::webpack 生成 html 时,错误是:

Uncaught TypeError: Cannot read property 'tokenize' of undefined

检查 static-fastopt-bundle.js 显示使用了 esprima,但其 js 未捆绑。

将依赖项添加到仅限客户端的网页还需要哪些其他步骤?

如文档 this part 中所述,您必须在外观定义中使用 @JSImport

@JSImport("esprima", JSImport.Namespace)

作为参考,@JSName 定义了绑定到全局名称的外观,而 @JSImport 定义了绑定到 required JavaScript 模块的外观。