6

我有一个看起来像这样的页面:

<!doctype html>
<head></head>
<body>
    <div>Content 1000 chars</div>
    <div>Content 1000 chars</div>
    <div>Content 1000 chars</div>
</body>
</html>

当客户端下载页面时,基本上他正在下载 3100 个字符。如果他再次访问该页面并且第一个 div 的内容发生更改,他将不得不再次重新下载整个页面(3100 个字符)。

现在基本上我想知道我们是否能够像处理图像一样缓存 HTML 片段?

所以我在想是否有什么地方可以达到这种效果:

 <!doctype html>
<head></head>
<body>
    <div src="page1.html"></div>
    <div src="page2.html"></div>
    <div src="page3.html"></div>
</body>
</html>

因此,如果我要更改 page1.html 的内容,浏览器将能够知道自上次访问以来仅更改了 page1.html,并下载 1000 个字符而不是整个页面 (3100) 个字符。本质上,这种行为与图像现在发生的情况相同:

 <!doctype html>
<head></head>
<body>
    <img src="img1.gif">
    <img src="img2.gif">
    <img src="img3.gif">
</body>
</html>

从而更改img1.gif将调用浏览器仅重新下载img1.gif(假设所有其他文件尚未被编辑)

需要明确的是,我不是在寻找 AJAX 解决方案。我需要一个无需 javascript 的解决方案(与上述所有示例一样)。我也不是特别赞成框架解决方案,但是如果根本没有其他选择/怪癖/黑客,我会接受这个答案

4

4 回答 4

4

你想过 IFrame 吗?

但是,我认为这是一个微优化,它不会有任何优势(除了在服务器应用程序内部缓存,这是一个完全不同的蠕虫)。

(或者你在这里谈论的方式超过 3000 个字符。)

编辑:还有另一种解决方案,但在不使用 AJAX 的情况下,HTML 文档上的任何浏览器都不支持它,并且仅在某些服务器场景中支持: HTTP Range requests。您可以使用附加标头告诉服务器仅返回特定范围的文档:

GET /large-document.html HTTP/1.1
Accept-Range: bytes
Range: bytes=0-500

响应将仅包含前 500 个字节。例如,此技术用于恢复中止的下载。

但正如我所说,这对你的场景没有帮助。一方面,没有 AJAX(或在下载管理器之外),没有浏览器支持这一点。第二,客户端不知道要请求哪个范围,以及将其放在已获取的文档中的哪个位置以替换旧部分。

如果您真的需要支持低至 IE3 和 Netscape 2 的旧版浏览器,甚至是旧版 Lynx 等旧版文本浏览器,请使用经典<frameset><iframe>. 自 Mosaic 早期以来,它基本上得到了所有方面的支持,并且当时专为这项任务而设计。(因此,当浏览器问世时,它是您寻求支持的首选工具。)

于 2011-09-14T14:54:24.617 回答
1

我能想到的在没有任何 JavaScript 的情况下实现你想要的唯一方法是使用frames。但是,框架有许多缺点,在您的网站中使用它们之前,您应该了解这些缺点。

于 2011-09-14T14:55:09.863 回答
1

现代版本的 Firefox 和 Chrome 本地执行此操作 - 它们尽可能缓存图像和代码。事实上,获得重新加载的唯一方法是在浏览器级别清除缓存。

您可能还想研究反向代理缓存,它基本上可以在站点范围内执行您正在执行的操作,以避免数据库流量。 Varnish是一个很好的选择,它可以缓存页面并且是高度可定制的。

于 2011-09-14T18:45:43.490 回答
0

我不知道做这样的优化是否合理。现代浏览器接受数据压缩(现代服务器也这样做),并且文本压缩得非常好。您必须使用输出缓冲(例如,请参阅PHP 中的 ob_start),这样服务器就不会逐块发送页面,但它会等待一段时间等待输出准备好,然后压缩并发送到客户端,客户端解压缩它。

现在非常不鼓励使用框架作为布局技术(也许 iframe 有时是一个很好的解决方案,但这取决于)。

于 2011-09-14T19:08:49.447 回答