为啥 iframe 这么慢?

Posted

技术标签:

【中文标题】为啥 iframe 这么慢?【英文标题】:Why are iframes so slow?为什么 iframe 这么慢? 【发布时间】:2010-11-08 16:32:50 【问题描述】:

我有更长一点的问题要问你 - 但希望答案会很简单:)

假设我有一个非常简单的页面,带有链接和 iframe(仅用于简单示例)。

<body>
    <a href="test.html" target="mframe">open link></a>
    <iframe name="mframe" [params] />
</body>

因此,当您单击链接时,它将在框架中加载 test.html。

现在我将使用 div 和 ajax 调用更改 iframe。

<body>
    <a href="doAjaxCall('test.html')">open link</a>
    <div id="main-content"></div>
</body>

doAjaxCall 将简单地使用 GET ajax requset 来获取整个响应,解析它(使用 javascript)并抓取

标记中的内容并将其放入 main-content.innerHTML。

test.html 包含很多 html,还有 css 样式(但与父页面上的样式相同 - 所以我在使用 ajax 解决方案时不需要它们)。

问题:

为什么这个 ajax 解决方案这么快?我仍在下载相同数量的数据(下载整个 test.html)。

为什么 iframe 解决方案这么慢?是因为浏览器必须再次解析所有可能的样式吗?还是 iframe 的其他开销?

【问题讨论】:

您是否在多个浏览器中看到相同的行为? 其实我的例子很简单。 :) 实际上,我正在一个更大的站点上尝试此解决方案,我们现在正在使用 iframe。我已经删除了它们并用那个 ajax 解决方案替换它们。正如我所写,我只是用 ajax 调用替换了链接,但流量仍然相同。是的,在每个浏览器(IE/FF/CH/SAF)中它肯定更快。我现在看到的唯一原因是浏览器不需要一次又一次地加载样式,只需替换“main-content”div 的 innerHTML。谢谢!帕沃尔。 如果您的样式表位于通过链接标签调用的专用 css 文件中,那么浏览器应该利用缓存并且只加载一次。顺便说一句,我很好奇你的 iframe 有多慢 - 我们说的是毫秒,对吧? 【参考方案1】:

您几乎走在正确的轨道上。 iframe 会变慢,因为浏览器会有额外的开销(渲染它,维护它的实例和对它的引用)。

ajax 调用会更快一些,因为您获取数据然后注入它,或者用它做任何您想做的事情。 iframe 需要在浏览器内存中构建一个全新的“页面”,然后将其放入页面中。

【讨论】:

6 年后,这仍然是准确的评估吗? @donohoe 是的,即使 7 年后情况依然如此 再过 3 年,我相信仍然适用。 一年还是一样 ...还有一个【参考方案2】:

Steve Souders 在他的高性能网站博客上发布了 Using Iframes Sparingly 的帖子,可能会提供更多见解。

【讨论】:

【参考方案3】:

尽管自 2009 年以来浏览器有所改进,但事实上浏览器需要访问其他服务器(假设 iframe 用于第三方内容)或再次访问本地服务器(假设 iframe 用于本地内容),这仍然会影响页面性能。一般来说,额外的 HTTP 请求总是会对页面的性能产生影响。如果可以在页面加载后构建 iframe 并渲染 iframe 的内容,这将改善初始页面加载。但是,我认为这会在 iframe 加载其他内容时影响页面性能。

【讨论】:

以上是关于为啥 iframe 这么慢?的主要内容,如果未能解决你的问题,请参考以下文章

JS iFrame 加载慢怎么解决

iframe的应用量还是这么大

为啥前端尽量少用iframe

为啥前端尽量少用iframe

为啥 iframe.contentWindow == null?

为啥 iframe 比 body 大? iframe在100vh时添加垂直滚动条[重复]