在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。
将依赖项添加到仅限客户端的网页还需要哪些其他步骤?
答案 0 :(得分:2)
如文档this part中所述,您必须在外观定义中使用@JSImport
:
@JSImport("esprima", JSImport.Namespace)
作为参考,@JSName
定义了绑定到全局名称的外观,而@JSImport
定义了绑定到require
d JavaScript模块的外观。