我知道这是一篇旧帖子,现有的答案是真正的答案,但谈到 Iscariot 的担忧,它真的是在缓存(至少有点像)。这只是firefox的一个怪癖。也许这对那些被这个怪癖弄糊涂的其他人证明是有用的。
我用一个非常大的 javascript 文件测试了这个概念,该文件根据数万个纬度的数组定义了爱达荷州 DOT 区边界的谷歌地图多边形(未压缩的文件大小为 2,806,257,但我通过压缩过程运行它)。使用以下 javascript
// Grab polys if not already loaded
if (typeof(defaults.data.polys) === 'undefined') {
/*$.getScript('/Scripts/ScriptMaster.php?file=Districts', function () {});*/
$.ajax({
type: "GET",
url: '/Scripts/ScriptMaster.php?file=Districts',
success: function() {
defaults.data.polys = getPolys();
data.polys = defaults.data.polys;
},
dataType: "script",
cache: true
});
}
你可以看到相关的 php(你不希望实际的 Districts.js 文件在这篇文章中占用太多空间,所以这里是 ScriptMaster.php)
<?php
require_once('../settings.php');
if (!isset($_GET['file'])) die();
$file = $_GET['file'];
$doCache = $file == 'Districts';
header('Content-type: application/x-javascript');
if ($doCache) {
// This is a luxury for loading Districts.js into cache to improve speed
// It is at the top because firefox still checks the server for
// headers even when it's already cached
$expires = 7 * 60 * 60 * 24; // set cache control to expire in a week (this is not likely to change)
header('Cache-Control: max-age='.$expires.', must-revalidate');
header('Last-modified: Fri, 3 May 2013 10:12:37 GMT');
header('Expires: '.gmdate('D, d M Y H:i:s', time() + $expires).'GMT');
header('Pragma: public');
}
ob_start("compress");
require_once($file.".js");
ob_end_flush();
function compress($buffer) {
global $doCache;
if (DEV_MODE && !$doCache) return $buffer;
/* remove comments */
$buffer = preg_replace('/\/\/.+?$/m', '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer));
/* remove tabs, spaces, new lines, etc. */
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
/* remove unnecessary spaces */
$buffer = str_replace(': ', ':', $buffer);
$buffer = str_replace(' :', ':', $buffer);
$buffer = str_replace(', ', ',', $buffer);
$buffer = str_replace(' ,', ',', $buffer);
$buffer = str_replace('; ', ';', $buffer);
$buffer = str_replace(' ;', ';', $buffer);
$buffer = str_replace('{ ', '{', $buffer);
$buffer = str_replace(' {', '{', $buffer);
$buffer = str_replace('} ', '}', $buffer);
$buffer = str_replace(' }', '}', $buffer);
if ($doCache) { header('Content-Length: '.strlen($buffer)); }
return $buffer;
}
?>
重要的是要注意,在脚本之前调用 php 的标头函数甚至会执行您要打印的字符串,这与 chrome 不同,并且可能(可能,我懒得检查)其他浏览器 firefox 似乎会对服务器进行 ping在使用缓存之前检查标头。也许通过更多的研究,您可以确定这是否与 ajax 中的元素一样(可能不是)。
所以我做了五次测试运行,显示了这个脚本的加载时间,如 firebug 中所述。这是结果
#results loading the script after clearing cache (yes those are seconds, not ms)
200 OK 4.89s
200 OK 4.9s
200 OK 5.11s
200 OK 5.78s
200 OK 5.14s
#results loading the page with control+r
200 OK 101ms
200 OK 214ms
200 OK 24ms
200 OK 196ms
200 OK 99ms
200 OK 109ms
#results loading the page again by navigating (not refreshing)
200 OK 18ms
200 OK 222ms
200 OK 117ms
200 OK 204ms
200 OK 19ms
200 OK 20ms
如您所见,我的 localhost 服务器到 Web 客户端的连接不是最一致的,而且我的笔记本电脑规格有点破旧(单核处理器等等,它也有几年历史了)但重点是负载显着下降缓存加载后的时间。
[此外,如果有人对没有压缩脚本感到好奇(不像制表符、空格或新行被浪费,它必须仍然可读)需要 7-8 秒才能加载,但我不会这样做 5次]
所以不要害怕,它真的是缓存。老实说,对于只需要 ms 加载的较小脚本,您可能不会注意到 firefox 的差异;仅仅因为它检查来自服务器的标头。我之所以知道这一点,是因为从将这些标头函数从脚本末尾移动到开头的加载时间发生了变化。如果您在 php 遍历字符串之后拥有这些函数,则加载时间会更长。
希望这可以帮助!