Использовать ESM в служебном рабочем файле (импорт / экспорт) - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь использовать служебный файл, который также является модулем ESM.

У метода register есть дополнительный аргумент, принимающий объект options с полем type, допустимые значения которогокажется, classic и module, но когда я использую:

navigator.serviceWorker.register('worker.js', { type: 'module' });
// `worker.mjs` doesn't work either
// The file exists in both cases!

я получаю неопределенное DOMException без сообщения в Chrome.

Я понял, что допустимые значениядля type были прочитаны спецификации, а именно:

https://html.spec.whatwg.org/multipage/workers.html#workertype

Мне кажется, что мой код действителен.

Как проверка работоспособности, ятакже попытался установить explicity type в classic, и регистрация работника службы затем проходит нормально.Если установить недопустимое значение, я получу сообщение TypeError, поэтому браузер еще не знает о type: module.Он рассматривается как особый случай, просто выдает DOMException без сообщения.

Правильно ли я использую поле type?Это все еще слишком рано и не поддерживается в браузерах?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

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

Если worker.js находится в том же месте, что и страница, на которой он загружается, то:

navigator.serviceWorker.register('./worker.js', { type: 'module' });
// -------------------------------^^

Или, конечно, добавить карту модуля.

1 голос
/ 09 июля 2019

Это глупо! Chrome напечатает только DOMException в консоль (даже не расширяемую) при регистрации объекта ошибки, а Object.keys в этом экземпляре объекта возвращает [], но когда я специально печатаю e.message, виновник раскрывается:

тип 'module' в RegistrationOptions еще не реализован. Подробнее см. https://crbug.com/824647.

Chrome не удивлен.

...