JavaScript实现无阻塞加载的常用方式

 更新时间:2025年03月11日 08:40:30   作者:Epicurus  
在 JavaScript 中,无阻塞加载(Non-blocking Loading)是优化网页性能的关键技术,通过避免脚本阻塞页面渲染和其他资源的加载,提升用户体验,以下是实现无阻塞加载的常用方法及示例,需要的朋友可以参考下

JavaScript无阻塞加载的方式

在 JavaScript 中,无阻塞加载(Non-blocking Loading)是优化网页性能的关键技术,通过避免脚本阻塞页面渲染和其他资源的加载,提升用户体验。以下是实现无阻塞加载的常用方法及示例:

1. 使用 async 属性

  • 作用:异步加载脚本,下载完成后立即执行,不阻塞 HTML 解析。
  • 适用场景:独立脚本,不依赖其他脚本或 DOM。
  • 示例
<script async src="script.js"></script>

2. 使用 defer 属性

  • 作用:异步加载脚本,但延迟到 HTML 解析完成后按顺序执行。
  • 适用场景:需要按顺序执行且依赖 DOM 的脚本。
  • 示例
<script defer src="script1.js"></script>
<script defer src="script2.js"></script> <!-- script1 先执行 -->

3. 动态脚本加载

通过 JavaScript 动态创建 <script> 标签,实现按需加载。

  • 适用场景:非关键脚本或条件加载。
  • 示例
function loadScript(src) {
    const script = document.createElement('script');
    script.src = src;
    document.body.appendChild(script);
}
// 在需要时加载
window.addEventListener('DOMContentLoaded', () => {
    loadScript('script.js');
});

4. 使用 Promise 或 async/await 控制加载顺序

结合动态加载和 Promise,管理脚本依赖关系。

  • 示例
function loadScript(src) {
    return new Promise((resolve, reject) => {
        const script = document.createElement('script');
        script.src = src;
        script.onload = resolve;
        script.onerror = reject;
        document.head.appendChild(script);
    });
}

async function init() {
    await loadScript('lib.js');
    await loadScript('app.js'); // 确保 lib.js 先加载
}
init();

5. 使用 Intersection Observer 延迟加载

在元素进入视口时加载脚本,适用于非首屏资源。

  • 示例
const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            loadScript('lazy-script.js');
            observer.unobserve(entry.target);
        }
    });
});
observer.observe(document.querySelector('#lazy-element'));

6. 模块化动态导入(ES6 import())

按需加载 ES6 模块,适用于现代浏览器。

  • 示例
button.addEventListener('click', async () => {
    const module = await import('./module.js');
    module.doSomething();
});

7. 使用 Web Workers 处理计算密集型任务

将耗时任务移至后台线程,避免阻塞主线程。

  • 示例
const worker = new Worker('worker.js');
worker.postMessage({ data: 'start' });
worker.onmessage = (e) => {
    console.log('Result:', e.data);
};

8. 资源预加载(preload 和 prefetch)

通过 <link> 标签提示浏览器提前加载资源。

  • preload:高优先级资源,当前页面使用。
<link rel="preload" href="critical.js" rel="external nofollow"  as="script">
  • prefetch:低优先级资源,未来页面可能使用。
<link rel="prefetch" href="next-page.js" rel="external nofollow"  as="script">

9. 条件加载(根据浏览器特性)

检测浏览器支持后加载特定脚本。

  • 示例
if ('IntersectionObserver' in window) {
    loadScript('modern-script.js');
} else {
    loadScript('fallback-script.js');
}

10. 服务端异步加载(SSR + Hydration)

结合服务端渲染(SSR)和客户端激活(Hydration),按需加载交互逻辑。

  • 示例(Next.js 框架):
import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(() => import('../components/HeavyComponent'));

总结

方法核心原理适用场景优点缺点
async/defer异步加载脚本首屏非关键脚本简单易用async 不保证执行顺序
动态脚本加载按需创建<script> 标签非关键脚本/条件加载灵活控制加载时机需手动管理依赖
import() 动态导入按需加载 ES6 模块现代浏览器应用模块化支持需支持 ES6 模块
Intersection Observer延迟加载视口外资源图片、懒加载组件高性能懒加载兼容性需处理
Web Workers后台线程执行任务计算密集型操作避免主线程阻塞无法直接操作 DOM
资源预加载提前加载关键资源优化关键路径减少加载延迟可能浪费带宽

注意事项

  • 依赖管理:确保异步脚本的执行顺序(如使用 deferPromise)。
  • 兼容性:旧版浏览器(如 IE)不支持 async/defer 和 ES6 模块,需降级处理。
  • 性能监控:使用工具(如 Lighthouse)分析加载性能,针对性优化。

通过合理组合这些方法,可显著提升页面加载速度和交互体验。

以上就是JavaScript实现无阻塞加载的常用方式的详细内容,更多关于JavaScript无阻塞加载的资料请关注脚本之家其它相关文章!

相关文章

  • 解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题

    解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题

    这篇文章主要给大家介绍了关于如何解决前端使用xlsx.js工具读取excel遇到时间日期少43秒问题的相关资料,xlsx.js是一种前端库,它可以使您使用JavaScript读取、解析和导出电子表格文件,如Microsoft Excel,需要的朋友可以参考下
    2024-03-03
  • JavaScript实现继承的4种方法总结

    JavaScript实现继承的4种方法总结

    这篇文章主要介绍了JavaScript实现继承的4种方法总结,本文给出了原型链继承、构造继承、实例继承、拷贝继承等实现JS继承的方法,需要的朋友可以参考下
    2014-10-10
  • Echarts图表点击x轴y轴切换图表二级数据实例代码

    Echarts图表点击x轴y轴切换图表二级数据实例代码

    最近项目用到了Echarts图进行数据展示,所以下面这篇文章主要给大家介绍了关于Echarts图表点击x轴y轴切换图表二级数据的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • JavaScript中为事件指定处理程序的五种方式分析

    JavaScript中为事件指定处理程序的五种方式分析

    这篇文章主要介绍了JavaScript中为事件指定处理程序的五种方式,结合实例形式简单分析了JavaScript事件处理的相关原理与事件指定处理程序的五种常用方式,需要的朋友可以参考下
    2018-07-07
  • javascript 线性渐变三

    javascript 线性渐变三

    上一部分给出的函数已经完全地实现了跨浏览器了,但在IE的实现是极其低劣,动用了多个table以及一向为人所诟病的滤镜。
    2009-10-10
  • 原生JavaScript实现异步多文件上传

    原生JavaScript实现异步多文件上传

    这篇文章主要介绍了原生JavaScript实现异步多文件上传,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 小程序实现搜索界面 小程序实现推荐搜索列表效果

    小程序实现搜索界面 小程序实现推荐搜索列表效果

    这篇文章主要为大家详细介绍了小程序实现搜索界面,小程序实现推荐搜索列表效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 浅谈JavaScript工具链不完全指南

    浅谈JavaScript工具链不完全指南

    经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言。如今的 JavaScript 可以说是风光无限,在 Web 前端、移动端、服务端甚至物联网设备上都大展身手,到处都有它的身影。
    2021-05-05
  • 使用JS中的Replace()方法遇到的问题小结

    使用JS中的Replace()方法遇到的问题小结

    这篇文章主要介绍了使用JS中的Replace()方法遇到的问题小结,需要的朋友可以参考下
    2017-10-10
  • 原生JS实现加载进度条

    原生JS实现加载进度条

    这篇文章主要为大家详细介绍了原生JS实现加载进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论