鸿蒙中 hsp包和har包的页面跳转
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、鸿蒙应用开发中,HAR(静态共享包)和HSP(动态共享包)间的页面跳转,有着不同的路径配置规则和依赖管理方式。
| 特性 | HAR(静态共享包) | HSP(动态共享包) |
|---|---|---|
| 核心跳转方式 | 命名路由 (pushNamedRoute) |
完整Bundle路径 (pushUrl) |
| 路径格式 | 路由名 (如 'MainPage') |
'@bundle:包名/模块名/路径/页面名' |
| 前置配置 | 在HAR页面使用 @Entry({routeName: '页面名'}) |
确保HSP模块已正确配置并随主包部署 |
| 适用场景 | 依赖关系清晰、需要避免循环依赖的模块间跳转 | 需要运行时动态加载、模块独立性要求高的场景 |
二、HAR包页面跳转
HAR包的页面跳转主要依赖命名路由。
-
配置HAR页面:在HAR包中,跳转的页面组件使用
@Entry({routeName: '路由名'})进行装饰。
// 在HAR包的页面文件中
@Entry({ routeName: 'StaticPage' }) // 定义命名路由
@Component
export struct StaticPage {
// 页面代码
}
2. 跳转到HAR页面:在需要跳转的地方,使用router.pushNamedRoute()方法,并指定在HAR中定义的路由名
import router from '@ohos.router';
//导入页面文件
import "library_static/src/main/ets/components/StaticPage" //静态导入
//import('library_static/src/main/ets/components/StaticPage') //也可以动态导入
// 在Entry或Feature模块中跳转
router.pushNamedRoute({
name: 'StaticPage', // 与HAR中定义的路由名一致
params: { key: 'value' } // 可选参数
})
备注:HAR包页面不能直接使用pushUrl跳转,必须采用命名路由方式
三、HSP包页面跳转
HSP包的页面跳转则必须使用完整的Bundle路径。
-
跳转到HSP页面:使用
router.pushUrl()方法,其中url参数需严格按照'@bundle:包名(bundleName)/模块名(moduleName)/路径/页面所在的文件名(不加.ets后缀)'的格式编写
import router from '@ohos.router';
// 从Entry或Feature模块跳转到HSP页面
const bundleName = (getContext(this) as common.UIAbilityContext).applicationInfo.name;
router.pushUrl({
url: `@bundle:${bundleName}/library/ets/pages/SharedPage` // 完整的Bundle路径
}).then(() => {
// 跳转成功回调
}).catch(err => {
// 跳转失败处理
console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
})
注意:HSP中的页面同样需要使用@Entry装饰器,不需要routeName参数(其实也可以按照命名路由方式跳转)。
HSP内的相互跳转及返回
-
HSP跳转到HSP:同样使用上述的完整Bundle路径格式。
-
HSP内返回:使用
router.back()。如果需要返回到特定的HAP页面,url可以写为'pages/Index'这样的相对路径;如果返回HSP页面,则需要使用完整的Bundle路径。
总结
| 特性 | HAR 包跳转 | HSP 包跳转 |
|---|---|---|
| 依赖时机 | 编译时依赖 | 运行时依赖 |
| 是否需要导入 | 必须导入目标页面 | 无需导入目标页面 |
| 跳转方式 | pushNamedRoute({name: '路由名'}) |
pushUrl({url: '完整路径'}) |
| 路径配置 | 使用路由名称 | 使用完整Bundle路径 |
| 类型安全 | 编译时类型检查 | 运行时解析,无编译时类型检查 |
| 耦合度 | 紧耦合(编译时需要) | 松耦合(运行时解析) |
建议:
- 简单跳转推荐命名路由方案,代码更简洁
- route页面栈最大容量为32个页面,超出需要调用
clear()方法清理 - 需要复杂页面栈管理时推荐Navigation方案
- 若涉及多HAP跳转,建议改用HSP动态共享包
更多推荐




所有评论(0)