我们可以从 Web Worker 使用 JavaScript 文件系统 API 吗?

Can we use JavaScript FileSystemAPI from a Webworker?

我们可以使用网络工作者的 JavaScript FileSystemAPI 吗?

https://developer.mozilla.org/en-US/docs/Web/API/FileSystem

在他们的文档中他们没有提到任何东西,但在使用它时它的抛出 window 未定义。

谢谢!

Webworkers global object 名字是 global,不是 window。 而且没有文件系统API

不是真的...

曾经有一个 self.webkitRequestFileSystemSync() 方法可以在 Worker 作用域中访问,但它已被弃用。而且您从放置事件中获得的 FileSystem 对象无法序列化,因此无法从主线程posted 到 Worker。

但是,我怀疑您真的不想使用文件系统 API,它在 Web 上下文中并不是很有用,但您可能更喜欢 File System Access API,它让您的页面访问用户的文件系统(即使它仍然只在基于 Chromium 的浏览器中可用)。

但是从 Web Worker 使用这个 API 也并不简单。
要向文件系统访问 API 发出请求,我们需要处理用户手势。 Web Worker 无权访问 UI,因此他们也无权访问 UI 事件 (yet)。

所以我们必须从UI线程发出请求。

然而,与 FileSystem 对象相反,FileSystemHandles 是可序列化的,并且可以 posted though postMessage(),所以一旦你得到句柄,你就可以 post 它给你的工人和从那里做你的工作。

在UI线程

btn.onclick = async (evt) => {
  const dirHandle = await showDirectoryPicker();
  worker.postMessage( dirHandle );
};

然后在工作线程中,您可以在 MesageEvent.data 中接收该句柄,并像在主线程中一样使用它。

这里是live demo, and its source.