HarmonyOS 鸿蒙Next中url加载

HarmonyOS 鸿蒙Next中url加载 优化Web组件实时加载部分url的时间过长问题

5 回复

【背景知识】

加速Web页面的访问:当Web页面加载缓慢时,可以使用预连接、预加载和预获取post请求的能力加速Web页面的访问。

【问题定位】

对于Web组件加载缓慢优化的思路:

  1. 可以使用预连接、预加载、预获取post请求的能力和预编译生成编译缓存加速Web页面的访问。
  2. 可以通过模板快载来优化加载速度。

【分析结论】

  1. 可以使用预连接、预加载、预获取post请求的能力和预编译生成编译缓存加速Web页面的访问。
  2. 可以通过模板快载来优化加载速度。

【修改建议】

  • 预解析和预连接

可以通过prepareForPageLoad()来预解析或者预连接将要加载的页面,Ability的onCreate中提前初始化Web内核并对首页进行预连接,示例代码如下:

// xxx.ets
import { webview } from '@kit.ArkWeb';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    console.info("EntryAbility onCreate");
    webview.WebviewController.initializeWebEngine();
    // 预连接时,需要將'https://www.example.com'替换成真实要访问的网站地址。
    webview.WebviewController.prepareForPageLoad("https://www.example.com/", true, 2);
    AppStorage.setOrCreate("abilityWant", want);
    console.info("EntryAbility onCreate done");
  }
}
  • 预加载

能够预测到Web组件将要加载的页面或者即将要跳转的页面。可以通过prefetchPage()来预加载即将要加载的页面。预加载会提前下载页面所需的资源,包括主资源、子资源,但不会执行网页JavaScript代码。预加载是WebviewController的实例方法,需要一个已经关联好Web组件的WebviewController实例。在下面的示例中,在onPageEnd的时候触发下一个要访问的页面的预加载:

// xxx.ets
import { webview } from '@kit.ArkWeb';

@Entry
@Component
struct WebComponent {
  webviewController: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      Web({ src: 'https://www.example.com/', controller: this.webviewController })
        .onPageEnd(() => {
          // 预加载https://www.example.com/
          this.webviewController.prefetchPage('https://www.example.com/');
        })
    }
  }
}
  • 预获取post请求

可以通过prefetchResource()预获取将要加载页面中的post请求。在页面加载结束时,可以通过clearPrefetchedResource清除后续不再使用的预获取资源缓存。以下示例,在Web组件onAppear中,对要加载页面中的post请求进行预获取。在onPageEnd中,可以清除预获取的post请求缓存:

// xxx.ets
import { webview } from '@kit.ArkWeb';

@Entry
@Component
struct WebComponent {
  webviewController: webview.WebviewController = new webview.WebviewController();
   
  build() {
    Column() {
      Web({ src: "https://www.example.com/", controller: this.webviewController})
        .onAppear(() => {
          // 预获取时,需要將"https://www.example1.com/post?e=f&g=h"替换成真实要访问的网站地址。
          webview.WebviewController.prefetchResource(
            {url:"https://www.example1.com/post?e=f&g=h",
              method:"POST",
              formData:"a=x&b=y",},
            [{headerKey:"c",
              headerValue:"z",},],
            "KeyX", 500);
        })
        .onPageEnd(() => {
          // 清除后续不再使用的预获取资源缓存。
          webview.WebviewController.clearPrefetchedResource(["KeyX",]);
        })
    }
  }
}
  • 预编译生成编译缓存

可以通过precompileJavaScript()在页面加载前提前生成脚本文件的编译缓存。推荐配合动态组件使用,使用离线的Web组件用于生成字节码缓存,并在适当的时机加载业务用Web组件使用这些字节码缓存。

参考代码如下:

// 载体Ability
// EntryAbility.ets
import { createNWeb } from "../pages/common"

onWindowStageCreate(windowStage:window.WindowStage):
void {
   windowStage.loadContent('pages/Index',(err,data)=>{
   // 创建Web动态组件(需传入UIContext),loadContent之后的任意时机均可创建
   createNWeb
   (
   "https://www.example.com",
   windowStage.getMainWindowSync().getUIContext());
   if(err.code){
   return;
   }
  }
 );
}
// 使用NodeController的Page页
// Index.ets
import { getNWeb } from "./common"

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        // NodeContainer用于与NodeController节点绑定,rebuild会触发makeNode
        // Page页通过NodeContainer接口绑定NodeController,实现动态组件页面显示
        NodeContainer(getNWeb("https://www.example.com"))
          .height("90%")
          .width("100%")
      }
      .width('100%')
    }
    .height('100%')
  }
}

注意: 后台启动的Web实例不建议超过200个。

更多关于HarmonyOS 鸿蒙Next中url加载的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


那如何优化的呢[捂脸哭]

很不错

在HarmonyOS Next中,URL加载主要通过WebView组件实现。开发者需导入@ohos.web.webview模块,使用loadUrl()方法加载指定网页地址。示例代码:webview.loadUrl("https://example.com")。该过程支持配置缓存、JavaScript等参数,无需依赖Java或C语言。

针对HarmonyOS Next中Web组件URL加载时间过长的问题,建议从以下方面进行优化:

  1. 预加载机制:对可预测的URL提前进行DNS解析和资源缓存,减少实际加载时的网络延迟。

  2. 资源压缩:启用Gzip压缩,减小传输数据量;对图片进行WebP格式转换,优化资源大小。

  3. 缓存策略:合理设置HTTP缓存头,利用本地缓存减少重复请求。

  4. 并行加载:通过多线程技术并行加载页面资源,提升整体加载效率。

  5. 懒加载优化:对非首屏内容实现懒加载,优先保证核心内容快速呈现。

  6. 网络状态检测:根据当前网络质量动态调整资源加载策略,弱网环境下采用降级方案。

建议在Web组件的onProgressChange回调中监控加载进度,结合性能分析工具定位具体瓶颈。可通过减少重定向、合并资源请求等方式进一步提升性能。

回到顶部