使用新窗口代替网络工作者

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

自从我第一次尝试了网络工作者以来,我一直在努力为他们找到一个真正的用例。与它们的通信不像传递对象或引用那样容易,它们没有窗口对象,所以我不能使用JQuery,并且增加接口的复杂性不值得保存在主线程上。因此,我剩下的所有选项基本上都是通过大型阵列工作的,以获得性能优势。

[今天,我考虑过按window.open()打开一个新窗口,并使用新创建的窗口对象执行一些任务,并将结果传递回主窗口。我甚至应该可以通过访问新窗口中的window.opener变量来访问主窗口的DOM。

我的问题是:

  • 这真的会给我带来性能优势吗?
  • 除了更复杂的调试之外,还有关于这个想法的警告吗?
  • 我可以使用window.opener变量从新窗口访问主窗口的DOM并承担从主线程创建新DOM元素的负担吗?
javascript performance web web-worker
1个回答
0
投票

这真的会给我带来性能优势吗?

否,只要您可以访问window.opener或将对象从一个选项卡访问到另一个选项卡,这意味着它们共享javascript解释器的相同实例,并且javascript解释器是单线程的。

实际上,没有(实用的)解决方案。您要么具有单独的线程,要么共享相同的对象。

除了更复杂的调试之外,还有关于这个想法的警告吗?

主要警告:它不起作用。另请注意:单独的窗口可能不适合生产。

我可以使用window.opener变量从新窗口访问主窗口的DOM并承担从主线程创建新DOM元素的负担吗?

您可以,但是您可能应该使用正确的文档实例来调用document.createElement

因此,我剩下的所有选项基本上都是通过大型阵列工作以获得性能优势。

这正是工作人员的目的,除非您要处理大量原始数据,否则它们可能不是解决您问题的方法。


如果创建DOM节点时性能下降,则很可能是在做错误的事情。请记住:

  • [createDocumentFragment存在用于在添加自包含元素组之前创建它们。
  • innerHTML使DOM重新平衡其中HTML编码的树
  • [new Textdocument.createTextNode可用于填写没有innerHTML的文本
  • 如果您的页面是许多项目的可滚动表,则仅需要呈现屏幕上的那些项目。

您还应该使用开发人员工具来分析代码,以查看性能瓶颈在哪里。 WebWorker用于数据处理(例如,在上传之前调整图像大小),而不用于DOM操作。

最后一点:到2019年底,“ 我无法使用jQuery”不再是问题。现在,我们拥有document.querySelector和CSS动画,它们过去都是jQuery的主要用法。

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