如何将scalajs-bundler与仅客户端应用程序一起使用

时间:2017-02-03 10:17:59

标签: npm scala.js scalajs-bundler

another question中,我被建议使用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时,错误为:

  

未捕获的TypeError:无法读取未定义的属性“tokenize”

使用了static-fastopt-bundle.js节目esprima,但未绑定其js。

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

1 个答案:

答案 0 :(得分:2)

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

@JSImport("esprima", JSImport.Namespace)

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