【发布时间】:2011-04-25 10:01:46
【问题描述】:
我正在阅读这个How to make HTML rendering fast,它说HEAD 标记中的脚本可以被缓存。
BODY 标签中的 JavaScript 可以缓存吗?如果不是,为什么 YUI 建议将脚本放在 body 标签中?
【问题讨论】:
标签: javascript html caching progressive-enhancement
我正在阅读这个How to make HTML rendering fast,它说HEAD 标记中的脚本可以被缓存。
BODY 标签中的 JavaScript 可以缓存吗?如果不是,为什么 YUI 建议将脚本放在 body 标签中?
【问题讨论】:
标签: javascript html caching progressive-enhancement
如果 JavaScript 在外部文件中并且 the cache control headers 说它应该被缓存,它将被缓存(并在页面之间重用)。
如果它嵌入在页面本身中(即在<script> 和</script> 之间而不是在src="..." 的末尾),它可能会被缓存,但前提是整个页面都被缓存并且它不会被重用页面之间。
如果<script src="..."></script> 在头部或主体中,缓存没有区别。
【讨论】:
如果您缓存整个 HTML 页面,代码将被缓存,否则不会。如今,HTML 页面通常是动态的(由脚本和 CGI 生成),因此无法在不牺牲功能的情况下进行缓存。因此,您通常希望将 JS 代码放在外部文件中,然后可以通过为 JS 文件设置 HTTP 缓存头来缓存这些文件。
大多数情况下,答案是您无法缓存内联到 HTML 代码中的 JavaScript(在 HEAD 部分或其他部分)。要使其可缓存,您需要将其放在外部文件中,但随后浏览器将需要执行额外的 HTTP 请求才能第一次获取 JavaScript。
【讨论】:
伙计,我想你可能误解了 Rich 所说的话。 他说把 JavaScript 放到一个外部文件中,然后从头开始链接。
这与将 JavaScript 放入页面正文中的脚本标记相反。
如果 JavaScript 仅在该页面上使用,则将 JavaScript 放入页面正文中的脚本标记是合理的。事实上,如果它只使用该页面的一个,将其放入外部文件将不是一种优化。对 JS 文件的附加 GET 请求在 Firefox、Opera、Safari 上几乎是同时进行的,但在 IE6 上不是。原因是 IE6 只有几 (2) 个线程可用于获取文件,而 Firefox 最多有 16 个。这就是为什么为页面特定的代码创建一个单独的文件 将是一个倒退因为它实际上可能会减慢页面加载速度。
但是,如果您有一个想要在许多页面上使用的通用 JavaScript 文件,那么您绝对应该将它放在一个外部文件中并从头部链接它,因为它会在这些页面中的任何一个第一次被缓存时被缓存。加载,并且当任何其他页面使用它时不需要再次获取它。文件越大,缓存它的优势就越大。
我认为这就是他要表达的观点。这有帮助吗?
【讨论】: