Что импортировать в Scala.js, чтобы использовать простой модуль «ProvidedJS»? - PullRequest
0 голосов
/ 04 октября 2018

У меня очень простой локальный модуль, экспортирующий класс.Я хотел бы использовать этот модуль локально, используя ProvidedJS.Независимо от того, что я пробовал, каждый раз, когда я выполняю run или test в sbt, компилятор жалуется, что на этапе fastOptJS он не может найти модуль.

Я убедился, что файл Javascript включен вфайл jsdeps.js, но независимо от того, что я пытался записать в @JSImport, я всегда получаю сообщение об ошибке «Не удается найти модуль».

MyTypes.js:

var MyType = function (x, y) {
    this.x = x;
    this.y = y;
};

MyType.prototype.constructor = MyType;

exports.MyType = MyType;

build.sbt:

name := "JSEquals"

version := "0.1"

scalaVersion := "2.11.12"

enablePlugins(ScalaJSPlugin)

jsDependencies += ProvidedJS / "MyTypes.js"

scalaJSUseMainModuleInitializer := true

skip in packageJSDependencies := false

//jsEnv in Compile := new org.scalajs.jsenv.nodejs.NodeJSEnv(org.scalajs.jsenv.nodejs.NodeJSEnv.Config().withArgs(List("--inspect-brk")))

scalaJSModuleKind in Compile := ModuleKind.CommonJSModule

MyApp.scala:

import scala.scalajs.js
import scala.scalajs.js.annotation._

@js.native
@JSImport("./MyTypes.js", "MyType")
class MyType(var x: Double, var y: Double) extends js.Any

object MyApp {

  @JSExport
  def main(args: Array[String]): Unit = {
    val my = new MyType(0, 0)
    println(s"my $my")
  }
}

Готов к использованию проект доступен на GitHub в филиале minimalModule.

Что я должен написать в @JSImport, чтобы использовать модуль MyTypes?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Есть еще один документированный способ, который я пропустил ранее: можно установить commonJSName, который будет использоваться для node.js (то есть для запуска / тестирования SBT), и вообще не использовать jsdeps для этой конфигурации..

См. Зависимости , абзац CommonJS name :

Некоторые (большинство?) Библиотеки JavaScript стараются максимально приспособиться ксреда, в которой они выполняются.Когда они это делают, вы должны явно указать имя, под которым они экспортируются в среде CommonJS (например, Node.js), иначе они не будут работать при выполнении в Node.js.

В моем случае это означает:

jsDependencies += ProvidedJS / "MyTypes.js" commonJSName "MyTypes"

На фасаде используется @JSGlobal, а не @JSImport, затем:

@js.native
@JSGlobal("MyTypes.MyType")
class MyType(var x: Double, var y: Double) extends js.Any {

Примечание: при поиске документации (что легче, когда вы знаете ответ), я обнаружил проблему с GitHub , где sjrd сказал мне использовать commonJSName в той же ситуации (выполнениетесты) больше года назад.Мне стыдно полностью забыть об этом.

0 голосов
/ 04 октября 2018

jsDependencies полностью несовместимо с модулями CommonJS.[1] Это только (едва) работает для простых старых скриптов, которые хранят вещи в глобальной области видимости.

При использовании CommonJSModule в Scala.js без какого-либо компоновщика, такого как scalajs-bundler, вы несете ответственность за это.либо поместить файл MyType.js в место, к которому можно получить доступ через require('MyType.js');, либо (проще сейчас, учитывая состояние вашего проекта) использовать полный путь в @JSImport, который доставит вас из файла -fastop.js вMyType.js.Учитывая ваше описание, это выглядело бы как

@JSImport("../../src/main/resources/MyType.js", "MyType")

Не очень, и довольно зависит от конкретной компоновки, но это должно помочь вам начать.

[1] https://www.scala-js.org/doc/project/module.html

...