将参数传递给 webpack 加载器的内联导入

Pass params to inline import of webpack loader

我有一个未弹出的 create-react-app(react-scripts v3.4.3)和 Typescript 应用程序,我正在尝试在其中使用 web worker。我能够让 worker 与 workerize-loader 使用以下导入语句:

// eslint-disable-next-line import/no-webpack-loader-syntax
import Worker from 'workerize-loader!./worker';

问题是我需要更改加载器的 publicPath 属性 而不从 create-react-app 中弹出,所以我尝试添加查询参数,如 inline loaders 的 webpack 文档所述:

Options can be passed with a query parameter, e.g. ?key=value&foo=bar, or a JSON object, e.g. ?{"key":"value","foo":"bar"}

// eslint-disable-next-line import/no-webpack-loader-syntax
import Worker from 'workerize-loader?publicPath="path/to/js/"!./worker';

我已经尝试了两种方法,但都return 相同的 Typescript 编译器错误“找不到模块...”

webpack 文档中提到的查询参数是否仅适用于 module.rules 属性 in webpack.config.js

这个问题实际上与 Webpack 完全无关,而是一个 Typescript 问题。

我不确定这是否完全正确,但我会将我的解决方案留给那些试图让 workerize-loader 使用 create-react-app 和 Typescript 的人。

我结合了 workerize-loader 的 worker-loader with Typescript and using the publicPath option (though not documented but in the src) 中的说明。

在我的模块声明文件中,我只是用 publicPath 值声明了模块,然后当我导入工作模块时,我匹配了声明。假设这些文件都位于名为 src/worker 的目录下。最后一个文件显示了如何调用 worker 方法。

src/worker/custom.d.ts

declare module 'workerize-loader?publicPath=new/public/path/!*' {
  class WebpackWorker extends Worker {
    constructor();

    // Add any custom functions to this class.
    // Make note that the return type needs to be wrapped in a promise.
    
    someLongOperation(): Promise<string>;
  }

  export = WebpackWorker;
}

src/worker/index.ts

// eslint-disable-next-line import/no-webpack-loader-syntax
import Worker from 'workerize-loader?publicPath=new/public/path!./worker';

export default Worker;

src/worker/worker.ts

export function someLongOperation(): string {
  // doing long lasting operation
  // ...

  return 'result of long operation';
}

src/someService.ts

import Worker from 'src/worker';

...

const myWorker = new Worker();
cosnt workerResult = await myWorker.someLongOperation();