script 的 async、defer 和 module 有什么区别?
参考答案
普通外部经典脚本通常阻塞 HTML 解析,直到下载和执行完成。defer 允许并行下载,在文档解析后按顺序执行,并在 DOMContentLoaded 前完成;async 下载完成即可执行,不保证与其他 async 脚本的先后顺序。
模块脚本默认具有类似延后的执行特性,同时按模块依赖图加载。给模块脚本添加 async 会改变等待行为。具体事件时序还可能受到依赖、顶层 await 与动态插入方式影响。
独立统计脚本可以考虑 async;依赖 DOM 或前后脚本顺序的经典脚本更适合 defer。动态创建脚本不应照搬静态标签的所有假设,遇到竞态要显式管理依赖而不是依赖下载速度。