URL.createObjectUrl() 如何成为模块?

问题描述 投票:0回答:1

我使用 Web Workers 一段时间了,但直到现在我才发现需要将模块导入其中。在尝试此操作时,我有点震惊地发现这在 Firefox Dev 76 中尚不可能。在查看了问题的this解决方案后,我有点不知所措。这就是我正在做的:

我有一个工作人员需要导入一个在浏览器中工作的 NodeJS 模块。该工作程序是根据给定的代码字符串生成的。因此,在生成的工作人员内部,我正在运行以下命令:

//worker
let { foo } = importScripts("http://localhost:3000/some-blob-url");

成功导入其他任何代码。我还在检测到给定代码字符串中的导入后,运行此代码以生成另一个 URL,其中包含导出我想要的模块部分的导入代码。

let blobURL = URL.createObjectURL(new Blob([importingCode], { type: 'application/javascript' }));

哪里

importingCode
是:

import { foo } from 'module';
export { foo };

然而,在

worker.js
中导入Blob URL时,我被告知导入只能发生在模块的顶层,这意味着这个创建的Blob不是一个模块(导入代码)。

给定代码 Blob,我如何将

createObjectURL
初始化为支持导入的模块。我知道我链接到的答案使用了 Webpack
require
语句,但我想在这里避免使用 Webpack。这可以做到吗?

抱歉,如果我的问题含糊不清,请告诉我,我很乐意澄清。

javascript blob web-worker es6-modules
1个回答
0
投票

您必须在工作程序中使用本机

import()
函数,这意味着这仅适用于支持具有
{type: 'module'}
:

的工作程序的浏览器
const result = await import(blobURL)

其中

blobURL
是您在示例中创建的函数,其中
import
是浏览器附带的本机函数。

Firefox 从 2023 年 6 月起终于支持工作模块:https://caniuse.com/?search=worker%20module

© www.soinside.com 2019 - 2024. All rights reserved.