自从我第一次尝试了网络工作者以来,我一直在努力为他们找到一个真正的用例。与它们的通信不像传递对象或引用那样容易,它们没有窗口对象,所以我不能使用JQuery,并且增加接口的复杂性不值得保存在主线程上。因此,我剩下的所有选项基本上都是通过大型阵列工作的,以获得性能优势。
[今天,我考虑过按window.open()
打开一个新窗口,并使用新创建的窗口对象执行一些任务,并将结果传递回主窗口。我甚至应该可以通过访问新窗口中的window.opener
变量来访问主窗口的DOM。
window.opener
变量从新窗口访问主窗口的DOM并承担从主线程创建新DOM元素的负担吗?这真的会给我带来性能优势吗?
否,只要您可以访问window.opener
或将对象从一个选项卡访问到另一个选项卡,这意味着它们共享javascript解释器的相同实例,并且javascript解释器是单线程的。
实际上,没有(实用的)解决方案。您要么具有单独的线程,要么共享相同的对象。
除了更复杂的调试之外,还有关于这个想法的警告吗?
主要警告:它不起作用。另请注意:单独的窗口可能不适合生产。
我可以使用
window.opener
变量从新窗口访问主窗口的DOM并承担从主线程创建新DOM元素的负担吗?
您可以,但是您可能应该使用正确的文档实例来调用document.createElement
。
因此,我剩下的所有选项基本上都是通过大型阵列工作以获得性能优势。
这正是工作人员的目的,除非您要处理大量原始数据,否则它们可能不是解决您问题的方法。
如果创建DOM节点时性能下降,则很可能是在做错误的事情。请记住:
createDocumentFragment
存在用于在添加自包含元素组之前创建它们。innerHTML
使DOM重新平衡其中HTML编码的树new Text
或document.createTextNode
可用于填写没有innerHTML
的文本您还应该使用开发人员工具来分析代码,以查看性能瓶颈在哪里。 WebWorker用于数据处理(例如,在上传之前调整图像大小),而不用于DOM操作。
最后一点:到2019年底,“ 我无法使用jQuery”不再是问题。现在,我们拥有document.querySelector
和CSS动画,它们过去都是jQuery的主要用法。