最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實現(xiàn)無阻塞加載的常用方式

 更新時間:2025年03月11日 08:40:30   作者:Epicurus  
在 JavaScript 中,無阻塞加載(Non-blocking Loading)是優(yōu)化網(wǎng)頁性能的關鍵技術,通過避免腳本阻塞頁面渲染和其他資源的加載,提升用戶體驗,以下是實現(xiàn)無阻塞加載的常用方法及示例,需要的朋友可以參考下

JavaScript無阻塞加載的方式

在 JavaScript 中,無阻塞加載(Non-blocking Loading)是優(yōu)化網(wǎng)頁性能的關鍵技術,通過避免腳本阻塞頁面渲染和其他資源的加載,提升用戶體驗。以下是實現(xiàn)無阻塞加載的常用方法及示例:

1. 使用 async 屬性

  • 作用:異步加載腳本,下載完成后立即執(zhí)行,不阻塞 HTML 解析。
  • 適用場景:獨立腳本,不依賴其他腳本或 DOM。
  • 示例
<script async src="script.js"></script>

2. 使用 defer 屬性

  • 作用:異步加載腳本,但延遲到 HTML 解析完成后按順序執(zhí)行。
  • 適用場景:需要按順序執(zhí)行且依賴 DOM 的腳本。
  • 示例
<script defer src="script1.js"></script>
<script defer src="script2.js"></script> <!-- script1 先執(zhí)行 -->

3. 動態(tài)腳本加載

通過 JavaScript 動態(tài)創(chuàng)建 <script> 標簽,實現(xiàn)按需加載。

  • 適用場景:非關鍵腳本或條件加載。
  • 示例
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 控制加載順序

結合動態(tài)加載和 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. 模塊化動態(tài)導入(ES6 import())

按需加載 ES6 模塊,適用于現(xiàn)代瀏覽器。

  • 示例
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:高優(yōu)先級資源,當前頁面使用。
<link rel="preload" href="critical.js" rel="external nofollow"  as="script">
  • prefetch:低優(yōu)先級資源,未來頁面可能使用。
<link rel="prefetch" href="next-page.js" rel="external nofollow"  as="script">

9. 條件加載(根據(jù)瀏覽器特性)

檢測瀏覽器支持后加載特定腳本。

  • 示例
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'));

總結

方法核心原理適用場景優(yōu)點缺點
async/defer異步加載腳本首屏非關鍵腳本簡單易用async 不保證執(zhí)行順序
動態(tài)腳本加載按需創(chuàng)建<script> 標簽非關鍵腳本/條件加載靈活控制加載時機需手動管理依賴
import() 動態(tài)導入按需加載 ES6 模塊現(xiàn)代瀏覽器應用模塊化支持需支持 ES6 模塊
Intersection Observer延遲加載視口外資源圖片、懶加載組件高性能懶加載兼容性需處理
Web Workers后臺線程執(zhí)行任務計算密集型操作避免主線程阻塞無法直接操作 DOM
資源預加載提前加載關鍵資源優(yōu)化關鍵路徑減少加載延遲可能浪費帶寬

注意事項

  • 依賴管理:確保異步腳本的執(zhí)行順序(如使用 deferPromise)。
  • 兼容性:舊版瀏覽器(如 IE)不支持 async/defer 和 ES6 模塊,需降級處理。
  • 性能監(jiān)控:使用工具(如 Lighthouse)分析加載性能,針對性優(yōu)化。

通過合理組合這些方法,可顯著提升頁面加載速度和交互體驗。

