姓名:"Classic workers are not supported"?
Deno: "Classic workers are not supported"?
我想像这样创建一个 Web Worker:
const blob = URL.createObjectURL(new Blob([`
...
`], {type: 'text/javascript'}))
const worker = new Worker(blob)
但是在 Deno 中这样做时我得到:
error: Uncaught NotSupported: Classic workers are not supported.
const worker = new Worker(blob)
^
我用谷歌搜索了这条消息“不支持 Classic worker”,但我基本上没有发现任何内容来解释它背后的历史或它的具体含义。我发现了一些关于创建工人的特殊 Deno 方法:
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
type: "module",
deno: true,
});
worker.postMessage({ filename: "./log.txt" });
但它似乎不能满足我的需求,因为我特别需要从字符串(或至少从运行时传递的任意函数)动态初始化工作程序。
有什么方法可以在 Deno 中完成我需要做的事情吗?
编辑:我确实设法在文档中找到了这个页面(出于某种原因,Deno 的文档无法在搜索引擎中找到结果),尽管这不是个好兆头,因为听起来没有办法我需要做什么
https://deno.land/manual/runtime/web_platform_apis#web-worker-api
Deno 目前不支持“经典”worker。
-
type
: A DOMString
specifying the type of worker to create. The value can be classic
or module
. If not specified, the default used is classic
.
-
Currently Deno supports only module
type workers; thus it's essential to pass the type: "module"
option when creating a new worker.
对于您的用例,您可以使用 data URL。例如:
new Worker(
`data:text/javascript;base64,${btoa(
`console.log("hello world"); self.close();`
)}`,
{ type: "module" }
);
中提供的信息是正确的,但您不需要数据 URL:您只需将 { type: "module" }
添加到您的 worker 实例化选项中。 Deno 甚至支持 TypeScript 作为您的 worker 的来源:
blob-worker.ts
:
const workerModuleSource = `
const version: string = Deno.version.deno;
console.log(\`Hello from Deno v${version}\`);
self.close();
`;
const blob = new Blob(
[workerModuleSource],
{type: 'application/typescript'},
);
const objUrl = URL.createObjectURL(blob);
const worker = new Worker(objUrl, {
deno: true,
type: 'module',
});
URL.revokeObjectURL(objUrl);
$ deno run --unstable blob-worker.ts
Hello from Deno v1.14.1
我想像这样创建一个 Web Worker:
const blob = URL.createObjectURL(new Blob([`
...
`], {type: 'text/javascript'}))
const worker = new Worker(blob)
但是在 Deno 中这样做时我得到:
error: Uncaught NotSupported: Classic workers are not supported.
const worker = new Worker(blob)
^
我用谷歌搜索了这条消息“不支持 Classic worker”,但我基本上没有发现任何内容来解释它背后的历史或它的具体含义。我发现了一些关于创建工人的特殊 Deno 方法:
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
type: "module",
deno: true,
});
worker.postMessage({ filename: "./log.txt" });
但它似乎不能满足我的需求,因为我特别需要从字符串(或至少从运行时传递的任意函数)动态初始化工作程序。
有什么方法可以在 Deno 中完成我需要做的事情吗?
编辑:我确实设法在文档中找到了这个页面(出于某种原因,Deno 的文档无法在搜索引擎中找到结果),尽管这不是个好兆头,因为听起来没有办法我需要做什么 https://deno.land/manual/runtime/web_platform_apis#web-worker-api
Deno 目前不支持“经典”worker。
-
type
: ADOMString
specifying the type of worker to create. The value can beclassic
ormodule
. If not specified, the default used isclassic
. -
Currently Deno supports only
module
type workers; thus it's essential to pass thetype: "module"
option when creating a new worker.
对于您的用例,您可以使用 data URL。例如:
new Worker(
`data:text/javascript;base64,${btoa(
`console.log("hello world"); self.close();`
)}`,
{ type: "module" }
);
{ type: "module" }
添加到您的 worker 实例化选项中。 Deno 甚至支持 TypeScript 作为您的 worker 的来源:
blob-worker.ts
:
const workerModuleSource = `
const version: string = Deno.version.deno;
console.log(\`Hello from Deno v${version}\`);
self.close();
`;
const blob = new Blob(
[workerModuleSource],
{type: 'application/typescript'},
);
const objUrl = URL.createObjectURL(blob);
const worker = new Worker(objUrl, {
deno: true,
type: 'module',
});
URL.revokeObjectURL(objUrl);
$ deno run --unstable blob-worker.ts
Hello from Deno v1.14.1