[特殊字符] Harmony OS Next里的Web組件:網頁加載的全流程掌控手冊

🎉 Harmony OS Next里的Web組件:網頁加載的全流程掌控手冊

##Harmony OS Next ##Ark Ts ##教育

本文適用于教育科普行業進行學習,有錯誤之處請指出我會修改。

開發者必看的生命周期回調詳解+代碼實操指南

作為開發者,你可能經常需要加載本地或在線網頁吧?ArkUI的Web組件就是你的超級武器庫!它提供了9大關鍵生命周期回調,讓你像開了上帝視角一樣感知網頁加載的每個心跳💓。


🚦 一、Web組件的9個關鍵生命周期時刻

1?? aboutToAppear():組件誕生第一課

這是組件實例化后的第一個動作!在build()執行前,記得在這里做三件大事:

aboutToAppear(): void {webview.WebviewController.setWebDebuggingAccess(true); // 🔧開啟調試模式customizeSchemes(); // 🌐設置自定義協議權限configCookie(); // 🍪初始化Cookie配置
}

?? 警告:別在這里操作DOM!此時網頁還是"胚胎"狀態呢~


2?? onControllerAttached:操控權交接儀式

當Controller成功綁定Web組件時觸發,相當于拿到汽車鑰匙🚗!重點提示:

.onControllerAttached(() => {console.log('🎯控制器已就位!');registerJavaScriptProxy(); // 📦注入JS對象setCustomUserAgent(); // 🕵??♂?設置偽裝UAthis.controller.loadUrl(); // ?可安全調用
})

? 允許操作:loadUrl(), getWebId()
? ??禁止操作??:zoomIn(), executeJavaScript()(網頁未加載別手癢!)


3?? 攔截雙雄:onLoadIntercept vs onOverrideUrlLoading
回調事件觸發場景特殊限制使用建議
onLoadIntercept所有URL加載前通用攔截首選?
onOverrideUrlLoading僅非iframe的HTTP(s)協議加載LoadUrl/iframe加載不觸發??特定協議過濾🚩

實戰代碼對比:

