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

一文詳解如何避免JavaScript 代碼阻塞頁面渲染

 更新時間:2026年02月01日 11:39:47   作者:Smilezyl  
阻塞渲染是指瀏覽器在解析 HTML 構(gòu)建 DOM 樹的過程中,遇到 <script> 標簽時會暫停 DOM 解析,等待腳本下載并執(zhí)行完畢后才繼續(xù)解析,本文給大家介紹了如何避免JavaScript 代碼阻塞頁面渲染,需要的朋友可以參考下

核心答案

阻塞渲染是指瀏覽器在解析 HTML 構(gòu)建 DOM 樹的過程中,遇到 <script> 標簽時會暫停 DOM 解析,等待腳本下載并執(zhí)行完畢后才繼續(xù)解析。這是因為 JavaScript 可能會修改 DOM 結(jié)構(gòu)(如 document.write),瀏覽器必須確保 DOM 的正確性。

避免阻塞的核心方法:

  1. 使用 async 屬性:腳本異步下載,下載完立即執(zhí)行
  2. 使用 defer 屬性:腳本異步下載,DOM 解析完成后按順序執(zhí)行
  3. 將腳本放在 </body>
  4. 動態(tài)創(chuàng)建 script 標簽

深入解析

瀏覽器渲染流程

HTML → DOM Tree
                  → Render Tree → Layout → Paint
CSS  → CSSOM

阻塞機制詳解

1. JavaScript 阻塞 DOM 解析

HTML解析 → 遇到<script> → 暫停解析 → 下載JS → 執(zhí)行JS → 繼續(xù)解析

2. CSS 也會間接阻塞

  • CSS 本身不阻塞 DOM 解析,但阻塞渲染
  • 如果 JS 在 CSS 之后,JS 會等待 CSSOM 構(gòu)建完成(因為 JS 可能訪問樣式)

async vs defer 的區(qū)別

特性asyncdefer
下載異步,不阻塞解析異步,不阻塞解析
執(zhí)行時機下載完立即執(zhí)行DOM 解析完成后執(zhí)行
執(zhí)行順序不保證順序保證順序
適用場景獨立腳本(統(tǒng)計、廣告)有依賴關(guān)系的腳本

常見誤區(qū)

  • 誤區(qū):async 和 defer 可以同時使用

實際:同時存在時,現(xiàn)代瀏覽器優(yōu)先使用 async

  • 誤區(qū):內(nèi)聯(lián)腳本可以使用 async/defer

實際:async/defer 只對外部腳本有效

  • 誤區(qū):放在 body 底部就不會阻塞

實際:仍會阻塞,只是此時 DOM 已基本解析完成,影響較小

代碼示例

<!-- 1. 阻塞渲染(默認行為) -->
<script src="app.js"></script>

<!-- 2. async:異步下載,下載完立即執(zhí)行 -->
<script async src="analytics.js"></script>

<!-- 3. defer:異步下載,DOM 解析后按順序執(zhí)行 -->
<script defer src="vendor.js"></script>
<script defer src="app.js"></script>  <!-- 保證在 vendor.js 之后執(zhí)行 -->

<!-- 4. 動態(tài)加載腳本 -->
<script>
  const script = document.createElement('script');
  script.src = 'lazy-module.js';
  script.async = false; // 保證順序執(zhí)行
  document.body.appendChild(script);
</script>

<!-- 5. 模塊腳本(默認 defer 行為) -->
<script type="module" src="app.mjs"></script>

<!-- 6. 預(yù)加載關(guān)鍵資源 -->
<link rel="preload" href="critical.js" rel="external nofollow"  as="script">

現(xiàn)代優(yōu)化方案

// 使用 Intersection Observer 懶加載腳本
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const script = document.createElement('script');
      script.src = entry.target.dataset.src;
      document.body.appendChild(script);
      observer.unobserve(entry.target);
    }
  });
});

// 使用 requestIdleCallback 在空閑時加載
requestIdleCallback(() => {
  const script = document.createElement('script');
  script.src = 'non-critical.js';
  document.body.appendChild(script);
});

面試技巧

可能的追問方向

"async 和 defer 的執(zhí)行時機具體是什么?"

  • async:下載完成后立即執(zhí)行,可能在 DOMContentLoaded 之前或之后
  • defer:在 DOMContentLoaded 事件之前執(zhí)行

"CSS 會阻塞 JS 執(zhí)行嗎?"

  • 會。如果 <script><link> 之后,JS 會等待 CSSOM 構(gòu)建完成

"如何檢測和量化阻塞時間?"

  • Performance API、Lighthouse、Chrome DevTools Performance 面板

