如何加载webpack捆绑包asynchronous,但按顺序执行?
我有两个webpack包, main.js
和vendor.js
。 显然, main.js
脚本在main.js
有很多依赖关系,必须先加载供应商。
目前,在我的HTML文档的结尾,我只是在做:
<script src={assets.javascript.vendor} charSet='UTF-8' /> <script src={assets.javascript.main} async defer charSet='UTF-8' />
这样,至lessmain.js
包被加载asynchronous。 但是,如果我将这两个捆绑包设置为asynchronous,则页面加载将根据下载/执行的顺序而随机失败。
基本上每个pagespeed工具都会抱怨vendor.js
是“呈现阻塞”,即使它在我的html文档的最后。 我不知道如何认真采取这一点,但是有没有办法设置这两个bundle加载asynchronous,但确保执行正确的顺序发生,而不做像从其他JavaScript文件等脚本标签的东西?
这对于webpack来说必定是一个常见的用例吗?
你应该使用defer
他们两个。 defer
它们将被asynchronous下载,但按照它们在文档中出现的顺序执行。 欲了解更多信息,请参阅asynchronous与延期 。
<script src={assets.javascript.vendor} defer charSet='UTF-8' /> <script src={assets.javascript.main} defer charSet='UTF-8' />
如果您同时指定async
和defer
那么如果浏览器支持,则它们将是async
如果不是,则回退为defer
(正如您可以在HTML脚本标记中同时使用asynchronous和延迟属性一样 )。
如果在执行脚本之前需要触发DOMContentLoaded,但要执行的脚本则可以尝试这种方法:
<script> function loadScript(scriptPath) { var se = document.createElement("script"); se.src = scriptPath; se.async = false; document.getElementsByTagName("head")[0].appendChild(se); } loadScript({assets.javascript.vendor}); loadScript({assets.javascript.main}); </script>
它依赖于dynamic创build的元素不会阻止渲染并将其设置为asynchronous:false表示它们将按顺序加载。 我不确定浏览器的兼容性是什么,但它在Chrome中可用。