// 萬能攔截器
.onLoadIntercept((event) => {if (event.data.getRequestUrl().includes('ads')) {console.log('🛑攔截廣告請求!');return true; // 阻斷加載}return false;
})// 協議專項處理
.onOverrideUrlLoading((req) => {if (req.getRequestUrl() === 'about:blank') {console.log('🚫拒絕空白頁請求');return true; }return false;
})

🌐 二、網頁加載進度三重奏

4?? onPageBegin:網頁誕生第一聲啼哭👶
.onPageBegin((event) => {console.log(`🌐網頁開始加載:${event.url}`);
})

📌 重點:僅主frame觸發!子frame加載時靜默無感

5?? onProgressChange:加載進度條實況直播
.onProgressChange((event) => {console.log(`📊加載進度:${event.newProgress}%`);// 主frame完成后仍可能收到子frame進度更新
})
6?? onPageEnd:網頁加載畢業典禮🎓
.onPageEnd((event) => {console.log(`🎉加載完成:${event.url}`);// ★最佳JS執行時機★this.controller.executeJavaScript('initPage()');
})

?? 坑點預警:此時DOM可能還未渲染完成!別急著操作元素


🚨 三、異常處理與特殊時刻

7?? onRenderExited:崩潰急救指南

渲染進程突然崩潰時(內存不足/代碼異常),這是你的救命通道:

.onRenderExited((event) => {console.error(`💥渲染崩潰!原因碼:${event.renderExitReason}`);saveRecoveryData(); // 🛟緊急保存數據this.controller.loadUrl(); // ??重啟加載
})
8?? onDisAppear:組件退休派對🎭

組件卸載時自動清理資源:

.onDisAppear(() => {promptAction.showToast({ message: '網頁已隱藏👋', duration:2000 });releaseMemory(); // 🧹內存清理
})

? 四、性能優化三板斧(附監控代碼)

Web組件直接提供三大核心性能指標回調:

📊 性能指標對照表
指標名含義業務價值監控代碼
FCP首次內容繪制時間用戶感知速度??onFirstContentfulPaint
FMP首次有效繪制時間核心內容可見性👁?onFirstMeaningfulPaint
LCP最大內容渲染時間頁面填充完成度📏onLargestContentfulPaint

實戰監控代碼:

.onFirstContentfulPaint(event => {console.log(`🚩FCP指標:${event.firstContentfulPaintMs}ms`);
})
.onFirstMeaningfulPaint(event => {console.log(`🚀FMP指標:${event.firstMeaningfulPaintMs}ms`);
})
.onLargestContentfulPaint(event => {console.log(`📌LCP指標:${event.largestContentfulPaintMs}ms`);
})

🧩 五、完整組件代碼示例

// WebComponent.ets
import { webview, Header, WebResourceResponse } from '@kit.ArkWeb';@Entry
@Component
struct MyWebView {controller: webview.WebviewController = new webview.WebviewController();build() {Column() {Web({ src: $rawfile('index.html'),controller: this.controller }).onControllerAttached(() => { /* 控制器綁定 */ }).onPageBegin(() => { /* 加載開始 */ }).onFirstContentfulPaint(() => { /* FCP監控 */ })// ...其他回調掛載}}
}

🚀 六、前端頁面最佳實踐

<!-- index.html -->
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><!-- 重要提示:預加載關鍵資源 --><link rel="preload" href="main.css" as="style">
</head>
<body><!-- 首屏優先展示內容 --><h1 data-fcp-marker>歡迎使用ArkWeb!</h1><!-- 延遲加載非核心資源 --><script defer src="analytics.js"></script>
</body>
</html>

💎 重點總結表

階段關鍵回調業務操作建議常見坑點
初始化aboutToAppear()調試模式/Cookie設置禁止操作網頁元素
控制器綁定onControllerAttached注入JS對象/設置UA避免調用網頁操作API
加載中onPageBegin+onProgress展示加載動畫多frame進度不同步
加載完成onPageEnd執行JS腳本/埋點上報DOM可能未完成渲染
異常處理onRenderExited崩潰恢復/數據保存需主動重啟加載
性能監控onFCP/onFMP/onLCP速度指標上報注意設備性能差異

? 終極提示:使用onPageVisible預加載次級資源,用onDisAppear釋放內存,讓你的Web組件絲滑如德芙🍫!


如有問題歡迎在評論區砸場子 👇

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

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

相關文章

【Java學習筆記】集合介紹

集合 > > 集合的引出 在之前常使用數組存儲數據&#xff0c;存在的問題如下&#xff1a; &#xff08;1&#xff09;初始化時&#xff0c;長度必須指定&#xff0c;而且一旦指定&#xff0c;不能更改 &#xff08;2&#xff09;不方便擴容&#xff08;使用循環復制原…

電流傳感器在汽車中的應用:從BMS電池管理到電機控制的工程解析

1 電流傳感器&#xff1a;汽車電子系統的神經末梢 在現代汽車電子架構中&#xff0c;電流傳感器已從簡單的測量元件演變為??關鍵的安全與性能組件??。作為動力系統的“神經末梢”&#xff0c;它們持續采集電流參數并反饋至控制單元&#xff0c;構成??實時閉環控制的基礎…

積分商城拼團系統框架設計

一、邏輯分析 用戶相關邏輯 用戶注冊與登錄&#xff1a;用戶需要注冊賬號才能參與積分商城拼團活動。注冊過程中需收集必要信息&#xff0c;如用戶名、密碼、聯系方式等。登錄功能則用于驗證用戶身份&#xff0c;方便用戶后續操作。用戶積分管理&#xff1a;用戶通過各種途徑&a…

java 數據結構-HashMap

一、hashmap特點 1、HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。 2、HashMap 實現了 Map 接口,根據鍵的 HashCode 值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。 3、HashMap 是無序的,即不會記錄插入的順序。 4、HashMa…

DBSyncer:一款開源的數據同步工具

DBSyncer&#xff08;簡稱 dbs&#xff09;是一款開源的實時數據同步中間件&#xff0c;提供 MySQL、Oracle、SQL Server、PostgreSQL、SQLite、Elasticsearch、Kafka、File、SQL 數據庫等同步場景&#xff1b;支持上傳插件自定義同步轉換業務&#xff1b;提供監控全量和增量數…

大型語言模型的中毒攻擊的系統評價

大家讀完覺得有幫助記得及時關注和點贊&#xff01;&#xff01;&#xff01; 抽象 隨著預訓練大型語言模型 &#xff08;LLM&#xff09; 及其訓練數據集的廣泛使用&#xff0c;人們對與其使用相關的安全風險的擔憂顯著增加。 這些安全風險之一是 LLM 中毒攻擊的威脅&#xff…

Windows 10更新失敗解決方法

前言 在我們使用 Windows 時的時候&#xff0c;很多時候遇到系統更新 重啟之后卻一直提示“我們無法完成更新&#xff0c;正在撤銷更改” 這種情況非常煩人&#xff0c;但其實可以通過修改文件的方法解決&#xff0c;并且正常更新到最新版操作系統 01修改注冊表 管理員身份…

Redis高級|Redis單線程VS多線程(基礎)

文章目錄 面試題Redis為什么選擇單線程為什么逐漸加入多線程特性Redis6、Redis7的多線程特性和IO多路復用入門Redis7多線程 面試題 Redis到底是單線程還是多線程&#xff1f;IO多路復用聽說過嗎&#xff1f;Redis為什么這么快&#xff1f; Redis為什么選擇單線程 其實Redis單…

ONLYOFFICE 的AI技巧-1.集成OCR、文本轉圖像、電子表格集成等新功能

隨著人工智能不斷革新數字辦公空間&#xff0c;我們通過全新的 ONLYOFFICE AI 插件再次實現突破。無論您是長期用戶還是新手&#xff0c;這些更新都將讓您的文檔處理更加智能、直觀且高效。讓我們一起來了解這些最新增強功能——部分功能已在 ONLYOFFICE 文檔 8.3.3 版本中上線…

Snipaste:一款簡單強大的跨平臺截圖工具

給大家介紹一款我在日常寫作中使用的截圖工具&#xff1a;Snipaste 。它是一個支持截圖&#xff08;Snip&#xff09;和貼圖&#xff08;Paste&#xff09;功能的免費軟件&#xff0c;支持 Windows、macOS、Linux 跨平臺。 智能截圖 Snipaste 提供了強大的截圖功能&#xff0c…

python學習打卡day52

DAY 52 神經網絡調參指南 知識點回顧&#xff1a; 隨機種子內參的初始化神經網絡調參指南 參數的分類調參的順序各部分參數的調整心得 作業&#xff1a;對于day41的簡單cnn&#xff0c;看看是否可以借助調參指南進一步提高精度。 day41的簡單CNN最后的結果&#xff0c;今天要做…

自定義線程池 4.0

自定義線程池 4.0 1. 簡介 上次我們實現了自定義線程池的 3.1 版本&#xff0c;提供了線程工廠創建線程和工具類創建簡單線程池的功能&#xff0c;增強了線程池的靈活性&#xff0c;并且用起來更加方便了&#xff0c;本文我們將做如下的優化&#xff1a; 給線程池添加關閉的…

list is not in GROUPBY clause and contains nonaggregated column ‘*.*‘

SELECT list is not in GROUP BY clause and contains nonaggregated column mydb.t.address which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 關于查詢列不在分組字段內觸發錯誤 之前我一直使用其…

Linux vmware image iso qcow2鏡像大全

Download Linux VMware Images | Linux VMware Images

城市排水管網液位流量監測系統解決方案

一、方案背景 城市排水管網作為城市的“生命線”&#xff0c;其運行狀況直接關系到城市的防洪排澇、水環境質量以及居民的生活質量。隨著城市化進程的加速&#xff0c;城市排水管網規模不斷擴大&#xff0c;結構日益復雜&#xff0c;傳統的人工巡檢和簡單監測手段已難以滿足對排…

算法學習筆記:3.廣度優先搜索 (BFS)——二叉樹的層序遍歷

什么是廣度優先搜索 (BFS)? 想象一下你在玩一個迷宮游戲&#xff0c;你需要找到從起點到終點的最短路徑。廣度優先搜索 (BFS) 就像是你在迷宮中逐層探索的過程&#xff1a; 先探索距離起點最近的所有位置然后探索距離起點第二近的所有位置以此類推&#xff0c;直到找到終點 …

并發編程-Synchronized

Mark Word 什么是Mark Word&#xff1f; Mark Word是Java對象頭中的一個字段&#xff0c;它是一個32位或64位的字段&#xff08;取決于系統架構&#xff09;&#xff0c;用于存儲對象的元數據信息。這些信息包括對象的哈希碼、鎖狀態、年齡等。 Mark Word有什么用&#xff1f…

【51單片機】5. 矩陣鍵盤與矩陣鍵盤密碼鎖Demo

1. 矩陣鍵盤原理 通過矩陣連接的模式&#xff0c;原本需要16個引腳連接的按鈕只需要8個引腳就能連接好&#xff0c;減少了I/O口的占用。 矩陣按鈕是通過掃描來讀取狀態的。 2. 掃描的概念 輸出掃描示例&#xff1a;數碼管掃描 原理&#xff1a;顯示第1位→顯示第2位→顯示第…

Android Studio jetpack compose折疊日歷日期選擇器【折疊日歷】

今天寫一個日期選擇器&#xff0c;大家根據自己需求改代碼&#xff0c;記得點贊支持&#xff0c;謝謝&#xff5e; 這是進入的默認狀態 折疊狀態選中本周其他日期狀態 切換上下周狀態 展開日歷狀態 切換上下月狀態 選中狀態 代碼如下&#xff1a; import android.content.C…

馭碼CodeRider 2.0全棧開發實戰指南:從零構建現代化電商平臺

馭碼CodeRider 2.0全棧開發實戰指南:從零構建現代化電商平臺 一、CodeRider 2.0:重新定義全棧智能開發 1.1 革命性升級亮點 #mermaid-svg-AKjytNB4hD95UZtF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AKjyt…