在这种情况下,以什么顺序执行动态添加的脚本文件?

In what order would the dynamical added script files be executed in this case?

本文关键字:添加 脚本 文件 动态 执行 这种情况下 以什么 顺序      更新时间:2023-09-26

我在这里读到一篇文章:

https://varvy.com/pagespeed/defer-loading-javascript.html

它说我应该用这样的东西来加载javascript:

<script type="text/javascript">
function downloadJSAtOnload() {
  var element = document.createElement("script");
  element.src = "defer.js";
  document.body.appendChild(element);
}
if (window.addEventListener)window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>

我想知道,如果我有一个以上的defer.js加载,它将以什么顺序执行?

例如:

<script type="text/javascript">
function downloadJSAtOnload() {
  var element1 = document.createElement("script");
  element.src = "defer1.js";
  document.body.appendChild(element);
  var element2 = document.createElement("script");
  element.src = "defer2.js";
  document.body.appendChild(element);
}
if (window.addEventListener)window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>

defer1.js一定会在defer2.js之前执行吗?

谢谢

appendChild()同步追加脚本节点,但异步加载脚本。所以执行顺序是未定义的(它取决于网络延迟)。

我想知道,如果我有一个以上的deferred .js加载,以什么顺序将被执行?

混乱。

defer1.js一定会在defer2.js之前执行吗?

像这样动态地添加脚本时,不能保证顺序。它们会在被检索时立即运行,因此如果defer2.js被检索的速度比defer1.js快,它将首先运行。

要按顺序执行它们,您必须按顺序请求它们,这意味着您不能请求defer2.js,直到您在defer1.js上收到load事件。这意味着你下载JavaScript的速度会更慢,因为浏览器不能并行地发出请求,如果你把脚本标签放在文档的末尾,就在关闭</body>标签之前,它可以做到。


你说过你担心在pagspeed Insights上得到不太完美的分数。别担心。不管你的链接文章说什么,PageSpeed Insights足够聪明,知道script标签在关闭</body>标签之前不会造成任何加载时间问题。例如,如果您为JavaScript提供适当的缓存头,则该页面的pagesspeed Insights将获得100/100:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Testing</title>
<meta name=viewport content="width=device-width, initial-scale=1">
<style>
body {
    font-size: 16px;
}
</style>
</head>
<body>
<p>Testing 1 2 3.</p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="script1.js"></script>
<script src="script2.js"></script>
</body>
</html>

(其中script1.jsscript2.js有一点jQuery代码在他们。)

当然,在可能的情况下,避免使用多个脚本(例如,如果可以的话,将上面的script1.jsscript2.js合并;关于是否在合并后的文件中包含jQuery或使用CDN(如上所述),存在争议。

defer1.js这个脚本将先加载,然后加载defe2 .js这一次加载等等