Я пытаюсь заставить веб-работников хорошо играть с Typescript и Webpack's worker-loader .В их документации есть пример достижения этого посредством пользовательского объявления модуля, однако это основывается на использовании синтаксиса webpack worker-loader!./myWorker
.
Я хочу иметь возможность загружать работников через пользовательский *.worker.js
webpack * 1007.Правило, а не явное перечисление загрузчика в строке импорта.Что-то в машинописи не похоже на определение или изменение объявления модулей, если это простой относительный импорт, и застревает на том факте, что рабочий файл не является модулем, даже с объявлением модуля для него.
У меня есть рабочий, который выглядит как
// test.worker.ts
/// <reference lib="webworker" />
const worker: DedicatedWorkerGlobalScope = self as any;
worker.onmessage = ({ data }) => {
if (data instanceof Array) {
worker.postMessage(data.join(' ') + '!');
}
};
Объявление, которое выглядит как
// custom.d.ts
declare module '*.worker' {
class TestWorker extends Worker {
constructor();
}
export default TestWorker
}
И используется в моем основном приложении как
import TestWorker from './test.worker';
const testWorker = new TestWorker();
testWorker.onmessage = ({ data }: { data: string }) => {
console.log(data);
};
testWorker.postMessage([
'hello',
'I',
'am',
'a',
'web',
'worker',
]);
Ошибкавывод
TypeScript error in /worker-test/src/index.tsx(9,24):File '/worker-test/src/test.worker.ts' is not a module. TS2306
Изменение импорта на worker-loader!./test.worker
, кажется, работает и получает машинописный текст для понимания пользовательского объявления, однако я действительно стараюсь избегать использования пользовательских строк загрузчика, поскольку намерение состоит в том, чтобы интегрировать это вcreate-реагировать-приложение, которое не позволяет это.
Есть ли способ получить регулярный относительный импорт для распознавания объявления пользовательского модуля?