我正在用js编写一个html解析器,该解析器可以处理和操纵许多节点。
我想分摊开销,以免导致UI冻结。
我考虑过使用Web Worker,但是它没有DOM访问权限,所以目前我在循环中使用setTimeout(0)
来冻结UI,但是我考虑过创建多个空白iframe并使用其窗口上下文来执行此任务。
我的问题是,是否真的将其视为独立的执行上下文并且与主上下文并行运行,否则它仍将冻结主UI?
答案 0 :(得分:1)
是的,iframe中的JavaScript在其自己的线程中运行,它不会阻止父窗口。它主要类似于单独的窗口或选项卡,主要区别在于它是在父框架中呈现的,并且可以使用window.parent
引用父框架。
答案 1 :(得分:0)
这实际上取决于浏览器。例如,由于计算开销,移动浏览器不太可能将不同的嵌入式 iframe 放在单独的线程/进程中。
但是从 2021 年初开始,现在有了(名称怪异的)Origin-Agent-Cluster
标头,它允许您明确地为 iframe 请求专用资源。它目前在 Chrome (88+) 上得到支持,并得到了 Mozilla 和 Safari 的好评。
Origin-Agent-Cluster 是一个新的 HTTP 响应头,它指示浏览器防止同站跨源页面之间的同步脚本访问。浏览器也可能使用 Origin-Agent-Cluster 作为提示,表明您的源应该获得自己的、独立的资源,例如专用进程。
<块引用>[...] 例如,如果 https://customerservicewidget.example.com
期望使用大量资源进行视频聊天,并且将嵌入到整个 https://*.example.com
的各种来源,维护该小部件的团队可以使用 Origin -Agent-Cluster 标头以尝试降低它们对嵌入器的性能影响。
要使用 Origin-Agent-Cluster 标头,请将您的 Web 服务器配置为发送以下 HTTP 响应标头:Origin-Agent-Cluster: ?1
?1
的值是布尔真值的结构化标头语法。< /p>