当前位置: 首页 > news >正文

HarmonyOS ArkWeb 系列之动态组件预创建:提前准备好 Web 实例,打开即渲染

文章目录

    • 大白话讲原理
    • 流程图
    • 核心代码
      • DynamicComponent.ets — 组件创建与管理
      • BusinessWebview.ets — 业务 Web 组件定义
      • 业务页面 — 使用预创建组件
    • 注意事项

前面讲的预连接、预获取,都是在网络层面优化。但 Web 组件本身的初始化也需要时间——创建内核、解析 HTML、布局渲染。动态组件预创建让你提前把 Web 实例准备好,用户打开时直接展示已渲染的内容。

大白话讲原理

想象一下餐厅备餐:

  • 没有预创建:顾客点餐 → 厨师开始备料 → 烹饪 → 上菜(等很久)
  • 有预创建:提前备好菜 → 顾客点餐 → 直接上菜

动态组件预创建就是让 Web 实例在"后台"默默初始化,等用户需要时,把已经准备好的实例"端上去"显示。

流程图

核心代码

DynamicComponent.ets — 组件创建与管理

// DynamicComponent.etsimport{webview}from'@kit.ArkWeb';import{NodeController,BuilderNode,FrameNode,UIContext}from'@kit.ArkUI';exportinterfaceBuilderData{url:string;controller:webview.WebviewController;context:UIContext;}// 存储预创建的节点constpreloadNodeMap=newMap<string,BuilderNode<BuilderData[]>>();exportclassWebNodeControllerextendsNodeController{privatebuilderNode:BuilderNode<BuilderData[]>|null=null;constructor(node:BuilderNode<BuilderData[]>){super();this.builderNode=node;}makeNode(uiContext:UIContext):FrameNode|null{returnthis.builderNode?.getFrameNode()??null;}}// 预创建 Web 实例(后台)exportfunctioninitWebComponent(url:string,webBuilder:WrappedBuilder<BuilderData[]>,uiContext:UIContext):void{if(preloadNodeMap.has(url))return;// 已预创建,不重复constcontroller=newwebview.WebviewController();constbuilderNode=newBuilderNode<BuilderData[]>(uiContext);builderNode.build(webBuilder,{url,controller,context:uiContext});preloadNodeMap.set(url,builderNode);}// 获取预创建的 NodeControllerexportfunctiongetPreloadNodeController(url:string):WebNodeController|null{constnode=preloadNodeMap.get(url);returnnode?newWebNodeController(node):null;}

BusinessWebview.ets — 业务 Web 组件定义

// BusinessWebview.etsimport{BuilderData}from'./DynamicComponent';@BuilderfunctionwebBuilder(data:BuilderData){Web({src:data.url,controller:data.controller}).cacheMode(CacheMode.Default)}exportconstbusinessWebview=wrapBuilder<BuilderData[]>(webBuilder);

业务页面 — 使用预创建组件

// Index.etsimport{webview}from'@kit.ArkWeb';import{initWebComponent,getPreloadNodeController,WebNodeController}from'./DynamicComponent';import{businessWebview}from'./BusinessWebview';@Entry@Componentstruct BusinessPage{@StatenodeController:WebNodeController|null=null;privatetargetUrl:string='https://www.example.com';aboutToAppear():void{// 确保预创建完成initWebComponent(this.targetUrl,businessWebview,this.getUIContext());// 获取预创建节点this.nodeController=getPreloadNodeController(this.targetUrl);}build(){Column(){if(this.nodeController){// 挂载预创建的 Web 实例,直接显示已渲染内容NodeContainer(this.nodeController).width('100%').height('100%')}else{// 降级:正常创建Web({src:this.targetUrl,controller:newwebview.WebviewController()}).width('100%').height('100%')}}.width('100%').height('100%')}}

注意事项

  1. BuilderNode依赖UIContext,必须在onWindowStageCreate之后才能创建
  2. 预创建的组件持续占用内存,不再需要时应及时释放
  3. 同一 URL 只预创建一次,避免重复创建浪费资源
  4. 后台加载的页面不可见,不会触发onPageVisible
http://www.jsqmd.com/news/840635/

相关文章:

  • 从理论到实践:一阶数字低通滤波器在Matlab中的设计与实现
  • 书匠策AI官网www.shujiangce.com|别再被查重报告支配了!这款降重神器我真的后悔没早发现
  • 从零到交付:NotebookLM讨论部分写作全流程,含7类学术/商业场景模板+Prompt库
  • 自动驾驶数据闭环的基石:Auto-labeling 系统架构与工程实践
  • 如何快速解决Windows苹果设备连接问题:专业驱动安装完整指南
  • Claude Code交互式提示词:让AI听懂你的10个技巧
  • PC16550 C语言版本(适用于8088单板机小型C编译器)
  • ETF投资组合优化——Excel实现风险平价与均值方差模型实战
  • 如何三分钟上手iOS游戏修改:H5GG脚本引擎终极指南
  • 从API密钥管理与访问控制角度评估Taotoken的企业级安全特性
  • 地理围栏 PDF 钓鱼与 Cobalt Strike 攻击链分析 —— 以 Ghostwriter 针对乌克兰政府攻击为例
  • 3分钟搞定HS2汉化:Honey Select 2中文补丁一键安装终极指南
  • 中小团队如何利用 Taotoken 统一管理多个 AI 项目的 API 密钥与用量
  • 无电池无线智能纺织传感系统设计与实现
  • 优峰技术:可调谐激光光源选型与采购指南,深圳优峰技术 EXFO 代理优势解析
  • 弃用ChatGPT和Midjourney半年后,我在办公室摆了台AI超算,这笔账算下来惊了
  • VSCode导出PDF样式太丑?手把手教你自定义CSS,让技术简历和报告瞬间专业
  • 2003-2025年政府数字化建设指数
  • 对比直接使用官方API体验Taotoken在路由容灾上的稳定性
  • 华为云IoT设备激活后,如何玩转数据上下行?一个完整的数据流闭环实践
  • 从裸机到微内核:8088单板机微型操作系统规划设计
  • 国内AI搜索优化广告服务公司实力排行盘点 - 奔跑123
  • Ultra96-V2裸机开发实战:从零构建最小系统
  • 基于Python的Telegram Bot开发:模块化设计与自动化任务集成
  • 基于树形结构的代码知识库系统设计与实现
  • 陕西AI搜索优化广告公司排行:全域营销能力实测对比 - 奔跑123
  • MoocDownloader:三步构建个人专属离线学习库的完整指南
  • STC15W4K系列单片机入门指南:从核心特性到上手实践
  • 3步搞定Windows安装Android应用:告别模拟器的终极解决方案
  • MySQL 8.0.34安装选‘传统认证’还是‘强加密’?一次讲清区别和实际影响