如何根据条件加载外部 JavaScript

Den*_*gin 6 html javascript browser asynchronous pagespeed

问题是如何重写静态 HTML 脚本嵌入:

\n
<script async id="__script__id__"\n              type="text/javascript"\n              src="//abc.xyz.com/js/script.js">\n</script>\n
Run Code Online (Sandbox Code Playgroud)\n

到编程嵌入中,该嵌入允许仅在特定条件下加载脚本。

\n

悬赏是为了描述静态/程序化嵌入之间的差异而设置的,具体来说:

\n
    \n
  1. 解释当以权威引用加载和执行 \xe2\x80\x94 时,JS 规范如何处理以编程方式添加的脚本 \xe2\x80\x94。
  2. \n
  3. src通过权威参考解释将脚本嵌入从 HTML 内联转换为程序化如何影响浏览器优化(众所周知,浏览器会扫描带有属性的 HTML 脚本标签并预加载它们)。
  4. \n
\n

Our*_*rus 16

如果您已经弄清楚如何检测您的条件,则加载另一个脚本如下所示:

<head>
<!-- the usual head stuff goes here -->
<script>
// replace `criteria` with your actual criteria
if(criteria) {
  const script = document.createElement('script');
  script.id = '__script__id__';
  script.type = 'text/javascript';
  script.async = true;
  script.src = '//abc.xyz.com/js/script.js';
  document.head.append(script);
}
</script>
<!-- remaining scripts go here -->
<!-- injected script will end up here -->
</head>
Run Code Online (Sandbox Code Playgroud)

检查条件,创建元素,设置其属性,将其添加到文档中。


我尝试寻找有关此机制的详细信息。我能找到的最好的内容来自 MDN 关于脚本元素asyncdefer属性的主题:

这些属性的确切处理细节很复杂,涉及 HTML 的许多不同方面,因此分散在整个规范中。这些算法描述了核心思想,但它们依赖于HTML、外部内容XML中<script> 开始结束标记的解析规则;该方法的规则;脚本的处理;等等。document.write()

不幸的是,我对 W3 的各种 HTML 规范没有必要的熟悉程度,无法将其变成简单的英语,而且看起来需要相当多的时间才能熟悉。

  • 您实际上不必像我在这里那样设置异步。(通常也不需要设置类型,除非服务器配置错误。)动态添加的脚本是[默认情况下异步](https://javascript.info/script-async-defer#dynamic-scripts)。至于让它立即执行,请确保脚本是内联的(不是从 URL 加载)并且它显示为头部中的第一个脚本。 (3认同)