小結:網頁性能優化

網頁性能優化是提升用戶體驗、減少加載時間和提高資源利用率的關鍵。以下是針對網頁生命周期和事件處理的性能優化技巧,結合代碼示例,重點覆蓋加載、渲染、事件處理和資源管理等方面。

1. 優化加載階段

  • 減少關鍵資源請求
    • 合并CSS/JS文件,減少HTTP請求。

    • 使用deferasync加載非關鍵腳本:
      html

      <script defer src="script.js"></script> <!-- 延遲加載,DOM解析后執行 -->
      <script async src="analytics.js"></script> <!-- 異步加載,不阻塞解析 -->
      
  • 啟用資源預加載
    • 使用優先加載關鍵資源:
      html

      <link rel="preload" href="critical.css" as="style">
      <link rel="preload" href="main.js" as="script">
      
  • 壓縮和優化資源
    • 使用工具(如terser**、cssnano)壓縮JS/CSS。**

    • 優化圖片:使用WebP格式、壓縮工具(如ImageOptim**)或CDN自動優化。**
      html

      <img src="image.webp" alt="example" loading="lazy">
      

2. 優化DOM解析和渲染

  • 減少DOM操作
    • 批量更新DOM,避免頻繁重排(reflow)和重繪(repaint):
      javascript

      // 低效:多次操作DOM
      for (let i = 0; i < items.length; i++) {document.getElementById('list').innerHTML += `<li>${items[i]}</li>`;
      }// 高效:一次性操作
      const fragment = document.createDocumentFragment();
      items.forEach(item => {const li = document.createElement('li');li.textContent = item;fragment.appendChild(li);
      });
      document.getElementById('list').appendChild(fragment);
      
  • 使用CSS替代JS動畫
    • CSS動畫通常由GPU加速,比JS動畫更高效:
      css

      .fade-in {animation: fadeIn 0.5s ease-in;
      }
      @keyframes fadeIn {from { opacity: 0; }to { opacity: 1; }
      }
      
  • 延遲非關鍵渲染
    • 使用requestIdleCallback處理低優先級任務:
      javascript

      requestIdleCallback(() => {console.log('執行低優先級任務,如加載跟蹤腳本');// 加載非關鍵分析腳本
      }, { timeout: 2000 });
      

3. 優化事件處理

  • 事件委托
    • 為父元素綁定事件,減少監聽器數量:
      javascript

      document.getElementById('list').addEventListener('click', (e) => {if (e.target.tagName === 'LI') {console.log('點擊了列表項:', e.target.textContent);}
      });
      
  • 防抖和節流
    • 限制高頻事件(如scroll**、resize)的觸發頻率:**
      javascript

      // 節流:每200ms最多觸發一次
      function throttle(fn, delay) {let last = 0;return (...args) => {const now = Date.now();if (now - last >= delay) {fn(...args);last = now;}};
      }window.addEventListener('scroll', throttle(() => {console.log('滾動事件觸發');
      }, 200));// 防抖:停止操作后200ms觸發
      function debounce(fn, delay) {let timer;return (...args) => {clearTimeout(timer);timer = setTimeout(() => fn(...args), delay);};
      }window.addEventListener('resize', debounce(() => {console.log('窗口大小調整完成');
      }, 200));
      
  • 移除無用監聽器
    • 動態元素卸載時清理事件,防止內存泄漏:
      javascript

      const button = document.getElementById('myButton');
      const handler = () => console.log('點擊');
      button.addEventListener('click', handler);
      // 移除
      button.removeEventListener('click', handler);
      

4. 優化資源管理和網絡

  • 懶加載
    • 使用loading="lazy"延遲加載圖片和iframe:
      html

      <img src="below-fold.jpg" loading="lazy" alt="lazy image">
      
    • 動態加載JS模塊:
      javascript

      import('module.js').then(module => {module.init();
      });
      
  • 緩存策略
    • 使用Service Worker緩存靜態資源:
      javascript

      // service-worker.js
      self.addEventListener('install', (event) => {event.waitUntil(caches.open('my-cache').then((cache) => {return cache.addAll(['/index.html', '/styles.css', '/script.js']);}));
      });self.addEventListener('fetch', (event) => {event.respondWith(caches.match(event.request).then((response) => {return response || fetch(event.request);}));
      });
      
    • 設置HTTP緩存頭(如Cache-Control**):**
      nginx

      # Nginx 配置示例
      location ~* \.(jpg|png|css|js)$ {expires 1y;add_header Cache-Control "public";
      }
      
  • 使用CDN
    • 加速靜態資源分發,減少延遲:
      html

      <script src="https://cdn.example.com/jquery.min.js"></script>
      

