JavaScript Hot-Reload in 1.3.0
Die Veröffentlichung der Wonderland Engine 1.3.0 führt eine neue Methode ein, JavaScript/TypeScript-Anwendungen im Editor zu packen.
Mit der neuen Einrichtung kann der Editor die Unterstützung von Hot Reload zurückbringen, d.h. das Neuladen Deines JavaScripts im Browser ohne das Neustarten der Engine und der VR-Sitzungen.
Vor-Version 1.3.0
Zuvor erzeugte der Editor ein einziges JavaScript-Bundle von einem einzigen Einstiegspunkt (index.js):
js/index.js
1import {loadRuntime} from '@wonderlandengine/api';
2
3/* wle:auto-imports:start */
4import {MyComponent} from './js/my-component.js';
5/* wle:auto-imports:end */
6
7const engine = await loadRuntime(...);
8
9/* wle:auto-register:start */
10engine.registerComponent(MyComponent);
11/* wle:auto-register:end */
Das generierte Bundle enthielt somit importierte Abhängigkeiten, den Engine-Initiierungscode sowie globale Variablen.
Neue Architektur
Die neue Architektur trennt den Anwendungs-Einstieg vom Komponenten-Registrierungseintrag:
js/index.js
: Enthält Komponenten-Registrierungapp.js
: Enthält die Engine-Erstellung, globale Variablen usw.
js/index.js
app.js
Außerdem wird das Komponenten-Bundle automatisch heruntergeladen und durch den engine.loadMainScene()
-Aufruf registriert.
Du bist frei, Komponenten manuell zu importieren und in der Anwendung zu registrieren, aber sieh Dir zuerst den Abschnitt Gotchas an, um häufige Fallstricke zu vermeiden.
Einstellungen
Der Editor hatte früher nur einen einzigen Eintrag für JavaScript-Einstellungen:

Jetzt wird dieser für die Anwendungs- und Komponenten-Einträge dupliziert:

Die output
-Einstellung wird verwendet, um auf den Bundle-Dateinamen im Bereitstellungsordner zu verweisen.
Wenn ein benutzerdefiniertes npm
-Kommando verwendet wird, muss dieser Wert auf den Dateinamen der generierten Datei gesetzt werden.
Migration
Beim Öffnen eines Projekts vor Version 1.3 wird der Migrationsprozess das Komponenten-Bundle deaktivieren und die Importliste im ursprünglichen Index belassen.
Die Migration besteht aus ein paar Schritten:
- Aktiviere das Komponent-Packbonung im
Projekt Einstellungen
- Verschiebe die Komponenten-Importe/Registrierungen in eine neue Indexdatei
Komponenten-Bundle aktivieren
In den Projekt Einstellungen
:
- Markiere das Kontrollkästchen
Erweiterte Einstellungen anzeigen
, falls nicht markiert - Setze die
bundling
-Option. Wir empfehlen die Verwendung vonesbuild
- Setze den
entryPoint
aufjs/component-index.js
- Setze den
output
aufMyWonderland-components.js

Das Packen erzeugt automatisch die Datei js/component-index.js
:
Komponenten verschieben
Wenn Dein Projekt manuell importierte/registrierte Komponenten in der alten js/index.js
-Datei hatte, müssen diese in den js/component-index.js
-Einstiegspunkt verschoben werden:
js/index.js
1import {loadRuntime} from '@wonderlandengine/api';
2
3/* wle:auto-imports:start */
4/* wle:auto-imports:end */
5
6// Diese Zeile muss zum Komponenten-Bundle hinzugefügt werden
7import {ManualComponent} from './js/manual-component.js';
8
9const engine = await loadRuntime(...);
10
11/* wle:auto-register:start */
12/* wle:auto-register:end */
13
14// Diese Zeile muss zum Komponenten-Bundle hinzugefügt werden
15engine.registerComponent(ManualComponent);
js/component-index.js
Herzlichen Glückwunsch, du verwendest jetzt die neue Architektur!
Gotchas
Anwendungen, die globale Variablen haben, können in folgendem Fall enden:
js/manager.js
app.js
js/my-component.js
In diesem Beispiel würde die Klasse Manager
in jeder Datei einmal deklariert.
Die Entscheidung, wie die Anwendung architektonisch strukturiert wird, wird von Fall zu Fall unterschiedlich sein. Hier ist eine Liste potenzieller Migrationsschritte:
- Manager könnten vollständig auf die Komponenten-Bundle-Seite verschoben werden
- Globale Variablen könnten lazy initialisiert werden
- Daten könnten über
window
geteilt werden (weniger empfohlen) - Für fortgeschrittene Benutzer: Die Verwendung eines separaten JavaScript-Bundles, das im HTML importiert wird