Web Workers - Как импортировать модули

Я использую модули импорта/экспорта ES2015.

В моем рабочем файле, когда я пытаюсь импортировать такие функции, как обычно:

worker.js

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

Я получаю ошибку: SyntaxError: import declarations may only appear at top level of a module

Как я экспортирую функции в моем модуле 'abc.js', я не уверен, как их использовать, используя старый синтаксис (&, очевидно, на его выходе):

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

Итак, мой вопрос: как мы используем синтаксис нового модуля импорта с рабочими?

Второй вопрос: что импортирует importScripts при импорте из модуля в том месте, где нет экспортируемого глобального объекта?

Ответ 1

Модули ES2015 в рабочих еще не поддерживаются ни в одном браузере (даже в тех, которые поддерживают модули в противном случае). Как только они это сделают, вы должны создать такого работника:

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

Смотрите: https://html.spec.whatwg.org/#module-worker-example.

На данный момент вы должны использовать importScripts().

Вот отчеты об ошибках для каждого браузера:

Ответ 2

Модули ES на рабочих местах уже доступны в Chrome, что позволяет использовать возможности Experimental Web Platform с использованием соответствующего флага при запуске Chrome:

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

Это синтаксис, который вам нужно использовать для загрузки рабочего скрипта как модуля:

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

Эта функция была в разработке почти год, и должна быть доступна в ближайшее время, без необходимости специальных флагов, однако официальной даты выпуска пока нет.

Ответ 3

для меня назначение на self. работал хорошо. Я поставил импорт в другой файл abcImported.js: abcImported.js

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

export {  a, b, c };

а у обслуживающего работника:

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

таким образом, он доступен внутри рабочего. (проверено в хроме)