HTML 中的 <script> 标记位置是否会影响网页的性能?

新手上路,请多包涵

如果脚本标记在 HTML 页面的正文上方或下方,对网站的性能有影响吗?

如果像这样在两者之间使用怎么办:

 <body>
..blah..blah..
<script language="JavaScript" src="JS_File_100_KiloBytes">
function f1() {
.. some logic reqd. for manipulating contents in a webpage
}
</script>
... some text here too ...
</body>

还是这样更好?:

 <script language="JavaScript" src="JS_File_100_KiloBytes">
function f1() {
.. some logic reqd. for manipulating contents in a webpage
}
</script>
<body>
..blah..blah..
..call above functions on some events like onclick,onfocus,etc..
</body>

还是这个?:

   <body>
    ..blah..blah..
    ..call above functions on some events like onclick,onfocus,etc..
<script language="JavaScript" src="JS_File_100_KiloBytes">
    function f1() {
    .. some logic reqd. for manipulating contents in a webpage
    }
    </script>
    </body>

不用说一切都在 <html> 标签中!!

加载时它如何影响网页的性能?真的吗?哪一个是最好的,无论是在这 3 个中还是您知道的其他一些?

还有一件事,我在谷歌上搜索了一下,从那里我去了这里:加速 网站的最佳实践 它建议 把脚本放在底部,但传统上很多人把它放在 <head> 标签在 <body> 标签之上。我知道这不是规则,但很多人更喜欢那样。如果您不相信,请 _查看此页面的源代码_!并告诉我什么是最佳性能的更好风格。

原文由 Pratik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 283
2 个回答

默认情况下,Javascript 资产倾向于阻止任何其他并行下载的发生。所以,你可以想象,如果头部有大量 <script> 标签,调用多个外部脚本将阻止 HTML 加载,从而用空白屏幕迎接用户,因为在 JS 文件完全加载 之前 不会加载页面上的其他内容。

为了解决这个问题,许多开发人员选择将 JS 放在 HTML 页面的底部(在 </body> 标记之前)。这似乎是合乎逻辑的,因为大多数时候在用户开始与网站交互之前不需要 JS。将 JS 文件放在底部也可以实现渐进式渲染。

或者,您可以选择异步加载 Javascript 文件。有很多现有的方法可以通过以下方式实现:

XHR评估

var xhrObj = getXHRObject();
xhrObj.onreadystatechange =
  function() {
    if ( xhrObj.readyState != 4 ) return;
    eval(xhrObj.responseText);
  };
xhrObj.open('GET', 'A.js', true);
xhrObj.send('');

脚本 DOM 元素

var se = document.createElement('script');
se.src = 'http://anydomain.com/A.js';
document.getElementsByTagName('head')
[0].appendChild(se);

Meebo 内嵌 JS

 var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var doc = iframe.contentWindow.document;
doc.open().write('<body onload="insertJS()">');
doc.close();

仅举几例…

注意:当前浏览器最多只能同时加载五个脚本。


对于 IEdefer 属性,您可以像这样使用:

 <script defer src="jsasset.js" type="text/javascript"></script>

设置后,此布尔属性向用户代理提供脚本不会生成任何文档内容的提示(例如,javascript 中没有“document.write”),因此用户代理可以继续解析和呈现。

2022 年更新:所有浏览器现在都接受 defer 属性。

原文由 Russell Dias 发布,翻译遵循 CC BY-SA 4.0 许可协议

所以我知道这是一个古老的讨论,但我一直在阅读有关该主题的内容并阅读 StackOverflow 上的其他答案…

实际上,将 jQuery 标记放在哪里并不重要:

最后,谈谈持久的民间传说。您可能遇到过经常重复的建议“始终将 JavaScript 放在页面底部的结束标记之前”。这曾经是真的,因为 Web 浏览器按顺序加载脚本并阻止加载和呈现,直到每个脚本完成。这不再是真的;现代浏览器进行“预加载扫描”并开始并行加载所有脚本,无论是列在 head 元素中还是在页面底部。外部 JavaScript 通常是异步加载的,并且编写为在页面加载且 DOM 准备就绪之前不会执行。在 head 元素中加载脚本不再是一个坏习惯。

http://railsapps.github.io/rails-javascript-include-external.html

原文由 reectrix 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题