不引人注目的JavaScript:HTML代码顶部或底部的<script>?

e-s*_*tis 88 javascript optimization performance coding-style

我最近阅读了雅虎宣言加速你的网站的最佳实践.他们建议我们尽可能将JavaScript包含在HTML代码的底部.

但究竟何时何地?

我们应该在收盘前</html>还是之后放?最重要的是,我们什么时候应该把它放在这个<head>部分?

dom*_*ell 85

真正不引人注目的脚本有两种可能性:

  • 通过head部分中的脚本标记包含外部脚本文件
  • 包括一个外部脚本文件,通过身体底部的脚本标签(之前</body></html>)

第二个可能会更快,因为最初的雅虎研究表明,一些浏览器尝试在脚本文件到达脚本标签时加载脚本文件,因此在完成之前不会加载页面的其余部分.但是,如果您的脚本具有"就绪"部分,该部分必须在DOM准备就绪后立即执行,您可能需要将其置于头部.另一个问题是布局 - 如果您的脚本要更改您希望尽早加载的页面布局,那么您的页面不会花费很长时间在用户面前重绘自己.

如果外部脚本站点位于另一个域(如外部窗口小部件)上,则可能值得将其放在底部以避免延迟加载页面.

对于任何性能问题,请执行您自己的基准测试 - 在完成研究时可能会出现的情况可能会因您自己的本地设置或浏览器更改而发生变化.

  • 关于具有"准备"部分的脚本.将该脚本放在正文的底部可以保证DOM已经准备好被操作,如果你把它放在头部,你必须将它包装起来以便它等待DOMReady(或类似的)事件 (13认同)
  • @Juan是的,但是通过将脚本置于底部,您将DOMReady事件延迟了浏览器解析文档并处理头元素(200-500ms)所需的时间,然后才会请求该脚本.主要是在第一页加载(假设它可以从那里缓存).而如果你把它放在头部.它可能会更快地准备好.因此,考虑到HTML5,如果脚本在DOM准备就绪时必须修改布局,那么现在最好使用头部的"异步"或"延迟"脚本. (4认同)

Era*_*rin 31

它永远不会如此剪切和干燥 - 雅虎建议将脚本放在结束</body>标记之前,这会产生错误,即页面在空缓存上加载速度更快(因为脚本不会阻止下载文档的其余部分).但是,如果您想要在页面加载时运行某些代码,它将仅在整个页面加载后开始执行.如果您将脚本放在<head>标记中,它们将在之前开始执行 - 因此在已准备好的缓存中,页面实际上看起来会加载得更快.

此外,将脚本放在页面底部的权限并不总是可用.如果需要在视图中包含依赖于库或之前加载的其他JavaScript代码的内联脚本,则必须在<head>标记中加载这些依赖项.

总而言之,雅虎的建议很有意思,但并不总是适用,应根据具体情况加以考虑.

  • @Juan obstrusive Javascript意味着UI在没有它的情况下被破坏,或者它被嵌入到标记中.`<script>`标签与标记分开,可以与增强界面但不是必需的代码一起使用.所以内联`<script>'标签没有任何本质上的突兀. (4认同)
  • 1.我的名字是Eran而不是Eric,2.当您想要从服务器端语言向Javascript传递数据时,例如在循环中,您可以使用`<script>`标签将这些值编码为javascript变量,可能与内联编辑或其他类似行为一起使用. (3认同)

Laz*_*low 20

正如其他人所说,将它放在关闭 html标签之前.

有一天,我们接到客户的大量电话,抱怨他们的网站非常慢.我们在本地访问了他们,​​发现他们花了20-30秒来加载一个页面.认为服务器性能不佳,我们登录了 - 但是web和sql服务器的活动都是~0%.

几分钟后,我们意识到外部网站已关闭,我们正在链接到Javascript跟踪代码.这意味着浏览器正在访问站点头部脚本标记,并等待下载脚本文件.

因此,至少对于第三方/外部脚本,我建议将它们作为页面上的最后一件事.然后,如果它们不可用,浏览器至少会加载页面直到那一点 - 并且用户将忘记它.

  • 很酷的故事兄弟:)但是说真的,这是我见过的最有说服力的论点,它将脚本标签放在页面底部. (10认同)

Luk*_*e W 16

总结一下,基于以上建议:

  1. 对于外部脚本(Google分析,第三方营销跟踪器等),请将它们放在</body>标记之前.
  2. 对于影响页面布局的脚本,请放在头部.
  3. 对于依赖于"dom ready"(如jquery)的脚本,请考虑放置之前,</body>除非您有将脚本放在头部的边缘情况.
  4. 如果存在具有依赖项的内联脚本,请将所需脚本放在头部.


Lau*_*ung 5

不,它不应该在</html>那之后无效.放置脚本的最佳位置就在之前</body>

这基本上是因为大多数浏览器在评估您提供的脚本时停止呈现页面.因此可以将非阻塞代码放在页面的任何位置(我主要考虑将onLoad事件附加到事件的事情,因为事件绑定非常快,以至于实际上是免费的).这里的一个重要杀手就是在页面的开头添加一些广告服务器脚本,这可以防止在广告完全下载之前加载任何页面,从而使您的页面加载次数增加

  • 希望吉姆是讽刺的 - 无论如何,不​​要接受他的建议.格式良好的XHTML需要为每个元素关闭标记,包括body和html标记.如果您的代码不是有效的XML,那么您做错了. (9认同)
  • 不,我不是在讽刺.看看这个问题.它指定HTML,而不是XHTML.确实有效的XHTML需要这些东西,但有效的HTML不需要.选择HTML并省略这些元素类型的结束标记绝对没有错. (6认同)

ska*_*man 5

如果你想修改你的脚本的位置,YSlow是一个伟大的工具,如果它会改善或损害性能,给你一个味道.将javascript放在某些文档位置可能会导致页面加载时间过长.

http://developer.yahoo.com/yslow/