it-swarm.com.de

Web Workers - Importieren von Modulen

Ich verwende ES2015-Import/Export-Module.

Wenn ich versuche, in meiner Arbeiterdatei Funktionen zu importieren, wie ich es normalerweise mache:

worker.js

import { a, b, c } from "./abc.js";

Ich erhalte die Fehlermeldung: SyntaxError: import declarations may only appear at top level of a module

Da ich Funktionen in meinem Modul 'abc.js' exportiere, bin ich mir nicht sicher, wie ich sie mit der alten (und anscheinend auf dem Weg liegenden) Syntax verwenden soll:

self.importScripts( "/app/abc.js" );

Meine Frage ist also, wie verwenden wir die neue Importmodulsyntax mit Arbeitern?

Die zweite Frage lautet: Was importiert importScripts, wenn aus einem Modul importiert wird, in dem kein übergeordnetes Objekt eines globalen Objekts exportiert wird?

17
Kayote

ES2015-Module in Workern werden noch in keinem Browser unterstützt (auch nicht, wenn diese Module sonst unterstützen). Danach müssen Sie einen Arbeiter wie folgt erstellen:

new Worker("worker.js", { type: "module" });

Siehe: https://html.spec.whatwg.org/#module-worker-example

Für jetzt müssen Sie importScripts() verwenden.

Dies sind die Fehlerberichte für jeden Browser:

17
Tobias Buschor

ES-Module in Workern sind bereits in Chrome verfügbar. Damit werden Funktionen für experimentelle Webplattformen aktiviert und beim Starten von Chrome das entsprechende Flag verwendet:

chrome.exe --enable-experimental-web-platform-features

Dies ist die Syntax, die Sie verwenden müssen, um das Arbeiterskript als Modul zu laden:

new Worker( 'my-worker.js', { type : 'module' } );

Diese Funktion ist seit fast einem Jahr in der Entwicklung und sollte bald verfügbar sein, ohne dass spezielle Flaggen erforderlich sind. Es gibt jedoch noch keinen offiziellen Veröffentlichungszeitpunkt.

1
colxi

für mich das Zuordnen zu self. hat gut funktioniert. Ich habe den Import in eine andere js-Datei gestellt: abcImported.js

import { a, b, c } from "./abc.js";

export {  a, b, c };

und im Servicetechniker: 

self.a = require('abcImported.js').a;
self.b = require('abcImported.js').b;

auf diese Weise ist es innerhalb des Arbeiters zugänglich. (in chrom getestet)

0
Kate Kasinskaya