jed*_*atu 53 javascript browser multithreading
Web浏览器是否在iframe中为JavaScript使用单独的执行线程?
我相信Chrome会为每个标签使用单独的线程,因此我猜测iframe中的JavaScript会与其父窗口共享相同的线程,但是,这似乎也是一种安全风险.
mxr*_*xro 19
总结其他答案:不,iFrames通常在与主页面相同的线程/进程中运行.
但是,Chromium团队似乎正在进一步孤立这个领域:
Chromium问题99379:进程中的iframe [抱歉,链接不起作用 - 如果你能找到有效问题的链接,请告诉我]
Rob*_*key 18
在Chrome出现之前,任何浏览器的所有选项卡都共享同一个JavaScript线程.Chrome在这里加强了游戏,其他一些人也纷纷效仿.
这是一个浏览器实现细节,因此没有可靠的答案.旧版浏览器肯定不会.我不知道任何浏览器肯定使用iframe的另一个线程,但说实话,我从来没有真正调查过它.
这不是安全风险,因为线程执行不会带来任何对象.
Rel*_*ros 11
在检查任何现有答案之前,我今晚自己也有同样的问题.在我正在工作的项目中,我们必须加载一个使用不同框架的iFrame,如果iFrame可能以某种方式阻止线程并影响我的应用程序,那我就很好奇.答案是肯定的,它可以.
我的测试是在Chrome中完成的.在父母我加载了一个孩子iFrame.在父级中,我每隔金额时间为console.log设置一个文本间隔.然后在iFrame中我使用了超时来启动阻止线程的'while'.答案:iFrame使用相同的线程.
例:
在父母:
setInterval(() => {
console.log('iFrame still using the thread');
}, 3000)
Run Code Online (Sandbox Code Playgroud)
在iFrame中:
setTimeout(() => {
console.log('now the thread is not working in the iFrame anymore');
while (true) {
}
}, 10000)
Run Code Online (Sandbox Code Playgroud)
joe*_*joe 10
现在的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
是布尔 true 值的结构化标头语法。
更多详细信息请参见: https: //web.dev/origin-agent-cluster/
最近测试了在iFrame中运行的JavaScript是否会阻止JavaScript在父窗口中运行。
与父级位于同一域的iFrame:
作为父域在其他域上的iFrame
parent.html:
<body>
<div id="count"></div>
<iframe src="./spin.html"></iframe>
<script>
let i = 0;
let div = document.getElementById("count");
setInterval(() => {
div.innerText = i++;
}, 100);
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
spin.html:
<body>
<button id="spin">spin</button>
<script>
const spin = document.getElementById("spin");
spin.addEventListener('click', () => {
const start = Date.now();
while (Date.now() - start < 1000) { }
})
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
迟到了,但是...好点,因为iframe js似乎在Firefox 16中并发.
尝试使用提醒功能(阻塞),你会看到对话框一起打开.
你不会在Chrome或IE中看到它.
iframe js可以像往常一样访问Firefox 16中的父窗口,因此我可以想到可能出现的竞争条件.
今天在Ubuntu的Chrome 28中做了一些实验.使用此命令查看Chrome的线程和进程
ps axo pid,nlwp,cmd | grep "chrome"
看起来Chrome不会为iframe生成新的线程或进程.一个有趣的说明是它确实为开发工具窗格生成了一个新进程.
特尔;博士:
只有 chrome 桌面(不,不是移动)是分离线程。
Firefox 计划在 2021H1 这样做 https://wiki.mozilla.org/Project_Fission#Milestones
我创建了一个小页面,它在主页面的间隔中运行长循环,并在主页面和 iframe 中显示动画。您可以从要查看的浏览器访问该站点。
如果较低的动画(在“crossorigin”下)不停地运行,则它有一个单独的线程。
https://eylonsu.github.io/browser_thread/
归档时间: |
|
查看次数: |
14597 次 |
最近记录: |