Javascript内联脚本和延迟脚本的执行顺序

Javascript内联脚本和延迟脚本的执行顺序,javascript,Javascript,我有一个关于混合脚本类型的执行顺序的问题 这是我的密码: <script> if(document.documentMode) { const firstScriptInDOM = document.getElementsByTagName('script')[0]; const polyfill = document.createElement('script'); polyfill.

我有一个关于混合脚本类型的执行顺序的问题

这是我的密码:

    <script>
        if(document.documentMode) {

            const firstScriptInDOM = document.getElementsByTagName('script')[0];
            const polyfill = document.createElement('script');
            polyfill.src = "/static/js/polyfills/polyfills.js";
            firstScriptInDOM.parentNode.insertBefore(polyfill, firstScriptInDOM);
        }
    </script>

    <script src="static/js/lib1.js" defer></script>
    <script src="static/js/lib2.js" defer></script>
    <script src="static/js/lib3.js" defer></script>
    <script src="static/js/myOwnScriptFile.js" defer></script>

if(document.documentMode){
const firstScriptInDOM=document.getElementsByTagName('script')[0];
const polyfill=document.createElement('script');
polyfill.src=“/static/js/polyfills/polyfills.js”;
firstScriptInDOM.parentNode.insertBefore(polyfill,firstScriptInDOM);
}
如果浏览器是IE,则第一个脚本标记的目的是为IE加载多边形填充。 然后它应该加载其他脚本并执行我的代码

我的问题是:polyfills脚本会阻止延迟脚本的执行吗?


非常感谢您抽出时间

未延迟的脚本将在解析时运行。 其他脚本将在文档按照它们在文档中出现的顺序解析后执行,然后再触发DOMContentLoaded

更新 凯伊多是正确的,我的结论是错误的。 脚本中添加多边形填充的部分将首先运行,但它加载的脚本将在下载后立即异步运行。 你可以看到更多的细节


您可以尝试使用。

脚本同步加载,除非指定使用
async
属性异步加载,否则
defer
属性的作用是仅在加载DOM后加载脚本。如果动态附加脚本,它将异步加载

在您的场景中

这应该是执行链:

  • 检查polyfill脚本是否执行
  • lib1
  • lib2
  • 溴化锂
  • myOwnScriptFile
  • polyfills(仅在解析器完成执行后下载)
为了确保您的所有脚本都能按您希望的顺序加载,您可以使用以下内容动态加载所有脚本:

检查浏览器是否为IE:

IF IE 
 load polyfills, and load other scripts in the onload event of the polyfills script.
ELSE 
 load all other scripts

问题:您的第一个脚本:if(document.documentMode){const firstScriptInDOM=document.getElementsByTagName('script')[0];const polyfill=document.createElement('script');polyfill.src=“/static/js/polyfills/polyfills.js”;firstScriptInDOM.parentNode.insertBefore(polyfill,firstScriptInDOM);}是myOwnScriptFile.js脚本的源代码吗?不,不是。如果需要,我的第一个脚本只加载IE的polyfill。myOwnScriptFile.js是我的主脚本,包含所有浏览器的代码(包括需要时已填充的IE)。有趣…这可能是随机的吗?通过DOM manips插入的脚本是异步加载的。因此,如果加载它比解析DOM花费的时间少,它们以前会触发吗?…无论如何,不要依赖于此,它们不会被执行的可能性更大。解决方案是:为每个人加载polyfill,或者从中加载所有脚本DOM manips(如果需要,您可以等待polyfills.onload)有趣的Kaido。我将进行一些测试。我不想为不需要它的浏览器加载额外的文件:(谢谢你的回答。你对@kaido上面的评论有什么看法?谢谢!我会看一下文档。写信看看我是否能让它工作。哦,那对我想做的事情不太好。那么有没有一个解决方案可以避免现代浏览器加载polyfills.js呢?@Mourtazag在回答中添加了一个基本的想法。:)非常感谢!我会深入研究。:)