Web组件显示网页时往往会经历四个阶段:无反馈–>白屏–>网页渲染–>完全展示,系统会在各个阶段内分别进行WebView初始化、建立网络连接、接收数据与渲染页面等操作,详细的Web组件生命周期介绍可参考官网资料:Web组件的生命周期。
因此要优化页面加载,可以从以下几个方面进行:
- WebView初始化阶段:应用打开WebView的第一步是启动浏览器内核,而这段时间由于WebView还不存在,所有后续的步骤是完全阻塞的。因此可以考虑在应用中预先完成初始化WebView,以及在初始化的同时通过预先加载组件内核、完成网络请求等方法,使得WebView初始化不是完全的阻塞后续步骤,从而减小耗时。
- 在建立连接阶段:如果能提前知道要访问的网页地址,我们可以预先建立连接,进行DNS预解析。
- 在接收资源数据阶段:当应用预先知道下一页会点击什么页面的时候,可以合理使用缓存和预加载,将该页面的资源提前下载到缓存中。
方案一:在Web组件初始化之前,通过initializeWebEngine接口加载Web引擎的动态库文件,以提高启动性能。自动预连接历史访问过的高频网站。具体步骤如下:
在 Ability 创建阶段完成 Web 组件动态库加载:
// EntryAbility.ets
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { webview } from '@kit.ArkWeb';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
webview.WebviewController.initializeWebEngine();
}
}
在页面中使用Web组件:
// Index.ets
import { webview } from '@kit.ArkWeb';
import { hiTraceMeter } from '@kit.PerformanceAnalysisKit';
@Entry
@Component
struct Index {
controller: webview.WebviewController = new webview.WebviewController();
build() {
Column() {
Web({ src: 'https://www.example.com/example.html', controller: this.controller })
.fileAccess(true)
.onPageBegin(() => {
// 性能打点
hiTraceMeter.startTrace('getMessageData', 0);
})
.onPageEnd(() => {
// 性能打点
hiTraceMeter.finishTrace('getMessageData', 0);
})
}
}
}
方案二:在页面加载之前调用prepareForPageLoad接口对url提前进行dns解析,socket建链操作,并不获取主资源子资源,进而优化资源的加载过程。参考代码如下:
开启预连接需要先使用上述方法预加载WebView内核。
webview.WebviewController.initializeWebEngine();
// 启动预连接,连接地址为即将打开的网址。
webview.WebviewController.prepareForPageLoad("https://www.example.com", true, 2);
方案三:通过prefetchPage方法在onPageEnd阶段进行预加载,当真正去加载下一个页面的时候,如果预加载已经成功,则相当于直接从缓存中加载页面资源,速度更快。一般来说能够准确预测到用户下一步要访问的页面的时候,可以进行预加载将要访问的页面,比如小说下一页, 浏览器在地址栏输入过程中识别到用户将要访问的页面等。
// src/main/ets/pages/WebBrowser.ets
import { webview } from '@kit.ArkWeb';
@Entry
@Component
struct Index {
controller: webview.WebviewController = new webview.WebviewController();
build() {
Column({space: 10}) {
Web({ src: 'https://www.example.com', controller: this.controller })
.onPageEnd((event) => {
// 在确定即将跳转的页面时开启预加载
this.controller.prefetchPage('https://www.example.com/nextpage');
})
.width(300)
.height(300)
Button('下一页')
.onClick(() => {
// 跳转下一页
this.controller.loadUrl('https://www.example.com/nextpage');
})
.width(300)
.height(30)
}
.width('100%')
}
}
更多关于如何优化H5页面在HarmonyOS鸿蒙Next上的性能?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
官方文档有不少关于ArkWeb性能优化的介绍:
使用离线Web组件/预渲染
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-offline-mode
Web开发(ArkWeb)
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkweb-kit-V5
现在web性能都不差啊,为啥要优化