如何加载webpack捆绑包asynchronous,但按顺序执行?

我有两个webpack包, main.jsvendor.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' /> 

如果您同时指定asyncdefer那么如果浏览器支持,则它们将是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中可用。