Saya ingin membuat Web Worker seperti:

const blob = URL.createObjectURL(new Blob([`
  ...
`], {type: 'text/javascript'}))
const worker = new Worker(blob)

Tetapi ketika melakukannya di Deno saya mendapatkan:

error: Uncaught NotSupported: Classic workers are not supported.
    const worker = new Worker(blob)
                   ^

Saya telah mencari di Google pesan ini "Pekerja klasik tidak didukung" dan pada dasarnya saya tidak menemukan apa pun yang menjelaskan sejarah di baliknya atau apa artinya secara spesifik. Saya telah menemukan sedikit tentang cara Deno khusus untuk membuat pekerja:

const worker = new Worker(new URL("worker.js", import.meta.url).href, {
  type: "module",
  deno: true,
});
worker.postMessage({ filename: "./log.txt" });

Tetapi tampaknya tidak memenuhi kebutuhan saya karena saya secara khusus perlu menginisialisasi pekerja secara dinamis dari string (atau setidaknya dari fungsi arbitrer yang diteruskan saat runtime).

Apakah ada cara untuk melakukan apa yang perlu saya lakukan di Deno?

Sunting: Saya berhasil menemukan halaman ini di dokumen (dokumen Deno mengalami kesulitan memunculkan hasil di mesin pencari, untuk beberapa alasan), meskipun itu bukan pertanda baik karena sepertinya tidak ada cara untuk melakukan apa yang saya butuhkan melakukan https://deno.land/manual/runtime/web_platform_apis#web-worker- api

1
brundolf 22 September 2021, 03:46

2 jawaban

Jawaban Terbaik

Deno saat ini tidak mendukung pekerja "klasik".

  1. Dari Pekerja() - Web API | MDN:

    type: DOMString< /a> menentukan tipe pekerja yang akan dibuat. Nilainya bisa classic atau module. Jika tidak ditentukan, default yang digunakan adalah classic.

  2. Dari Pekerja | Panduan | Deno:

    Saat ini Deno hanya mendukung pekerja jenis module; oleh karena itu, penting untuk meneruskan opsi type: "module" saat membuat pekerja baru.

Untuk kasus penggunaan Anda, Anda mungkin dapat menggunakan URL data< /a>. misalnya.:

new Worker(
  `data:text/javascript;base64,${btoa(
    `console.log("hello world"); self.close();`
  )}`,
  { type: "module" }
);
2
mfulton26 22 September 2021, 23:03

Informasi yang diberikan dalam jawaban mfulton26 benar, tetapi Anda tidak memerlukan URL data: Anda hanya perlu menambahkan { type: "module" } ke opsi instantiasi pekerja Anda. Deno bahkan mendukung TypeScript sebagai sumber untuk pekerja Anda:

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
1
jsejcksn 22 September 2021, 23:48