面试题:异步加载 JS 脚本时,async 与 defer有什么区别?
在正常情况下,即 <script> 没有任何额外属性标记的情况下,有几点共识:
1.JS 的脚本分为「加载、解析、执行」几个步骤,简单对应到图中就是 fetch (加载) 和 execution (解析并执行)。2.「JS 的脚本加载(fetch)且执行(execution)会阻塞 DOM 的渲染」,因此 JS 一般放到最后头。
2.defer 加载(fetch)完成后延迟到 DOM 解析完成后才会执行(execution)**,但会在事件 DomContentLoaded 之前
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>堆代码 duidaima.com</title> </head> <body> <script src="./defer.js" defer></script> <script src="./async.js" async></script> <script> console.log('Start') document.addEventListener('DOMContentLoaded', () => { console.log('DCL') }) </script> </body> </html>「derfer.js」
console.log('Defer Script')「async.js」
console.log('Async Script')