在Typescript中将WebWorkers与Webpack和worker-loader一起使用,而没有自定义加载器字符串

问题描述 投票:3回答:1

我正在尝试让网络工作者与Typescript和Webpack的worker-loader保持良好的配合。他们的文档中有一个通过自定义模块声明实现此目的的示例,但这依赖于使用webpack worker-loader!./myWorker语法。

我希望能够通过自定义*.worker.js webpack use规则加载工作程序,而不是在导入字符串中明确列出加载程序。关于typescript的东西似乎不喜欢定义或修改模块声明,如果它只是普通的相对导入,并且会陷入一个事实,即工作文件不是模块,即使有模块声明也是如此。

我有一个看起来像的工人

// 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-react-app中允许这些。

是否有办法获取常规的相对导入以识别自定义模块声明?

typescript webpack web-worker
1个回答
1
投票

您快到了!

更改模块声明以包含文件扩展名:

// custom.d.ts
declare module '*.worker.ts' {
  class TestWorker extends Worker {
    constructor();
  }

  export default TestWorker
}

并且您的导入还包括文件扩展名:

import TestWorker from './test.worker.ts';

[这对我有用-在导入中指定扩展名阻止TS将其作为模块导入,在声明中指定扩展名则避免TS抱怨,因为要导入.ts文件时也要指定扩展名。

© www.soinside.com 2019 - 2024. All rights reserved.