以上就是JavaScript實現(xiàn)無阻塞加載的常用方式的詳細內(nèi)容,更多關于JavaScript無阻塞加載的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解js的事件代理(委托)

    詳解js的事件代理(委托)

    JavaScript事件代理(委托)一般用于以下情況:1. 事件注冊在祖先級元素上,代理其子級元素。可以減少事件注冊數(shù)量,節(jié)約內(nèi)存開銷,提高性能。2. 對js動態(tài)添加的子元素可自動綁定事件。本文主要介紹用原生 js 實現(xiàn)該功能。下面跟著小編一起來看下吧
    2016-12-12
  • IE和Firefox之間在JavaScript語法上的差異

    IE和Firefox之間在JavaScript語法上的差異

    這篇文章主要為大家詳細介紹了IE和Firefox之間在JavaScript語法上的差異,在JavaScript語法上不同的7個方面,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 深入理解JavaScript系列(4) 立即調(diào)用的函數(shù)表達式

    深入理解JavaScript系列(4) 立即調(diào)用的函數(shù)表達式

    大家學JavaScript的時候,經(jīng)常遇到自執(zhí)行匿名函數(shù)的代碼,今天我們主要就來想想說一下自執(zhí)行
    2012-01-01
  • JavaScript編程中如何進行函數(shù)封裝

    JavaScript編程中如何進行函數(shù)封裝

    在實際應用中,為了提高代碼的可重用性、可維護性和簡潔性,開發(fā)者常常需要對常用功能進行函數(shù)封裝,這篇文章主要介紹了JavaScript編程中如何進行函數(shù)封裝的相關資料,需要的朋友可以參考下
    2026-01-01
  • 利用JavaScript如何查詢某個值是否數(shù)組內(nèi)

    利用JavaScript如何查詢某個值是否數(shù)組內(nèi)

    這篇文章主要給大家介紹了關于利用JavaScript如何查詢某個值是否數(shù)組內(nèi)的相關資料,文中通過示例代碼分別介紹了實現(xiàn)該問題的一些解決方法是否可行,需要的朋友可以參考借鑒,下面跟著小編來一起學習學習吧。
    2017-07-07
  • js動態(tài)添加帶圓圈序號列表的實例代碼

    js動態(tài)添加帶圓圈序號列表的實例代碼

    這篇文章主要介紹了js動態(tài)添加帶圓圈序號列表的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 在Web前端實現(xiàn)流式TTS播放的排坑過程

    在Web前端實現(xiàn)流式TTS播放的排坑過程

    在前端實現(xiàn)流式TTS,核心目標是把文本輸入轉化為沉浸式的、幾乎無感延遲的音頻輸出,并且在音頻進入瀏覽器的瞬間就能開始播放,這篇文章主要介紹了在Web前端實現(xiàn)流式TTS播放的排坑過程,需要的朋友可以參考下
    2026-05-05
  • js 中文漢字轉Unicode、Unicode轉中文漢字、ASCII轉換Unicode、Unicode轉換ASCII、中文轉換&#XX函數(shù)代碼

    js 中文漢字轉Unicode、Unicode轉中文漢字、ASCII轉換Unicode、Unicode轉換AS

    這篇文章主要介紹了js 中文漢字轉Unicode、Unicode轉中文漢字、ASCII轉換Unicode、Unicode轉換ASCII、中文轉換&#XXXX,需要的朋友可以參考下
    2016-12-12
  • JavaScript生成唯一ID的幾種常用方法

    JavaScript生成唯一ID的幾種常用方法

    這篇文章主要介紹了JavaScript生成唯一ID的幾種常用方法,UUID 是通用唯一標識符的縮寫,是由一個可以確保全球唯一性的算法生成的標識符,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼

    JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼

    這篇文章主要介紹了JavaScript實現(xiàn)的多個圖片廣告交替顯示效果代碼,涉及javascript數(shù)組遍歷及頁面元素動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09

最新評論

喀喇沁旗| 敦化市| 秭归县| 晋宁县| 青海省| 睢宁县| 朝阳市| 阿拉善右旗| 巴中市| 柏乡县| 夏河县| 驻马店市| 开阳县| 武陟县| 聂荣县| 遂溪县| 凤庆县| 咸宁市| 长乐市| 焉耆| 临安市| 汶上县| 呼玛县| 临洮县| 南开区| 永清县| 黔西县| 南丰县| 鄂托克前旗| 资中县| 贺兰县| 醴陵市| 拜城县| 汉中市| 奉化市| 江川县| 赞皇县| 涪陵区| 邛崃市| 泗洪县| 无极县|