姓名:"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。

  1. 来自 Worker() - Web APIs | MDN:

    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.

  2. 来自 Workers | Manual | Deno:

    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