无论如何都要保留脚本的执行顺序,这些脚本混合了“延迟”和#39;还是内联?
例如。考虑以下情况 -
<head>
<script src="/polyfills.js" />
<script>
// Small inline script that needs polyfills to work
</script>
<script src="/feature1.js" defer>
<script src="/feature2.js" defer>
</head>
我的目标是使所有脚本都具有defer
行为并维护执行顺序。但是,在这里,我无法将defer
添加到polyfills脚本中,因为这样做会破坏内联脚本。
polyfills (defer) => inline-script (how?) => feature1 => feature2
内联脚本是一个很小的代码片段,不值得浪费请求。
我是否可以编写一个函数来包装内联脚本,并且只有在polyfill加载后执行才会执行?
答案 0 :(得分:2)
如果你希望它保留夹心内联脚本的顺序,那么,关于推迟,我认为你被塞满了。
如果所有三个src'd脚本都被延迟,那么就没有自然发生的中间事件(在polyfill之后但在功能之前)触发处理程序 - 这就是你想要的。
对于记录,这里是如何延迟内联脚本,直到所有延迟脚本都已加载,这可能会带来一些好处,但没有你想要的那么多。
<head>
<script src="/polyfills.js" defer></script>
<script src="/feature1.js" defer></script>
<script src="/feature2.js" defer></script>
<script>
window.addEventListener('load', function() {
// Small inline script that needs polyfills to work
});
</script>
</head>
答案 1 :(得分:1)
由于defer属性仅适用于带有src的外部脚本标记。以下是您可以对内联脚本进行模仿延迟的操作。使用DOMContentLoaded事件。
<script src="/polyfills.js" defer></script>
<script src="/feature1.js" defer></script>
<script src="/feature2.js" defer></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
// Your inline scripts which uses methods from polyfills.js.
});
</script>
这是因为,在完全加载延迟属性脚本后,DOMContentLoaded事件将触发。您可能不必等待“加载”#39;事件
这是你能做的最接近的事。
答案 2 :(得分:0)
根据this answer,在技术上是可行的,只要您愿意对脚本进行base64编码并将其设置为数据源即可。如果出现问题,这将是调试的噩梦,但如果您有一个小的内联片段,必须按正确的延迟顺序包含 ,这可能是您的唯一选择。