javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript无阻塞加载

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

作者:Epicurus

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

JavaScript无阻塞加载的方式

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

1. 使用 async 属性

<script async src="script.js"></script>

2. 使用 defer 属性

<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> 标签提示浏览器提前加载资源。

<link rel="preload" href="critical.js" rel="external nofollow"  as="script">
<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),按需加载交互逻辑。

import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(() => import('../components/HeavyComponent'));

总结

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

注意事项

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

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

您可能感兴趣的文章:
阅读全文