"type="module" 的腳本有什么特點?"

  • 默認 defer 行為、嚴格模式、獨立作用域、支持 import/export

展示深度的回答技巧

  • 提及瀏覽器的預(yù)解析器(Preload Scanner)會提前掃描并下載資源
  • 討論 Critical Rendering Path 優(yōu)化策略
  • 結(jié)合實際項目經(jīng)驗,如 Webpack 的代碼分割、動態(tài) import

一句話總結(jié)

JS 阻塞 DOM 解析是因為可能修改 DOM;用 defer 保順序、async 求速度、動態(tài)加載最靈活。

以上就是一文詳解如何避免JavaScript 代碼阻塞頁面渲染的詳細內(nèi)容,更多關(guān)于JavaScript代碼阻塞頁面渲染避免方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • csdn 博客中實現(xiàn)運行代碼功能實現(xiàn)

    csdn 博客中實現(xiàn)運行代碼功能實現(xiàn)

    有時候因為csdn的博客經(jīng)常處理一些字符,導(dǎo)致代碼很多情況下,都不能正常運行,給大家的閱讀帶來了麻煩,下面是腳本之家編輯簡單的整理下。
    2009-08-08
  • JavaScript實現(xiàn)存儲HTML字符串示例

    JavaScript實現(xiàn)存儲HTML字符串示例

    這篇文章主要介紹了JavaScript存儲HTML字符串的具體實現(xiàn),需要的朋友可以參考下
    2014-04-04
  • JS多線程Webworks中的幾種實戰(zhàn)場景演示

    JS多線程Webworks中的幾種實戰(zhàn)場景演示

    本文主要介紹了JS多線程Webworks中的幾種實戰(zhàn)場景演示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • ES6中的WeakMap和WeakSet特性和用途詳解

    ES6中的WeakMap和WeakSet特性和用途詳解

    在JavaScript的ES6版本中,引入了WeakMap和WeakSet這兩種新的數(shù)據(jù)結(jié)構(gòu),與Map和Set相比,它們有一些特殊的特點和用途,使它們在處理內(nèi)存泄漏問題、管理對象私有數(shù)據(jù)、處理對象的唯一性等場景中有顯著的優(yōu)勢,本文將深入探討WeakMap和WeakSet的特性和用途,一起看看吧
    2023-12-12
  • javascript與cookie 的問題詳解

    javascript與cookie 的問題詳解

    這篇文章介紹了javascript與cookie 的問題,有需要的朋友可以參考一下
    2013-11-11
  • js獲取對象、數(shù)組的實際長度,元素實際個數(shù)的實現(xiàn)代碼

    js獲取對象、數(shù)組的實際長度,元素實際個數(shù)的實現(xiàn)代碼

    下面小編就為大家?guī)硪黄猨s獲取對象、數(shù)組的實際長度,元素實際個數(shù)的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享 給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • js+css在交互上的應(yīng)用

    js+css在交互上的應(yīng)用

    關(guān)于css應(yīng)用。以前一直認為css就是做布局樣式,只能表現(xiàn)頁面,跟交互是沒關(guān)系的。事實上也基本不會往那邊想。
    2010-07-07
  • createElement和onclick

    createElement和onclick

    createElement和onclick...
    2006-11-11
  • js 純數(shù)字不重復(fù)排列的另類方法

    js 純數(shù)字不重復(fù)排列的另類方法

    有一組數(shù)據(jù),大概10萬個左右,每一單位的值不會大于30000,要求按照由大到小的順序不重復(fù)輸出。
    2010-07-07
  • js判斷節(jié)假日實例代碼

    js判斷節(jié)假日實例代碼

    因為要做一個日歷控件,遇到國家法定節(jié)假日,怎么實現(xiàn)此功能呢?其實實現(xiàn)代碼很簡單的,下面小編給大家分享js判斷節(jié)假日實例代碼,需要的朋友參考下吧
    2017-12-12

最新評論

镇巴县| 宜兰市| 平谷区| 三原县| 永胜县| 卢氏县| 德惠市| 福清市| 永登县| 布拖县| 德昌县| 新龙县| 靖西县| 来凤县| 东明县| 璧山县| 龙胜| 漳州市| 辽阳县| 肇东市| 三河市| 濮阳县| 襄樊市| 邵武市| 乌兰县| 从江县| 陕西省| 炎陵县| 宜兴市| 永靖县| 华池县| 兰西县| 甘德县| 涟水县| 滦平县| 三明市| 广昌县| 永平县| 长垣县| 乐东| 岢岚县|