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;
таким образом, он доступен внутри рабочего. (проверено в хроме)