你必须赞赏 Surma 的毅力。多年来,他一直倡导将 Web Worker 作为构建更流畅网站的途径 多年来。他 再次 确保我们都了解其现状
[…] 无论你往哪里看,多线程都已无处不在。iOS 使开发人员能够轻松地使用 Grand Central Dispatch 并行化代码,Android 通过其新的统一任务调度程序 WorkManager 执行此操作,而像 Unity 这样的游戏引擎则具有 作业系统。所有这些平台不仅支持多线程,而且使其尽可能易于使用的原因始终相同:确保您的应用程序感觉很棒。
Surma,“2021 年 Web Worker 的现状”
因此,几乎每个平台都有自己的多线程版本,包括 Web。只是在 Web 上,我们必须通过使用 Web Worker(如果您想知道,它们是“普遍支持的”)来“对抗”JavaScript 的单线程特性。问题是:如何以及为了什么使用它们?对于后者,Surma 展示了一个游戏的示例,其中“整个应用程序状态和游戏逻辑都在一个 worker 中运行”。对于前者,辅助库 comlink 看起来大大减少了工作量。
就我个人而言,我希望流行的工具能够自动执行这些操作。我不知道这到底是什么样子,但感觉开发人员推广并没有真正推动这方面的发展。如果像 Apollo 这样的流行工具(它负责大量“应用程序状态”)能够神奇地处理主线程之外的所有这些操作会怎样?这有道理吗?这可能吗?
为了回答你的最后一个问题,“这可能吗?”,我想说,当然可以。最终,使用 worker 就像任何其他异步过程一样,你启动它并等待响应。假设你有一种方法来处理例如
fetch
或localStorage
的异步状态,那么你应该在将 worker 集成到其中时遇到最小的麻烦。我一直在使用它们来处理相当大的数据集,并且取得了巨大的成功,并且在将来进行类似项目时可能会更加依赖它们。与我之前“将数据数组分解并将其分成小批处理,并在中间使用
setTimeout
向浏览器让出控制权”的方法相比,改进之处不言而喻!任何想要在 Web 前端尝试多线程的人,都已经有一个框架可以做到这一点。性能绝对令人难以置信。
请尝试一下并查看它。
https://github.com/neomjs/neo
谢谢 Sebastian!
关于 neo.mjs 项目
关键概念是“应用程序 worker 作为主要参与者”,这非常符合 Surma 的 Actor 模型理念。
简而言之:你的应用程序(包括组件)都存在于一个应用程序 worker 中,这使得主线程尽可能空闲。它们创建 worker 设置,将与 UI 相关的 DOM 事件转发到应用程序 worker,并应用来自虚拟 DOM worker 的增量更新。
你可以为 SPA 使用专用 worker,或者为多窗口应用程序使用共享 worker。
最新添加的是一个离屏画布 worker
https://tobiasuhlig.medium.com/rendering-3d-offscreen-getting-max-performance-using-canvas-workers-88c207cbcdc2?source=friends_link&sk=7ee0851ff6043c4a79248ff5a20a23fc
此致,
Tobias