HarmonyOS 预加载WebView

为了提高H5页面打开速度,我们设计了H5预加载。

需要提前加载若干个高频h5页面,这样用户打开预加载页面做到秒开

目前webView必须写在build函数中才能实例化,是否可以提供手动实例化方法

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

web支持动态加载,参考文档:https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-web-develop-optimization-V5#section172031338172719

// 载体Ability
// EntryAbility.ets
import {createNWeb} from "../pages/common"
onWindowStageCreate(windowStage: window.WindowStage): void {
  windowStage.loadContent('pages/Index', (err, data) => {
  // 创建ArkWeb动态组件(需传入UIContext),loadContent之后的任意时机均可创建
  createNWeb("https://www.huawei.com", windowStage.getMainWindowSync().getUIContext());
  if (err.code) {
  return;
}
});
}

// 创建NodeController
// common.ets
import { UIContext } from '@kit.ArkUI';
import { webview } from '@kit.ArkWeb';
import { NodeController, BuilderNode, Size, FrameNode } from '@kit.ArkUI';
// @Builder中为动态组件的具体组件内容
// Data为入参封装类
class Data {
  url: string = "https://www.huawei.com";
  controller: WebviewController = new webview.WebviewController();
}

@Builder
function WebBuilder(data:Data) {
  Column() {
    Web({ src: data.url, controller: data.controller })
      .width("100%")
      .height("100%")
  }
}

let wrap = wrapBuilder<Data[]>(WebBuilder);

// 用于控制和反馈对应的NodeContainer上的节点的行为,需要与NodeContainer一起使用
export class myNodeController extends NodeController {
  private rootnode: BuilderNode<Data[]> | null = null;
  // 必须要重写的方法,用于构建节点数、返回节点挂载在对应NodeContainer中
  // 在对应NodeContainer创建的时候调用、或者通过rebuild方法调用刷新
  makeNode(uiContext: UIContext): FrameNode | null {
    console.log(" uicontext is undifined : "+ (uiContext === undefined));
    if (this.rootnode != null) {
      // 返回FrameNode节点
      return this.rootnode.getFrameNode();
    }
    // 返回null控制动态组件脱离绑定节点
    return null;
  }
  // 当布局大小发生变化时进行回调
  aboutToResize(size: Size) {
    console.log("aboutToResize width : " + size.width + " height : " + size.height )
  }

  // 当controller对应的NodeContainer在Appear的时候进行回调
  aboutToAppear() {
    console.log("aboutToAppear")
  }

  // 当controller对应的NodeContainer在Disappear的时候进行回调
  aboutToDisappear() {
    console.log("aboutToDisappear")
  }

  // 此函数为自定义函数,可作为初始化函数使用
  // 通过UIContext初始化BuilderNode,再通过BuilderNode中的build接口初始化@Builder中的内容
  initWeb(url:string, uiContext:UIContext, control:WebviewController) {
    if(this.rootnode != null)
    {
      return;
    }
    // 创建节点,需要uiContext
    this.rootnode = new BuilderNode(uiContext)
    // 创建动态Web组件
    this.rootnode.build(wrap, { url:url, controller:control })
  }
}
// 创建Map保存所需要的NodeController
let NodeMap:Map<string, myNodeController | undefined> = new Map();
// 创建Map保存所需要的WebViewController
let controllerMap:Map<string, WebviewController | undefined> = new Map();

// 初始化需要UIContext 需在Ability获取
export const createNWeb = (url: string, uiContext: UIContext) => {
  // 创建NodeController
  let baseNode = new myNodeController();
  let controller = new webview.WebviewController() ;
  // 初始化自定义web组件
  baseNode.initWeb(url, uiContext, controller);
  controllerMap.set(url, controller)
  NodeMap.set(url, baseNode);
}
// 自定义获取NodeController接口
export const getNWeb = (url : string) : myNodeController | undefined => {
  return NodeMap.get(url);
}

// 使用NodeController的Page页
// Index.ets
import {createNWeb, getNWeb} from "./common"
@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        // NodeContainer用于与NodeController节点绑定,rebuild会触发makeNode
        // Page页通过NodeContainer接口绑定NodeController,实现动态组件页面显示
        NodeContainer(getNWeb("https://www.huawei.com"))
          .height("90%")
          .width("100%")
      }
      .width('100%')
    }
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 加载失败
31浏览 • 1回复 待解决
HarmonyOS AGC加载服务
59浏览 • 1回复 待解决
HarmonyOS Tabs怎么实现加载
76浏览 • 1回复 待解决
HarmonyOS ArkWeb加载能力文档
33浏览 • 1回复 待解决
HarmonyOS加载Image组件的图片
542浏览 • 1回复 待解决
如何对网页进行加载
601浏览 • 1回复 待解决
TabContent组件是否支持加载
1743浏览 • 1回复 待解决
HarmonyOS Web组件渲染加载不正常
74浏览 • 1回复 待解决
Web组件中的加载,如何实现?
1386浏览 • 1回复 待解决
HarmonyOS webview加载与交互
24浏览 • 1回复 待解决
HarmonyOS WebView 延迟加载图片
114浏览 • 1回复 待解决
HarmonyOS webview加载数据问题
35浏览 • 1回复 待解决
HarmonyOS webview加载url白屏
61浏览 • 1回复 待解决
HarmonyOS webview加载不出网页
49浏览 • 1回复 待解决
HarmonyOS webview加载很耗时
30浏览 • 1回复 待解决
HarmonyOS webview加载页面空白
44浏览 • 1回复 待解决
HarmonyOS webview加载本地html问题
529浏览 • 1回复 待解决
HarmonyOS 如何监听Webview加载失败
35浏览 • 1回复 待解决
HarmonyOS webview加载速度 性能优化
114浏览 • 1回复 待解决
HarmonyOS WebView加载url无法滚动
91浏览 • 1回复 待解决