Modo standard con per `@ JSExportTopLevel` durante l'esportazione sotto uno spazio dei nomi in` scala-js 1.xx`
Ho due classi con lo stesso nome A che hanno un pacchetto diverso come: -
xxx.yyy.v1.A
e secondo come: -
xxx.yyy.v2.A
Devo usare @JSExportTopLevel in scala-js (1.1.1).
Qual è il modo standard per farlo?
In precedenza in scala-js (0.6.x), ho usato qualcosa del genere: -
@JSExportTopLevel("xxx.yyy.v1.A")
e
@JSExporttopLevel("xxx.yyy.v2.A")
ma con scala-js (1.1.1), ora è rimosso. Esportazione in uno spazio dei nomi (deprecato)
Nota: - Sto affrontando questo problema nell'aggiornamento di scala-js 0.6.x -> 1.xx
La mia configurazione: -
scala -> 2.13.3, jvm -> 14, sbt -> 1.3.13, scala-js -> 1.xx
Risposte
L'esportazione sotto uno spazio dei nomi è stata deprecata in Scala.js 0.6.26 e alla fine rimossa in 1.x perché tali esportazioni non corrispondono a nulla in termini di moduli ECMAScript export
. Il compilatore doveva saltare attraverso cerchi non standard per farli sembrare che funzionassero.
Come spiegano le note di rilascio della 0.6.26, collegate sopra, la sostituzione consiste nel costruire esplicitamente un oggetto JS che conterrà quegli spazi dei nomi e i valori da esportare. Nel tuo caso:
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
}
}
}
}
( _root_.
viene utilizzato per forzare la risoluzione xxx
come pacchetto Scala di primo livello, invece di quello val xxx
che è nell'ambito.)
Con questa codifica, scegli esplicitamente come vuoi xxx
che appaia, visto da JavaScript. Questo è più trasparente dell'implementazione opaca e incompleta che Scala.js 0.6.x stava usando.