Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在我的polyfill和其他脚本上设置defer会保证它们';按顺序重新加载?_Javascript_Asynchronous_Polyfills - Fatal编程技术网

Javascript 在我的polyfill和其他脚本上设置defer会保证它们';按顺序重新加载?

Javascript 在我的polyfill和其他脚本上设置defer会保证它们';按顺序重新加载?,javascript,asynchronous,polyfills,Javascript,Asynchronous,Polyfills,我正在使用polyfill.io为老客户进行polyfill承诺和获取。在上,他们建议使用脚本加载程序或其回调,以确保在运行现代代码之前已完全加载脚本: 我们建议在上使用async和defer属性 从polyfill服务加载的标签,但在 非阻塞方式意味着您无法确定自己的 代码将在多边形填充完成加载之前或之后执行 在尝试运行自己的多边形填充之前,请确保多边形填充已存在 代码中,可以将onload处理程序附加到 脚本标记,使用更复杂的脚本加载器,或者只需使用 callback参数,用于在执行多边形填

我正在使用polyfill.io为老客户进行polyfill承诺和获取。在上,他们建议使用脚本加载程序或其回调,以确保在运行现代代码之前已完全加载脚本:

我们建议在上使用async和defer属性 从polyfill服务加载的标签,但在 非阻塞方式意味着您无法确定自己的 代码将在多边形填充完成加载之前或之后执行

在尝试运行自己的多边形填充之前,请确保多边形填充已存在 代码中,可以将onload处理程序附加到 脚本标记,使用更复杂的脚本加载器,或者只需使用 callback参数,用于在执行多边形填充时计算全局回调 加载:

但是,在两个脚本上设置
defer
是否应该保证它们是异步加载的,但仍然按照它们在文档中的显示顺序加载(除非浏览器不支持defer)


根据
延迟
属性,只定义了脚本加载时的页面加载时间点

从您提供的文档中可以看到:

在尝试运行自己的多边形填充之前,请确保多边形填充已存在 代码,您可以将onload处理程序附加到 脚本标记

由于(正如在对本答案的评论中所指出的)无法清楚地看到是否将执行
defer
脚本(,),并且考虑到可能的浏览器实现差异,因此依赖这种行为可能不是最好的主意

因此,更好的方法是:

  • 使用一些脚本加载程序(例如)
  • 将建议的
    onload
    处理程序添加到第一个
    标记中,并创建动态
    标记以将代码加载到此处理程序中
  • 将您的代码与Promise polyfill捆绑在一起(手动或使用bundler-like)并作为单个捆绑包加载
  • 更新:正如@PeterHerdenborg在-MDN文档中指出的,现在明确指出:

    带有defer属性的脚本将按照它们在文档中的显示顺序执行


    如果你看这个答案,人们似乎相信延迟保证执行顺序。也在这里:。我之所以提到polyfill.io文档,正是因为它们的状态正好相反(但它们也在讨论defer与async的组合,这是不同的)。mozilla文档也没有对此发表任何评论。这很奇怪。我发现这可能是我的错误:正常的脚本加载过程是阻塞操作,
    async
    脚本是异步加载的,
    defer
    脚本似乎定义了开始加载的不同时间点。polyfill.io文档建议同时添加
    async
    defer
    属性,这就是他们建议添加
    onload
    处理程序的原因。我将删除我的答案以避免混淆。可以通过,有
    其他
    ->
    Mozilla开发者网络
    产品进入bug搜索/填充表单此答案中链接的MDN文档现在状态
    带有延迟属性的脚本将按照它们在文档中出现的顺序执行。
    @PeterHerdenborg谢谢,我已经更新了答案
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js" defer></script>
    <script src="modernscript.js" defer></script>