Javascript 各种类型的加载与执行顺序
- script src + defer - 1 - <script src="xx" defer></script> - 是否阻塞parse: 不阻塞 
 执行时机:parse结束后待js文件全部加载完成后,按照script出现的顺序执行,全部执行完触发DOMContentLoaded事件
- script type=module + src - 1 - <script type=module src='xx'></script> - 同1 
- script type=module + 代码块 - 1 
 2
 3- <script type='module'> 
 code
 </script>- 同1,虽然代码已经在本地,还是会在下个时间点的下个时间点执行 
- script src - 1 - <script src="xx"></script> - 是否阻塞parse: 阻塞, 停止parse,但是会触发preLoad 
 执行时机:停止parse,等待js文件加载完成后,如果前面没有css文件加载,立即执行js,恢复parse;如果前面有css文件加载,则等待css加载完毕,解析css完成后,立即执行js,恢复parse。preLoad 的css 的加载不会影响到js
- script src + async - 1 - <script src="xx" async></script> - 是否阻塞parse: 不阻塞, 继续parse 
 执行时机:js文件加载完成后,下一个时间点执行js(相当于setTimout(fn, 0))
- script 代码块, 前面没有css文件在加载 - 1 
 2
 3- <script> 
 code
 </script>- 是否阻塞parse: 不阻塞, 执行完代码继续parse 
 执行时机:立即执行js,执行完继续parse
- script 代码块, 前面有css文件在加载 - 1 
 2
 3- <script> 
 code
 </script>- 是否阻塞parse: 阻塞, 同4,停止parse,但是会触发preLoad 
 执行时机:待css文件加载完毕,解析完css后,立即执行js,执行完继续parse
- 动态插入的script标签 - 1 - document.append(script) - 同5,动态标签不受defer,async,type=’module’影响,全部async 
- script type=module + defer - 1 - <script type=module defer></script> - 同5,async优先级高于defer 
- script async + defer - 1 - <script src='xxx' async defer></script> - 同5 
- script 代码块 + defer - 1 
 2
 3- <script defer> 
 code
 </script>- script代码块不支持 defer,同6或7 
- script 代码块 + async - 1 
 2
 3- <script async> 
 code
 </script>- script代码块不支持 async,同6或7 
- script 代码块 + src - 1 
 2
 3- <script src='xxx'> 
 code
 </script>- 忽略代码块中的code,优先src