JavaScript 脚本异步加载的几种实现方法
作者:晚夜微雨问海棠呀
本文主要介绍了JavaScript 脚本异步加载的几种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
JavaScript 脚本异步加载主要通过以下方式实现,它们在加载时机、执行顺序和阻塞行为上有明显区别:
一、实现方式及区别
1.async属性
<script src="script.js" async></script>
- 特点:
- 异步下载脚本,下载完成后立即执行(可能中断 HTML 解析)。
- 多个
async脚本的执行顺序不确定(先下载完先执行)。
- 适用场景:独立脚本(如统计代码、广告加载),无 DOM 依赖或无需严格顺序。
2.defer属性
<script src="script.js" defer></script>
- 特点:
- 异步下载脚本,但延迟到 HTML 解析完成后、
DOMContentLoaded事件前按顺序执行。 - 多个
defer脚本严格按声明顺序执行。
- 异步下载脚本,但延迟到 HTML 解析完成后、
- 适用场景:依赖 DOM 或需要按序执行的脚本(如库文件+业务代码)。
3.动态创建script标签
const script = document.createElement('script');
script.src = 'script.js';
document.head.appendChild(script); // 添加到文档后开始加载
- 特点:
- 默认行为类似
async(下载完成后立即执行,顺序不确定)。 - 可通过
script.async = false改为按顺序执行(模拟defer)。
- 默认行为类似
- 控制权:可自由控制加载时机(例如用户交互后加载)。
4.ES6 模块(type="module")
<script type="module" src="module.js"></script>
- 特点:
- 默认具有
defer特性(延迟到 HTML 解析后执行,且按顺序)。 - 添加
async属性后行为类似常规async(下载完立即执行,顺序不确定)。
- 默认具有
- 注意:支持模块化语法(
import/export),兼容现代浏览器。
二、关键区别对比
| 方式 | 是否阻塞 HTML 解析 | 执行顺序保证 | 触发时机 |
|---|---|---|---|
| async | ❌(异步下载) | ❌ | 下载完成立即执行 |
| defer | ❌(异步下载) | ✅ | HTML 解析后,DOMContentLoaded 前 |
| 动态脚本(默认) | ❌ | ❌ | 下载完成立即执行 |
| 动态脚本+async=false | ❌ | ✅ | 按添加顺序执行 |
| ES6 模块(默认) | ❌ | ✅ | 同 defer |
三、使用建议
- 优先使用 defer:
- 将脚本放在 <head> 中,避免渲染阻塞,同时保证执行顺序(如依赖 jQuery 的插件)。
- 独立脚本用 async:
- 用于无依赖的脚本(如 Google Analytics)。
- 动态加载非关键脚本:
- 用户交互后或延迟加载非首屏必需的脚本(如评论区、懒加载库)。
- 现代项目使用 ES6 模块:
- 兼顾模块化和加载性能(需配合打包工具如 Webpack 优化)。
四、注意事项
- 避免在异步脚本中使用
document.write(可能导致页面崩溃)。 - 可通过
onload/onerror事件监听加载状态:script.onload = () => console.log('加载成功'); script.onerror = () => console.log('加载失败'); - 兼容性:
defer/async兼容 IE10+,动态加载无兼容问题。
总结
异步加载的核心目标是减少页面渲染阻塞,根据脚本是否依赖 DOM 或其他脚本选择合适方案:
- 顺序重要 → defer
- 顺序无关 → async
- 精细控制 → 动态加载
- 模块化项目 → ES6 模块
到此这篇关于JavaScript 脚本异步加载的几种实现方法的文章就介绍到这了,更多相关JavaScript 脚本异步加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
