2017-02-03 6 views
0

В another question Мне было рекомендовано использовать ScalaJS bundler для импорта зависимостей NPM.Как использовать scalajs-bundler только с клиентским приложением

Я хотел бы использовать некоторые пакеты 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"

Фасад (немного упрощена, для полной версии см. 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 
} 

При запуске HTML сгенерированный с fastOptJS::webpack погрешность составляет:

Uncaught TypeError: Cannot read property 'tokenize' of undefined

Проверка static-fastopt-bundle.js показывает esprima используется, но его JS не поставляется.

Какие еще шаги необходимы для добавления зависимостей на веб-страницу только для клиента?

+0

Расспрашивается как [# 105] (https://github.com/scalacenter/scalajs-bundler/issues/105) на 'scalajs-bundler' GitHub. – Suma

+0

Вы также должны включить определение фасада в свой вопрос –

ответ

2

Как описано в this part документации, вы должны использовать @JSImport в вашем определении фасада:

@JSImport("esprima", JSImport.Namespace) 

Для справки, @JSName определяет фасад, связанный с мировым именем, в то время как @JSImport определяет фасад привязывается к require d Модуль JavaScript.

+0

Отлично. A см. Небольшой недостаток необходимости в другом фасаде в зависимости от того, как я определяю зависимость, но, по крайней мере, она работает. Пакет такой же. Есть ли способ использовать один и тот же фасад для webjars и распределенного пакета? – Suma

+0

Кажется, e.q [jquery facade] (https://github.com/scala-js/scala-js-jquery) делает это. Я проверю его и, возможно, добавлю в этот ответ. – Suma

 Смежные вопросы

  • Нет связанных вопросов^_^