5. 優化頁面可見性和交互

  • 暫停隱藏頁面任務
    • 使用visibilitychange暫停資源密集型任務:
      javascript

      document.addEventListener('visibilitychange', () => {if (document.visibilityState === 'hidden') {clearInterval(pollingTimer); // 停止輪詢} else {pollingTimer = setInterval(fetchData, 5000); // 恢復輪詢}
      });
      
  • 優先處理用戶交互
    • 使用requestAnimationFrame優化動畫和交互:
      javascript

      function animate() {// 更新動畫requestAnimationFrame(animate);
      }
      requestAnimationFrame(animate);
      

6. 性能監控和調試

  • 使用Performance API
    • 測量關鍵時間點:
      javascript

      window.addEventListener('load', () => {const { domContentLoadedEventEnd, loadEventEnd } = performance.timing;console.log('DOM加載時間:', domContentLoadedEventEnd - navigationStart);console.log('頁面總加載時間:', loadEventEnd - navigationStart);
      });
      
  • Lighthouse分析
    • 使用Chrome DevTools的Lighthouse工具檢查性能,獲取優化建議。
  • 錯誤監控
    • 捕獲并記錄運行時錯誤:
      javascript

      window.addEventListener('error', (e) => {fetch('/log-error', {method: 'POST',body: JSON.stringify({ message: e.message, file: e.filename }),});
      }, true);
      

7. 其他實用技巧

  • Tree Shaking:使用Webpack/Rollup移除未使用的代碼。

  • 代碼分割:按路由或功能模塊分割JS,減少初始加載量:
    javascript

    // Webpack 動態導入
    import(/* webpackChunkName: "module" */ './module.js').then(module => {module.default();
    });
    
  • 避免阻塞主線程

    • 將耗時任務移到Web Worker:
      javascript

      // main.js
      const worker = new Worker('worker.js');
      worker.postMessage({ task: 'heavyComputation' });
      worker.onmessage = (e) => console.log('結果:', e.data);// worker.js
      self.onmessage = (e) => {const result = heavyComputation(e.data);self.postMessage(result);
      };
      
  • 優化字體加載

    • 使用font-display: swap避免FOUT(無樣式文本閃爍):
      css

      @font-face {font-family: 'MyFont';src: url('myfont.woff2') format('woff2');font-display: swap;
      }
      

注意事項

  • 測試環境:在不同設備和網絡條件下(3G、4G)測試性能。
  • 漸進增強:確保核心功能在無JS或低性能設備上可用。
  • 用戶體驗:優化性能時避免犧牲可訪問性(如ARIA支持)。
  • 工具支持:使用Vite、esbuild等現代構建工具加速開發和打包。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81070.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI學習】AI大模型技術發展研究月報的生成提示詞

AI大模型技術發展研究月報生成提示詞 請輸出AI大模型技術發展研究月報&#xff0c;要求如下&#xff1a; —————————— 任務目標 在今天&#xff08;{{today}}&#xff09;往前連續 30 天內&#xff0c;檢索已正式公開發表的、與AI大模型&#xff08;參數量 ≥10B&am…

AI 實踐探索:輔助生成測試用例

背景 目前我們的測試用例主要依賴人工生成和維護&#xff0c;AI時代的來臨&#xff0c;我們也在思考“AI如何賦能業務”&#xff0c;提出了如下命題&#xff1a; “探索通過AI輔助生成測試用例&#xff0c;完成從需求到測試用例生成的穿刺”。 目標 找全測試路徑輔助生成測…

C#實現訪問遠程硬盤(附源碼)

在現實場景中&#xff0c;我們經常用到遠程桌面功能&#xff0c;而在某些場景下&#xff0c;我們需要使用類似的遠程硬盤功能&#xff0c;這樣能非常方便地操作對方電腦磁盤的目錄、以及傳送文件。那么&#xff0c;這樣的遠程硬盤功能要怎么實現了&#xff1f; 這次我們將給出…

02.Golang 切片(slice)源碼分析(一、定義與基礎操作實現)

Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;一、定義與基礎操作實現&#xff09; 注意當前go版本代碼為1.23 一、定義 slice 的底層數據是數組&#xff0c;slice 是對數組的封裝&#xff0c;它描述一個數組的片段。兩者都可以通過下標來訪問單個元素。 數…

記參加一次數學建模

題目請到全國大學生數學建模競賽下載查看。 注&#xff1a;過程更新了很多文件&#xff0c;所有這里貼上的有些內容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我們隊伍并沒有獲獎&#xff0c;文章內容僅供一樂。 從這次比賽&#xff0c;給出以下賽前建議 …

virtualbox虛擬機中的ubuntu 20.04.6安裝新的linux內核5.4.293 | 并增加一個系統調用 | 證書問題如何解決

參考文章&#xff1a;linux添加系統調用【簡單易懂】【含32位系統】【含64位系統】_64位 32位 系統調用-CSDN博客 安裝新內核 1. 在火狐下載你需要的版本的linux內核壓縮包 這里我因為在windows上面下載過&#xff0c;配置過共享文件夾&#xff0c;所以直接復制粘貼通過共享文…

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九)

