`scala-js1.xx`の名前空間でエクスポートする場合の` @ JSExportTopLevel`の標準的な方法

Aug 24 2020

私は、同じ名前を持つ2つのクラスの持っているAのように異なるパッケージ1を有します: -

xxx.yyy.v1.A

そして2番目として:-

xxx.yyy.v2.A

scala-js(1.1.1)で@JSExportTopLevelを使用する必要があります。

これを達成するための標準的な方法は何ですか?

以前のscala-js(0.6.x)では、次のようなものを使用していました:-

@JSExportTopLevel("xxx.yyy.v1.A")

そして

@JSExporttopLevel("xxx.yyy.v2.A")

しかし、scala-js(1.1.1)では、削除されました。名前空間でのエクスポート(非推奨)

注:-scala -jsアップグレード0.6.x- > 1.xxでこの問題に直面しています

私の構成:-

スカラ- > 2.13.3、JVM - > 14、SBT - > 1.3.13、スカラ-JS - > 1.xxの

回答

3 sjrd Aug 24 2020 at 15:40

名前空間でのエクスポートはScala.js0.6.26で非推奨になり、最終的に1.xで削除されました。これは、このようなエクスポートがECMAScriptモジュールに関して何にも対応していないためexportです。コンパイラーは、非標準のフープを飛び越えて、それらが機能しているように見せなければなりませんでした。

上にリンクされている0.6.26のリリースノートで説明されているように、置き換えは、これらの名前空間とエクスポートする値を保持するJSオブジェクトを明示的に構築することです。あなたの場合:

object JSNamespacesExports {
  @JSExportTopLevel("xxx")
  val xxx = new js.Object {
    val yyy = new js.Object {
      val v1 = new js.Object {
        val A = _root_.xxx.yyy.v1.A
      }

      val v2 = new js.Object {
        val A = _root_.xxx.yyy.v2.A
      }
    }
  }
}

(スコープ内にあるものではなく、トップレベルのScalaパッケージとして_root_.強制的に解決するために使用されます。)xxxval xxx

このエンコーディングでは、xxxJavaScriptから見て、どのように表示するかを明示的に選択します。これは、Scala.js0.6.xが使用していた不透明な中途半端な実装よりも透過的です。