ChatGPT解决这个技术问题 Extra ChatGPT

优点和缺点:将 javascript 放在头部并放在身体关闭之前

大多数 javascript 和 web 开发书籍/文章都说您必须将 CSS 放在 head 标记中,并将 javascript 放在页面底部。

但是当我打开像这个stackoverflow这样的著名网站的html源时,我发现他们在head标签中放了一些js文件。

两种方法的优缺点是什么,何时使用哪种方法?

为同一问题找到另一个问题: Where should I declare JavaScript files used in my page? In <head></head> or near </body>?


D
David Johnstone

来自 Yahoo 的 Best Practices for Speeding Up Your Web Site

脚本引起的问题是它们会阻止并行下载。 HTTP/1.1 规范建议浏览器每个主机名并行下载不超过两个组件。如果您从多个主机名提供图像,则可以同时进行两次以上的下载。但是,在下载脚本时,浏览器不会启动任何其他下载,即使在不同的主机名上也是如此。在某些情况下,将脚本移到底部并不容易。例如,如果脚本使用 document.write 插入部分页面内容,则不能将其移至页面下方。也可能存在范围问题。在许多情况下,有一些方法可以解决这些情况。经常出现的另一种建议是使用延迟脚本。 DEFER 属性指示脚本不包含 document.write,并且是浏览器可以继续呈现的线索。不幸的是,Firefox 不支持 DEFER 属性。在 Internet Explorer 中,脚本可能会被延迟,但不会像期望的那样延迟。如果可以推迟脚本,也可以将其移至页面底部。这将使您的网页加载速度更快。

因此,一般情况下,最好将它们放在底部。然而,这并不总是可能的,而且它通常不会产生太大的影响。


我有一个在画布上移动正方形的示例,如果我将 javascript 放在 HTML 的头部,它将无法工作。声明 Canvas 后,它必须位于正文的底部。这是否有原因,或者我将如何将我的所有 Javascript 保存在文件的 部分中。
@DougHauf 不确定我是否准确,但您是否添加了 DOMContentLoaded 侦听器?我问是因为如果你的脚本在底部并且它渲染到画布上就好了;这是因为在您尝试写入之前,画布已经加载到屏幕上。现在,如果您将脚本放在标题中,它不会绘制到画布上,因为画布还不存在。因此,如果您添加侦听器,它将在画布加载后触发您的画布代码。
我不知道您引用的文档有多旧,但它似乎是 the defer attribute has been supported in Firefox for quite some time
谢谢,这对我帮助很大
A
AHM

正如其他人所说,当您将 javascript 放在头部时,它会延迟页面的呈现,直到脚本加载后,这意味着页面可能需要更长的时间来加载 - 特别是如果您正在下载大型脚本文件。

如果您将脚本标签移动到页面末尾,您将确保浏览器在脚本标签之前下载图像和样式表,并且页面可能会在脚本开始运行之前呈现。这也意味着,如果您依赖于脚本中的某些功能,则在页面对用户可见之后一段时间才能使用。

如果您正在添加样式或元素(例如,使用某种形式的更丰富的编辑器切换文本字段),这将对用户显示为闪烁。

如果您正在向元素添加点击事件,它们将在元素本身可见之后才可点击。

有时这些问题需要你把你的脚本放在头上,有时你把它们放在底部就可以了。

恕我直言(完全反对 YSlow 和许多聪明人),您应该将脚本保留在 head 标签中,并且大部分时间只依赖它们进行缓存。


C
Chris Love

一般来说,您应该将脚本引用放在页面底部。脚本不仅需要下载,还必须在块被释放和页面继续渲染过程之前评估和执行。像 Modernizr 这样的东西应该放在顶部,因为它会进行一些功能检测以及您可能想要的 HTML5 垫片。

您想尝试将脚本放在页面底部的另一个原因是单点故障或 SPOF。这是脚本调用超时或由于某些其他原因阻止页面执行的地方。第三方广告库等经常发生这种情况。

是的,您可能需要更加努力地考虑如何构建您的应用程序,但我发现它对我来说很快变得非常自然。在过去的 4 年里,我用底部的脚本构建了数百个 Web 应用程序,我可以分辨出其中的区别。我可能是 500 毫秒,也可能是 5000 毫秒,但这一切都很重要。


a
azamsharp

这真的取决于你的网站。如果您正在访问和调用正文中的 JavaScript 函数,则必须在标头中引用它以便加载。否则,如果您只在加载整个文档时调用 JavaScript,那么将 JavaScript 放在正文的末尾是明智的。通过将 .JS 文件放在最后,您可以加载整个页面,然后获取 .JS 文件。这样,用户将能够快速查看页面,并且当他/她熟悉页面时,.JS 文件已经下载。


D
Draemon

在页面加载之前,头部中的任何 javascript 都会被评估,这意味着页面感觉需要更长的时间来加载。如果所有的 javascript 都在最后,那么让事件正常工作会稍微困难一些,但是 jQuery 几乎可以为您解决这个问题。


你能提一下 jQuery 是如何出于兴趣解决这个问题的吗?
jQuery 有一个用于将处理程序绑定到事件的 API