狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

js加載對(duì)瀏覽器渲染的影響

freeflydom
2025年7月7日 11:14 本文熱度 109

一、瀏覽器渲染基礎(chǔ):關(guān)鍵渲染路徑解析

當(dāng)瀏覽器加載網(wǎng)頁時(shí),遵循以下關(guān)鍵步驟:

  1. HTML解析 → 2. DOM樹構(gòu)建 → 3. CSSOM構(gòu)建 → 4. 渲染樹構(gòu)建 → 5. 布局 → 6. 繪制

JavaScript在其中的作用:

graph LR
    A[HTML解析] --> B[遇到JS]
    B -->|同步JS| C[阻塞DOM構(gòu)建]
    C --> D[執(zhí)行JS]
    D --> E[繼續(xù)DOM構(gòu)建]
    B -->|CSS| F[阻塞渲染]

關(guān)鍵點(diǎn):在DOM樹構(gòu)建過程中遇到JavaScript時(shí):

  • 如果是外部JS文件:瀏覽器必須等待JS下載并執(zhí)行完成
  • 如果是內(nèi)聯(lián)JS:瀏覽器立即執(zhí)行代碼

二、JavaScript加載的阻塞行為驗(yàn)證

2.1 實(shí)驗(yàn):同步JS的阻塞效應(yīng)

<!DOCTYPE html>
<html>
<head>
  <title>阻塞測(cè)試</title>
  <script>
    // 模擬長(zhǎng)時(shí)間執(zhí)行
    const start = Date.now();
    while (Date.now() - start < 3000) {}
  </script>
</head>
<body>
  <!-- 這段HTML在JS執(zhí)行完成前不會(huì)渲染 -->
  <h1>3秒后你會(huì)看到我</h1>
</body>
</html>

實(shí)驗(yàn)結(jié)果:頁面空白3秒后才顯示內(nèi)容,證明同步

2.2 外部JS文件的阻塞情況

<script src="heavy-script.js"></script>
<!-- 后續(xù)內(nèi)容會(huì)被阻塞 -->

問題核心:

  • 網(wǎng)絡(luò)時(shí)間:下載JS文件所需的時(shí)間
  • 執(zhí)行時(shí)間:JS解析和執(zhí)行時(shí)間

三、解決方案:打破JS阻塞的四種策略

3.1 async屬性:異步加載(適用于獨(dú)立腳本)

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

特性:

  • 異步下載,不阻塞HTML解析
  • 下載完成后立即執(zhí)行,可能中斷渲染
  • 執(zhí)行順序無法保證

3.2 defer屬性:延遲執(zhí)行(推薦方案)

<script src="main.js" defer></script>

特性:

  • 異步下載,不阻塞HTML解析
  • 執(zhí)行推遲到DOMContentLoaded事件之前
  • 保持多個(gè)腳本的執(zhí)行順序

3.3 動(dòng)態(tài)加載:靈活控制

function loadScript(src, callback) {
  const script = document.createElement('script');
  script.src = src;
  script.onload = callback;
  document.head.appendChild(script);
}

優(yōu)勢(shì):完全控制加載時(shí)機(jī),可實(shí)現(xiàn)按需加載

3.4 模塊化加載(ES Modules)

<script type="module">
  import { init } from './app.js';
  init();
</script>

特性:

  • 默認(rèn)具有defer行為
  • 支持模塊依賴解析
  • 現(xiàn)代瀏覽器原生支持

四、性能優(yōu)化實(shí)戰(zhàn):對(duì)比實(shí)驗(yàn)數(shù)據(jù)

加載方式渲染開始時(shí)間DOMContentLoaded完全加載時(shí)間FCP(ms)TTI(ms)
同步加載3.2s3.5s4.1s32004100
async0.8s2.2s3.0s8003000
defer0.8s1.9s2.8s8002800
動(dòng)態(tài)加載0.8s1.4s2.5s8002500

測(cè)試環(huán)境:1MB JS文件 + 中等復(fù)雜度頁面,模擬3G網(wǎng)絡(luò)

五、避免阻塞的關(guān)鍵實(shí)踐

5.1 最佳資源加載順序

<head>
  <!-- 關(guān)鍵CSS優(yōu)先 -->
  <link rel="stylesheet" href="critical.css">
  
  <!-- 非關(guān)鍵JS異步加載 -->
  <script src="analytics.js" async></script>
  
  <!-- 主要JS延遲加載 -->
  <script src="main.js" defer></script>
</head>

5.2 優(yōu)化JS執(zhí)行時(shí)間

// 將長(zhǎng)任務(wù)分解
function processInChunks() {
  const chunkSize = 100;
  let index = 0;
  
  function processChunk() {
    const end = Math.min(index + chunkSize, data.length);
    
    for (; index < end; index++) {
      // 處理數(shù)據(jù)
    }
    
    if (index < data.length) {
      // 使用requestIdleCallback避免阻塞主線程
      requestIdleCallback(processChunk);
    }
  }
  
  processChunk();
}

5.3 現(xiàn)代瀏覽器預(yù)加載掃描器優(yōu)化

<link rel="preload" href="critical.js" as="script">
<link rel="preconnect" href="https://cdn.example.com">

六、特殊情況與邊界處理

6.1 document.write的陷阱

// 避免在文檔加載后使用
document.write('<script src="dangerous.js"></script>');

風(fēng)險(xiǎn):在DOMContentLoaded之后使用會(huì)清空頁面

6.2 CSS對(duì)JS執(zhí)行的潛在阻塞

graph TD
    JS[JavaScript執(zhí)行] -->|需要CSSOM| CSS[CSS加載]
    CSS -->|未完成| Block[阻塞JS執(zhí)行]
    Block -->|CSSOM就緒| Continue[繼續(xù)執(zhí)行JS]

七、性能監(jiān)測(cè)工具實(shí)戰(zhàn)

Chrome DevTools監(jiān)測(cè):

// 在控制臺(tái)中檢測(cè)長(zhǎng)任務(wù)
const observer = new PerformanceObserver(list => {
  for (const entry of list.getEntries()) {
    console.log('長(zhǎng)任務(wù):', entry);
  }
});
observer.observe({ entryTypes: ['longtask'] });

關(guān)鍵指標(biāo):

  • FCP (First Contentful Paint):首次內(nèi)容渲染
  • TTI (Time to Interactive):可交互時(shí)間
  • Long Tasks:超過50ms的任務(wù)

小結(jié)

  1. 基本原則:

    • 關(guān)鍵路徑JS:使用<script defer>
    • 非關(guān)鍵JS:使用<script async>或動(dòng)態(tài)加載
  2. 性能優(yōu)化進(jìn)階:

    // 代碼分割 + 按需加載
    import('./module')
      .then(module => module.init())
      .catch(err => console.error('加載失敗', err));
    
  3. 現(xiàn)代框架最佳實(shí)踐:

    • React:React.lazy + Suspense
    • Vue:異步組件
    • Angular:路由懶加載

最終性能公式:

頁面響應(yīng)速度 = (關(guān)鍵資源大小/網(wǎng)絡(luò)速度) + 最長(zhǎng)任務(wù)時(shí)間

每次網(wǎng)絡(luò)請(qǐng)求都是潛在的阻塞點(diǎn),每毫秒執(zhí)行時(shí)間都會(huì)影響用戶體驗(yàn)。

轉(zhuǎn)自https://juejin.cn/post/7523037165254934571


該文章在 2025/7/7 11:14:21 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved