`scala-js1.xx`の名前空間でエクスポートする場合の` @ JSExportTopLevel`の標準的な方法
私は、同じ名前を持つ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の
回答
名前空間でのエクスポートは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が使用していた不透明な中途半端な実装よりも透過的です。