问题描述
我有一个未弹出的create-react-app(react-scripts v3.4.3)和Typescript应用程序,我正在尝试使用网络工作者。我能够使用以下方法将工作者与workerize-loader捆绑在一起:以下导入语句:
select KEY,CODE from table1
where IND = '1'
UNION(NOT UNION ALL)
select CODE,ORG_CODE from table2
join ORG on KEY = KEY
join REGION on KEY = KEY
问题是我需要更改加载程序的publicPath属性,而不必从create-react-app中弹出,因此我尝试添加web inline loaders的webpack文档中提到的查询参数:
选项可以与查询参数一起传递,例如?key = value&foo = bar或JSON对象,例如?{“ key”:“ value”,“ foo”:“ bar”}
// eslint-disable-next-line import/no-webpack-loader-Syntax
import Worker from 'workerize-loader!./worker';
我已经尝试了两种方法,但是都返回了“找不到模块...”相同的Typescript编译器错误
webpack文档中提到的查询参数仅用于// eslint-disable-next-line import/no-webpack-loader-Syntax
import Worker from 'workerize-loader?publicPath="path/to/js/"!./worker';
的{{1}}属性中吗?
解决方法
该问题实际上根本与Webpack无关,而只是一个Typescript问题。
我不确定这是否完全正确,但是我将把解决方案留给那些试图让workerize-loader
使用create-react-app和Typescript的人。
我结合了来自worker-loader with Typescript的指令,并使用了workerize-loader的publicPath
选项(虽然没有记录,但在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();