放在head中的陷阱
将

加载中
之前插入。
这种方式无需额外配置,即可实现脚本在DOM加载完成后执行,适用于大多数中小型项目,据工信部数据,采用此简单优化可使首屏加载时间减少约20%-30%。
对于大型项目或需要精确控制脚本加载顺序的场景,同步加载已无法满足需求,HTML5引入了async和defer属性,提供了更灵活的加载机制,这两种方式在现代Web开发中已成为标准实践,尤其适合处理第三方分析脚本或模块化代码。
async属性告诉浏览器立即下载脚本,但不阻塞HTML解析,脚本一旦下载完成,立即执行,这意味着多个async脚本的执行顺序是不确定的,后下载的脚本可能先执行。
defer属性同样允许浏览器在解析HTML时并行下载脚本,但脚本会在HTML解析完成后、DOMContentLoaded事件触发前按顺序执行,这是最推荐的加载方式,尤其适用于需要操作DOM的脚本。
| 加载方式 | 下载时机 | 执行时机 | 执行顺序 | 适用场景 |
|---|---|---|---|---|
| 无属性(同步) | 解析时阻塞下载 | 下载后立即执行 | 按出现顺序 | 小型内联脚本 |
| async | 并行下载 | 下载完成后立即执行 | 不确定 | 独立第三方脚本 |
| defer | 并行下载 | HTML解析完成后执行 | 按出现顺序 | 依赖DOM的主逻辑 |
在某些场景下,我们可能需要根据用户行为或页面状态动态加载JavaScript文件,这种方式可以进一步减少初始加载体积,提升性能,动态引入主要通过JavaScript代码创建script标签并插入DOM来实现。
通过JavaScript代码动态创建