2015-03-20 2 views
1

Я пытаюсь разделить некоторый код scala между общей библиотекой и веб-проектом моей платформы воспроизведения с помощью ScalaJS.Play Framework frontend JS с использованием внешних зависимостей Scala.js

Я создал общий проект с использованием ScalaJS в отдельной сборке (в другой папке, другой build.sbt), включая модульные тесты с использованием uTest, и все работает как ожидалось. Я перекрестно скомпилировал библиотечный код для разделения целей (shared_jvm и shared_js) и использовал команду SBL publishLocal. В этот момент все в порядке.

Я создал отдельный проект в моем веб-приложение рамочным игра для моего конкретного кода ScalaJS веб-приложений в папке web_js, используя этот код:

lazy val web_js = (project in file("web_js")).settings(
    scalaVersion := "2.11.1", 
    persistLauncher := true, 
    persistLauncher in Test := false, 
    unmanagedSourceDirectories in Compile := Seq((scalaSource in Compile).value), 
    libraryDependencies ++= Seq(
    "org.scala-js" %%% "scalajs-dom" % "0.8.0", 
    "be.doeraene" %%% "scalajs-jquery" % "0.8.0", 
    "org.myorg" %%% "shared-js" % "0.1-SNAPSHOT" 
)). 
    enablePlugins(ScalaJSPlugin, ScalaJSPlay) 

Библиотека решен без каких-либо вопрос по SBT. Я могу скомпилировать и ошибок нет, и я могу ссылаться на общую библиотеку в моем коде.

Для того, чтобы использовать свой общий код JS, я расширяю JSApp и вызвать объект в моей общей библиотеке так:

//Index.scala 
import org.myorg.shared.SharedObject 

object Index extends JSApp { 
    def main(): Unit = { 
    SharedObject.printSomething() 
    } 
} 

Однако, когда это вызывается после того, как я загрузить мой браузер, я получаю неопределенная ошибка, связанная с объектом в моей общей библиотеке:

Uncaught TypeError: undefined is not a function 

Как я могу загрузить зависимую ScalaJS библиотеку в страницу в моем Play Framework проекта?

Другие ноты:

Я не могу увидеть мой общий код библиотеки в «источники» вид отладчика хрома. Я могу видеть только фрагмент кода Index.scala, вставленный выше. Это заставляет меня полагать, что общая библиотека, на которую я ссылаюсь, фактически не загружается браузером, но я не уверен, что так оно работает или нет.

Кстати, я видел проект play-with-scalajs-example, и я использую его для загрузки точки входа Index.scala выше, используя этот фрагмент кода:

@playscalajs.html.scripts("/assets", projectName = "web_js") 

Но я не имел никакого успеха, используя он загружает зависимую библиотеку.

+0

Вы видите какие-либо предупреждения при запуске 'web_js/fastOptJS'? Тот факт, что вы не видите каких-либо источников, может быть просто проблемой относительного пути с исходными картами. – gzm0

ответ

0

Я думаю, что я просто неправильно понял ошибку javascript и/или не обновил сгенерированный javascript за какое-то время.

Получается, что я был в зависимости от внешнего ресурса javascript (moment.js), который не был загружен. Когда я загружаю его вручную, вставив тег скрипта на страницу:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script> 

Работает так, как ожидалось, и вызывает мою общую библиотеку. Это странно, потому что я не помню, как видел мой код в сгенерированном скрипте fastopt.js, но я, должно быть, пропустил его или имел некоторые проблемы с конфигурацией на моем ящике ранее.

Я не знаю, почему мой встроенный moment.js скрипт не работает, так как это часть ресурсов в одном из своих зависимостей, и я включил его в настройках jsDependencies, как так:

jsDependencies ++= Seq(
    "org.myorg" %%% "momentjs" % "0.1-SNAPSHOT"/"moment.js" 
) 

Но я полагаю, что это вопрос для нового сообщения, если я не могу понять это.

+1

Если это кому-то полезно, мне просто нужно было добавить: skip in packageJSЗависимости: = false к моей игровой системе JS project SBT конфигурации. Тогда я мог бы сослаться на скрипт зависимостей в моем HTML-файл с помощью: <сценарий SRC = "@ routes.Assets.at (" web_js-jsdeps.js ")" типа = "текст/JavaScript"> Где web_js это название моего проекта Scala JS. – user949286

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