[Java實戰]Spring Boot 3 整合 Ehcache 3&#xff08;十九&#xff09; 引言 在微服務和高并發場景下&#xff0c;緩存是提升系統性能的關鍵技術之一。Ehcache 作為 Java 生態中成熟的內存緩存框架&#xff0c;其 3.x 版本在性能、功能和易用性上均有顯著提升。本文將詳細介紹…

LlamaIndex 第九篇 Indexing索引

索引概述 數據加載完成后&#xff0c;您將獲得一個文檔對象(Document)列表&#xff08;或節點(Node)列表&#xff09;。接下來需要為這些對象構建索引(Index)&#xff0c;以便開始執行查詢。 索引&#xff08;Index&#xff09; 是一種數據結構&#xff0c;能夠讓我們快速檢索…

【問題排查】easyexcel日志打印Empty row!

問題原因 日志打印??I/O 操作開銷?&#xff08;如 Log4j 的 FileAppender&#xff09;會阻塞業務線程&#xff0c;直到日志寫入完成&#xff0c;導致接口響應變慢 問題描述 在線上環境&#xff0c;客戶反饋導入一個不到1MB的excel文件&#xff0c;耗時將近5分鐘。 問題排…

代碼隨想錄第51天|島嶼數量(深搜)、島嶼數量(廣搜)、島嶼的最大面積

1.島嶼數量&#xff08;深搜&#xff09; ---》模板題 版本一寫法&#xff1a;下一個節點是否能合法已經判斷完了&#xff0c;傳進dfs函數的就是合法節點。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 從影視到游戲:《魷魚游戲》IP 的邊界拓展

優質IP的跨媒體開發潛力不可限量。以現象級劇集《魷魚游戲》為例&#xff0c;Netflix旗下游戲工作室Boss Fight在第二季開播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一經發布便橫掃全球107個國家和地區的App Store免費游戲榜首。 這款多人派對大逃殺游戲完美還原…

allure 報告更改標題和語言為中文

在網上看到好多談到更改allure 的標題設置都很麻煩&#xff0c;去更改JSON文件 其實可以有更簡單的辦法&#xff0c;就是在生成報表時增加參數 使用allure --help 查看&#xff1a; --lang, --report-language 設置報告的語言&#xff0c;默認是應用 The report language. …

HGDB索引膨脹的檢查與處理思路

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.8 文檔用途 本文檔主要介紹HGDB索引膨脹的定義、產生的原因、如何檢查以及遇到索引膨脹如何處理&#xff08;包括預防和解決&#xff09; 詳細信息 …

【Python CGI編程】

Python CGI&#xff08;通用網關接口&#xff09;編程是早期Web開發中實現動態網頁的技術方案。以下是系統化指南&#xff0c;包含核心概念、實現步驟及安全實踐&#xff1a; 一、CGI 基礎概念 1. 工作原理 瀏覽器請求 → Web服務器&#xff08;如Apache&#xff09; → 執行…

數據庫故障排查指南:從入門到精通

1. 常見數據庫故障類型 1.1 連接故障 數據庫連接超時連接池耗盡網絡連接中斷認證失敗1.2 性能故障 查詢執行緩慢內存使用過高CPU使用率異常磁盤I/O瓶頸1.3 數據故障 數據不一致數據丟失數據損壞事務失敗2. 故障排查流程 2.1 初步診斷 -- 檢查數據庫狀態SHOW STATUS;SHOW PRO…

conda創建環境常用命令(個人用)

創建環境 conda create --name your_project_name創建環境 ---- 指定環境python版本 conda create --name your_project_name python3.x環境列表 conda env list激活環境 conda activate your_project_name退出環境 conda deactivate環境列表 #使用conda命令 conda list …

PCL 繪制二次曲面

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文講透面向對象編程OOP特點及應用場景

面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;是一種以對象為核心、通過類組織代碼的編程范式。它通過模擬現實世界的實體和交互來構建軟件系統&#xff0c;是現代軟件開發中最廣泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我啟動一個springboot項目, 用java -jar xxx.jar ,但是沒多久這個java進程就會自動關掉

當使用 java -jar xxx.jar & 啟動 Spring Boot 項目后進程自動關閉時&#xff0c;可能由多種原因導致。以下是常見排查步驟和解決方案&#xff1a; 一、查看日志定位原因 進程異常關閉通常會在控制臺或日志中留下線索&#xff0c;建議先獲取完整日志&#xff1a; 1. 查看…

【獨家精簡】win11(24h2)清爽加速版

自作該版本的初心&#xff1a;隨著電腦性能的不斷提升&#xff0c;我們需要的更多的是沒有廣告&#xff0c;沒有推薦&#xff0c;沒有收集隱私的windows清爽版純凈系統 目前只會去制作windows系統專業版 1、去除Windows系統自帶的廣告新聞和推薦以及小組間和聊天功能。 2、精簡…