JavaScript 延迟加载详解!
🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。
@TOC
✨ 什么是 JavaScript 延迟加载?
延迟加载 (Lazy Loading) 是一种优化页面加载性能的技术,它指的是当页面首次加载时,推迟某些资源(如 JavaScript 文件)的加载或执行,直到它们被需要时再加载。
JavaScript 延迟加载的主要目的是:
- 加快页面初始加载速度:避免不必要的资源加载。
- 减少网络带宽消耗:仅加载用户需要的部分资源。
- 提升用户体验:让用户更快看到页面的主要内容。
🌟 JavaScript 延迟加载的常见方式
1. 使用 defer
和 async
属性
1.1 defer
属性
-
作用:
- 告诉浏览器延迟加载脚本,等到页面的 HTML 解析完成后再执行。
- 多个带
defer
的脚本会按照它们在 HTML 中的顺序依次执行。
-
用法:
<script src="script.js" defer></script>
-
适用场景:
- 当脚本需要依赖 HTML 结构时(例如 DOM 操作)。
1.2 async
属性
-
作用:
- 告诉浏览器异步加载脚本,加载完成后立即执行,而不必等待 HTML 解析完成。
- 多个带
async
的脚本可能会乱序执行。
-
用法:
<script src="script.js" async></script>
-
适用场景:
- 当脚本与页面结构无关时(例如第三方分析工具或广告脚本)。
2. 动态加载脚本
通过 JavaScript 动态创建 <script>
标签并加载外部脚本。
-
实现方式:
function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.type = 'text/javascript'; script.onload = callback; // 当脚本加载完成后触发回调 document.head.appendChild(script); } // 示例:延迟加载一个外部脚本 loadScript('https://example.com/some-library.js', function () { console.log('Script loaded and ready to use!'); });
-
特点:
- 控制更灵活,可以指定加载完成后的操作。
- 适用于动态加载依赖脚本。
3. 按需加载
按需加载是指在特定条件下(如用户点击某个按钮或滚动到特定区域时)动态加载 JavaScript。
-
实现方式:滚动触发加载
let scriptLoaded = false; window.addEventListener('scroll', function () { if (!scriptLoaded && window.scrollY > 500) { loadScript('https://example.com/some-library.js', function () { console.log('Script loaded on scroll!'); }); scriptLoaded = true; // 确保脚本只加载一次 } });
-
实现方式:点击触发加载
document.getElementById('loadButton').addEventListener('click', function () { loadScript('https://example.com/some-library.js', function () { console.log('Script loaded on button click!'); }); });
4. 结合 Webpack 的按需加载
Webpack 提供了动态导入(dynamic import
)功能,可以在代码中按需加载模块。
-
示例代码:
document.getElementById('loadButton').addEventListener('click', async () => { const { default: someModule } = await import('./someModule.js'); someModule(); // 使用加载的模块 });
-
特点:
- 现代浏览器支持,代码分割优化。
- 适用于大型项目中模块的动态加载。
5. 使用 Intersection Observer 进行延迟加载
Intersection Observer
是一个现代浏览器 API,可以监听某个元素是否进入视口,适用于图片懒加载和脚本延迟加载。
- 实现方式:
function lazyLoadScript(targetElement, scriptUrl) { const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { loadScript(scriptUrl, function () { console.log('Script loaded when element is visible!'); }); observer.unobserve(entry.target); // 加载完成后停止观察 } }); }); observer.observe(targetElement); // 监听目标元素 } // 示例:延迟加载某个脚本 const target = document.getElementById('targetElement'); lazyLoadScript(target, 'https://example.com/some-library.js');
⚙️ 完整延迟加载示例
以下是一个综合示例,结合了动态加载和用户交互。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JavaScript 延迟加载示例</title>
</head>
<body>
<h1>JavaScript 延迟加载示例</h1>
<button id="loadButton">加载脚本</button>
<script>
// 动态加载脚本函数
function loadScript(url, callback) {
const script = document.createElement('script');
script.src = url;
script.type = 'text/javascript';
script.onload = callback; // 加载完成后回调
document.head.appendChild(script);
}
// 点击按钮延迟加载
document.getElementById('loadButton').addEventListener('click', function () {
loadScript('https://example.com/some-library.js', function () {
console.log('Script loaded and executed!');
});
});
</script>
</body>
</html>
📊 延迟加载的优缺点
优点:
- 提升性能:减少初始加载时间和带宽使用。
- 用户体验更好:更快展示核心内容。
- 减少服务器压力:避免不必要的资源加载。
缺点:
- 增加实现复杂度:需要手动管理脚本的加载逻辑。
- 浏览器兼容性问题:某些旧浏览器可能不支持现代 API(如
Intersection Observer
)。 - 依赖链问题:动态加载的脚本可能依赖于其他资源,需要小心管理。
🔮 延迟加载的实际应用场景
- 图片懒加载:在图片进入视口时再加载,减少页面初始加载时间。
- 第三方脚本加载:如 Google Analytics、广告脚本,避免阻塞页面加载。
- 模块化加载:大型单页应用中动态加载部分页面逻辑或组件。
- 交互式脚本:只有用户触发某些事件时再加载对应的 JavaScript。
✨ 总结
JavaScript 延迟加载是一种高效的优化手段,可以显著提升页面性能,尤其适用于大型网站或复杂应用。根据实际需求选择合适的实现方式(如 defer
、async
或动态加载),并结合现代工具(如 Webpack 和 Intersection Observer)进一步优化。
赶紧试试延迟加载技术,为你的项目加速吧!🚀
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)